jquery .one () проверяет каждое событие? - PullRequest
1 голос
/ 03 февраля 2020

И, следовательно, добавление вычислительной нагрузки ?

Для тех из вас, кто не знаком с функцией .one () jquery , она в основном вызывает событие только раз. Например, если вы хотите добавить div в первый раз, когда страница прокручивается.

Чтобы подвести итог, я наткнулся на вопрос:

Как предупредить, когда прокручивать страницу только в первый раз, используя javascript?

Я был в проектах, где мне приходилось добавлять сотни или тысячи событий, поэтому для меня всегда очень важно оптимизировать вычислительную мощность, плюс я Я любопытный человек, поэтому мне просто нужно знать.

Один из ответов, где парень использует ваниль javascript, в основном бесконечный l oop, где вы переключаете логическое значение в первом случае и в основном должны постоянно входите в функцию, чтобы увидеть, была ли она уже запущена.

var xxx; 

$(window).scroll(function () {

if(!xxx)
{
    xxx = true;
    var div = $("#myDiv");
    alert(div.height());
}
  });

Моя идея состоит в том, что jquery, будучи уже тяжелым на странице, вероятно, просто выполняет то же самое действие под капотом, но я хотел бы чтобы быть полностью уверенным относительно моих будущих реализаций.

1 Ответ

1 голос
/ 03 февраля 2020

Нет. jQuery .one работает аналогично, например:

  • , звонит addEventListener, а затем, в обратном вызове, звонит removeEventListener
  • , звонит addEventListener с { once: true } в объекте параметров
  • в jQuery, как при вызове .on, а затем, при обратном вызове, при вызове .off

Как только прослушиватель запускается один раз , он откреплен; дальнейшая логика c не происходит, когда событие происходит в будущем, потому что слушатель больше не подключен.

Таким образом, .one является очень легким для вычислительных ресурсов, даже если вы добавляете лоты и лоты .one с.

Вы можете увидеть исходный код one здесь :

    if (one === 1) {
        origFn = fn;
        fn = function (event) {

            // Can use an empty set, since event contains the info
            jQuery().off(event); // <-------------------------------------------------
            return origFn.apply(this, arguments);
        };

        // Use same guid so caller can remove using origFn
        fn.guid = origFn.guid || (origFn.guid = jQuery.guid++);
    }

    return elem.each(function () {
        jQuery.event.add(this, types, fn, data, selector);
    });

, где jQuery() возвращает jQuery коллекция, содержащая элементы, соответствующие текущему селектору. Когда вызывается one, обратный вызов переносится в другой, который вызывает .off, как только функция будет выполнена.

Пример кода в ответе, с которым вы связаны, совершенно неэффективен и не должен использоваться особенно для scroll событий, которые происходят очень часто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...