jQuery的.bind()与.on()

时间:2012-08-07 13:24:15

标签: javascript jquery jquery-selectors

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

.bind()还有什么方法可以比.on()更好地使用?

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

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

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

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

6 个答案:

答案 0 :(得分:300)

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

但是,.bind可能会在以后的版本中被删除。没有理由继续使用.bind并且每个理由都更喜欢.on

答案 1 :(得分:53)

这些片段的表现完全相同:

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 () { ... });

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

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

答案 2 :(得分:10)

直接方法和.delegate.on的优质API,并且无意弃用它们。

直接方法更受欢迎,因为您的代码的字符串类型较少。错误输入时,您将立即收到错误消息 事件名称而不是无声的bug。在我看来,写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不能在那里进行非委托事件 是没有直接方法的事件,因此在极少数情况下可以使用它,但这只是因为您希望在委托事件和非委派事件之间进行清晰分离。

答案 3 :(得分:8)

如果您查看$.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

答案 4 :(得分:6)

来自jQuery文档:

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

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

答案 5 :(得分:3)

从Jquery 3.0及更高版本开始,.bind已被弃用,他们更喜欢使用.on。正如@Blazemonger先前回答的那样,它可能会被删除,并且肯定会将其删除。对于旧版本.bind也会在内部调用.on,它们之间没有区别。另请参阅api以获取更多详细信息。

jQuery API documentation for .bind()