【问题标题】:.change() vs .on( "change", handler ) in jQueryjQuery 中的 .change() 与 .on( "change", handler )
【发布时间】:2014-10-28 02:22:33
【问题描述】:

当我使用 jQuery 处理下拉菜单上的更改触发器时遇到问题。

我用了两段代码:

//---------- Case 1
$(document).on("change", "#drop-down-id", function () {
    alert(this.value);
});
//----------Case 2
$("#drop-down-id").change(function () {
    alert(this.value);
});

第一个运行顺利,但是第二个在我启动浏览器时没有触发,但是我刷新我的网站后,它就可以了。

你有什么想法吗?

我的 jQuery 版本:1.11.1,我已经在 Chrome 38、Firefox 32 和 IE 11 上进行了测试。

-- 编辑: @JanR & Cheery:好像是这样的:

<select id="drop-down-id">
    <% arr.each do |option| %>
        <option value="<%= option %>"><%= option %></option>
    <% end %>
</select>

我用过 Rails 4.1,arr 是一个包含数字的数组。

-- 编辑: 我发现问题来自 Rails 的 Asset Pipeline,而不是 jQuery。

我将 JS 代码放在脚本标签中,这两种情况都有效,但是当我把它放在 assets 文件夹中时,问题就发生了。

感谢您的快速回复!

【问题讨论】:

  • 你能在 jsfiddle.net 上重建问题吗?此选择是否动态创建?
  • case 1 可以用于元素,即使您的元素在 html 中仍然不存在。 case 2 应该在 dom ready 函数内部使用,这样才能加载 html 中的所有元素。
  • @haitran yes the select created dynamically. 这可能意味着在监听器分配的那一刻它不存在。通过刷新浏览器从缓存中读取并几乎立即选择其位置。当元素已经存在时,您应该调用.change(
  • 以后,对于 HTML/JavaScript 相关的问题,你的服务器端语言无关紧要。您想向人们展示浏览器看到的相同代码,即服务器生成的 HTML。然而,仅仅一个&lt;select&gt; 的小片段并不能帮助解决复杂的交互问题。您通常需要使用最少的代码(HTML、JavaScript 和 CSS)创建一个精简的测试用例来重现您的问题。花时间创建这个测试用例会教你一些东西,通常会告诉你问题,如果没有,它会为帮​​助者提供坚实的基础。
  • P.S.在 HTML 中,如果您希望选项的值与其显示的值相同,则不需要 value="…" 属性。

标签: javascript jquery ruby-on-rails


【解决方案1】:

我推荐使用case 1,因为它是用来加载change事件的组合文档,如果你选择元素是动态生成的,use case 1会生效。

jquery doc 也说过,.change() 是 .on ("change", handler) 的快捷方式,所以我认为最终会使用 .on 回调。

【讨论】:

  • 是的,我在我的项目中使用了案例 1,但正如您所说(以及在 jQuery 文档中),.change () 是 .on ("change" , handler),那么有什么不同呢?
  • 作为最终回调.on,所以我认为会有性能优势;另一个可能会被删除,例如 .live
【解决方案2】:

使用.on() 时,请记住:

  • 案例 2,是别名:.change(...) === .on("change", handler) - 如果 selector 被省略或为空,则引用事件处理程序 作为直接或直接绑定(每次在选定元素上发生事件时调用处理程序)。在这种情况下,如果你想成功地绑定一些东西到一个元素上,你需要确保它已经被加载了。

  • 案例 1:.on("change", selector, handler) - 如果提供了 selector,则事件处理程序称为 委托(当事件直接发生在绑定元素上时不会调用处理程序,但仅适用于匹配选择器的后代)。在这种情况下,您不需要在绑定时加载或不加载元素。

this answerDifference between .on('click') vs .click() 很好地解释了以一种方式而不是另一种方式这样做的好处。

【讨论】:

    【解决方案3】:

    如果您将文档级别的更改事件绑定到文档中的某个元素。在这个阶段,它是否存在并不重要(比如它是稍后创建的或稍后加载的)。

    在第二种情况下,您将事件绑定到必须已存在于 DOM 中的元素,否则绑定将失败。可能发生的情况是您的 javascript 在页面上加载元素之前触发。

    尝试将案例 2 包装在 $(document).ready() 函数中,如下所示:

    $(document).ready(function(){
    //----------Case 2
            $("#drop-down-id").change(function () {
                  alert(this.value);
            });
    });
    

    这将确保您的 javascript 在 DOM 准备好之前不会触发。

    【讨论】:

    • 你能发布你的html等吗?否则很难排除故障,因为这取决于您生成页面的方式。如果您要动态添加对象,我建议您使用案例 1。
    • 正如在 cmets 中指出的,我们需要看到的不仅仅是这些,页面上是否还有其他 javascript 运行? DOM 结构是什么样的等等。
    • 不,那是 .on("change", callback) 和 .on("change","parent", callback) 第二个处理事件委托。
    • 这是一个非常有用的答案,将确保您考虑如何在 DOM 或文档中应用 on change 事件,感谢 JanR
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-17
    • 2023-02-09
    • 2012-08-02
    • 2019-10-14
    • 2016-11-15
    • 2012-09-06
    • 2013-05-02
    相关资源
    最近更新 更多