我一直在使用Jquery.ready()吗?

时间:2014-01-18 21:24:46

标签: javascript jquery coffeescript turbolinks

关于Jquery ready事件块,文档说:

  

.ready()方法通常与属性不兼容。如果必须使用load,则不要使用.ready()或使用jQuery的.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")

当检查turbolinks.jquery gem时,我遇到了这个注释:

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

所以它让我感到疑惑,我一直在做错吗? 我应该避免在就绪块中使用$(document).on()吗? 如果是这样,除了与turbolinks.jquery可能发生冲突之外,还有一个原因是为什么这是错误的?

那么正确的模式是什么?我熟悉使用加载块而不是ready块来等待资源加载,但我不确定我是否知道我一直在做错的事情。

1 个答案:

答案 0 :(得分:0)

是的,没有。

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

但是,如果可以提供帮助,则应避免在文档级别绑定委托。您应该使用尽可能接近发生事件的元素的元素。每当事件发生在绑定它的元素内部时,它必须检查事件发生的元素是否与选择器匹配,因此如果在文档级别绑定委托,则必须对任何地方发生的每个此类事件进行该工作。在页面中。

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


文档中的引用并未讨论您在ready事件中执行的操作,而是讨论<body onload="">属性。在jQuery中使用readyload事件时,不应该使用它。