jQuery 的 .bind() 与 .on()

IT技术 javascript jquery jquery-selectors
2021-01-18 22:24:00

我发现了两篇关于新功能的很棒的文章.on()jquery4u.comelijahmanor.com

有什么方法.bind()比使用仍然更好.on()吗?

例如,我有一个如下所示的示例代码:

$("#container").click( function( e ) {} )

你可以注意到我只有一个被选择器检索到的项目,在我的例子中,当我的页面加载时<div>named#container已经存在;不是动态添加的。值得一提的是,我使用的是最新版本的 jQuery:1.7.2。

对于该示例,即使我不使用该函数提供的其他功能,也应该.on()使用它来代替.bind().on()

6个回答

在内部,.bind直接映射到.on当前版本的 jQuery。(同样适用于.live。)因此,如果您.bind改为使用,则会对性能造成微小但实际上无关紧要的影响

但是,.bind可以随时从未来版本中删除。没有理由继续使用.bind,也有理由更喜欢.on

@jbabey,虽然从技术上讲他们不一定删除任何功能,但他们仍然弃用它们并建议您不要使用它们。将来他们总是可以决定完全删除它们(就像他们从 2.x 版起删除某些 IE 支持一样)。不应使用已弃用的函数。
2021-03-16 22:24:00
可能——几乎没有理由删除它们,因为它们只是映射到现有函数。另一方面,按主版本号升级意味着您可以对 API 做任何事情,因为在这一点上不一定保证向后兼容性。只是在说'。
2021-03-19 22:24:00
打印“jQuery.fn.bind.toString()”输出“function (a,b,c){return this.on(a,null,b,c)}”
2021-03-24 22:24:00
@Esalija 这些函数都为处理特定类型的异步请求提供了有用的快捷方式。.bind并且.on对于非委托事件是相同的;.bind不提供任何形式的捷径像$.getJSON
2021-03-28 22:24:00
自 jQuery 3 起不推荐使用 bind 和 unbind。
2021-04-02 22:24:00

这些片段都执行完全相同的事情:

element.on('click', function () { ... });
element.bind('click', function () { ... });
element.click(function () { ... });

但是,它们与这些非常不同,它们都执行相同的操作:

element.on('click', 'selector', function () { ... });
element.delegate('click', 'selector', function () { ... });
$('selector').live('click', function () { ... });

第二组事件处理程序使用事件委托并将用于动态添加的元素。使用委托的事件处理程序的性能也更高。第一组不适用于动态添加的元素,而且性能更差。

jQuery 的on()函数没有引入任何尚不存在的新功能,它只是尝试标准化 jQuery 中的事件处理(您不再需要在实时、绑定或委托之间做出决定)。

我认为你的意思是$('selector').live('click', function () { ... });让结果尽可能保持相同。
2021-04-08 22:24:00

直接方法 和.delegate是高级 API,.on并且无意弃用它们。

直接方法更可取,因为您的代码将减少字符串类型。当您错误输入事件名称而不是静默错误时,您将立即收到错误消息。在我看来,它也更容易读写clickon("click"

.delegate优于.on由于参数的顺序:

$(elem).delegate( ".selector", {
    click: function() {
    },
    mousemove: function() {
    },
    mouseup: function() {
    },
    mousedown: function() {
    }
});

你马上就知道它是委托的,因为它说的是委托。您还可以立即看到选择器。

有了.on它不立即清除,如果它甚至委托,你必须看看到底该选择:

$(elem).on({
    click: function() {
    },
    mousemove: function() {
    },
    mouseup: function() {
    },
    mousedown: function() {
    }
}, "selector" );

现在,的命名.bind真的很糟糕,从表面上看比.on. 但是.delegate不能执行非委托事件,并且有些事件没有直接方法,因此在这种极少数情况下可以使用它,但这只是因为您想在委托事件和非委托事件之间进行明确分离。

从 jQuery 3.0 开始,.delegate()已被弃用。
2021-03-22 22:24:00

如果你查看源代码,$.fn.bind你会发现它只是一个重写函数on

function (types, data, fn) {
    return this.on(types, null, data, fn);
}

http://james.padolsey.com/jquery/#v=1.7.2&fn=$.fn.bind

从 jQuery 文档:

从 jQuery 1.7 开始, .on() 方法是将事件处理程序附加到文档的首选方法。对于早期版本, .bind() 方法用于将事件处理程序直接附加到元素。处理程序附加到 jQuery 对象中当前选定的元素,因此这些元素必须在调用 .bind() 时存在。要获得更灵活的事件绑定,请参阅 .on() 或 .delegate() 中事件委托的讨论。

http://api.jquery.com/bind/

请记住,文档的建议来自为您带来绑定、单击、实时、委托......以及所有由此产生的混乱的同一团队。在阅读了有关此问题的多个站点后,我认为最好和最准确的站点是将“on”描述为“糖衣”的站点,糖会吸引虫子,而委托是要走的路。
2021-04-03 22:24:00