Как предварять селектор только в первом матче?

Используя медиа-запросы, я создал навигационную панель, которая сворачивается, а мой логотип находится внизу. С enquire.js я добавлял последний li. Как я могу выполнить prepend только в первом совпадении, чтобы предотвратить переключение одного li, каждое совпадение вправо?

prependLogo : function() {

        query = "screen and (max-width: 979px)";
            handler = {
                match: function() {
                    $(.nav-collapse .nav).prepend($("li:last"));
                },

                unmatch : function() {

                },
            };

            enquire.register(query, handler);
    },

1 ответ

Есть два подхода к решению этой проблемы. Одним из них является использование Enquire's unregister метод. Другой заключается в использовании setup обратный вызов и deferSetup флаг.

setup обратный вызов вызывается только один раз. Обычно он вызывается сразу после регистрации запроса, но в сочетании с deferSetup флаг, установка откладывается до первого совпадения запроса (к сожалению, inquire ожидает, что всегда будет match обратный вызов, поэтому мы просто предоставим пустую функцию для этого):

enquire.register("screen and (max-width: 979px)", {
  setup : function() {
    $(.nav-collapse .nav).prepend($("li:last"));
  },
  deferSetup : true, 

  match : function() {}
});

unregister Метод делает, как вы могли ожидать, отменить регистрацию запроса. Если мы позвоним unregister из нашего обратного вызова мы можем достичь того же эффекта:

enquire.register("screen and (max-width: 979px)", {
  match : function() {
    $(.nav-collapse .nav).prepend($("li:last"));
    //note this unregisters *all* handlers for this mq (if you have more than one) 
    enquire.unregister("screen and (max-width: 979px)"); 
  }
});

Вот рабочий пример, демонстрирующий два подхода: http://codepen.io/WickyNilliams/pen/vFLEH

Кроме того, обратите внимание, что в приведенном выше коде вы не используете var ключевое слово для инициализации ваших переменных. Это плохая практика в JS, потому что любая переменная, объявленная без var привязан к глобальной области видимости, что, вероятно, не то, что вы хотите:)

Другие вопросы по тегам