我是否错误地使用了Jquery.ready()



关于Jquery就绪事件块,文档说:

.ready()方法通常与属性不兼容。如果必须使用load,请不要使用.ready()或使用jQuery的.load()方法将load事件处理程序附加到窗口或更具体的项目(如图像)。

和这个

$(function() {
// Handler for .ready() called.
});

在Rails的coffeescript文件中,我倾向于遵循以下模式:

$ ->
$("body.controller_name").ready ->
$(".button_group").change (evt) ->
alert("do something")

如果我需要为将要创建的元素委派绑定,而该元素不在初始html中,我倾向于这样做。

$ ->
$("body.controller_name").ready ->
$('.button_group').change (evt) ->
alert("do something")

$(document).on 'change', '.button_group', (event) ->
alert("do something")

在查看turbulinks.jquery gem时,我遇到了以下注释:

/* BAD: don't bind 'document' events while inside $()! */
$(function() {
$(document).on('click', 'button', function() { ... })
});

所以这让我想知道,我一直都做错了吗?我应该避免在就绪块内使用$(document).on()吗?如果是这样,除了可能与turbulinks.jquery发生冲突之外,这是错误的原因吗?

那么,正确的模式是什么呢?我熟悉通过使用加载块而不是就绪块来等待资产加载,但我不确定我是否意识到我一直在做什么。

是,没有。

如果需要的话,没有理由避免在ready事件中绑定文档级别的事件。

但是,如果可以的话,你应该避免在文档级别绑定委托。你应该使用一个尽可能靠近事件发生地元素的元素。每当事件发生在您绑定的元素内时,它都必须检查发生事件的元素是否与选择器匹配,因此,如果您在文档级别上绑定委托,则必须对页面中任何位置发生的每个此类事件进行处理。

live方法确实在文档级别绑定了委托,现在该方法已从jQuery中删除,并由delegate方法(现在由on方法代替)代替,因为您通常应该在较小的范围上绑定委托。


文档中的引用并没有谈到您在ready事件中所做的操作,而是谈到了<body onload="">属性。当您在jQuery中使用readyload事件时,不应该使用它。

最新更新