jquery .one() 计算是否检查每个事件?



因此增加了一点计算负载

对于那些不熟悉.one(( jquery函数的人来说,它基本上只触发一次事件。例如,如果您想在第一次滚动页面时添加div。

为了介绍此事的背景,我遇到了这个问题:

第一次使用 javascript 仅滚动页面时如何发出警报?

我曾经参与过一些项目,我不得不添加数百或数千个事件,所以对我来说,优化计算能力总是非常重要,而且,我是一个好奇的人,所以我只需要知道。

这家伙使用vanilla javascript的答案之一基本上是一个无限循环,你在第一个实例上切换一个布尔值,基本上必须不断输入函数以查看它是否已经被触发。

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

我的想法是,jquery在页面上已经很重了,它可能只是在引擎盖下执行相同的操作,但我想完全确定我未来的实现。

编号。 jQuery的.one的工作方式类似于:

  • 调用addEventListener,然后在回调中调用removeEventListener
  • 在选项对象中使用{ once: true }调用addEventListener
  • 在jQuery中,就像调用.on一样,然后在回调中调用.off

一旦侦听器运行一次,它就会被取消附加;当将来发生事件时,不会发生进一步的逻辑,因为侦听器根本不连接。

因此,.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事件。

最新更新