Jquery:同时绑定load和change事件

20

在许多情况下,我需要在加载后将行为绑定到元素,然后在事件触发(如“更改”)后再将其绑定。 我认为最好的方法是将其放在同一行中:

$('#element_id').bind('load, change', function () {
...
});

但是这只适用于“改变”而不适用于“加载”。有更好的方法吗?


我去掉了逗号,但它仍然无法工作。我认为加载可能会有一些限制。 - mazz
4个回答

57

我遇到了同样的问题。仅仅移除逗号是不够的,至少在这种情况下是不够的:

$(document).ready(function(){
    $('#element_id').bind('load change', function () {
        ... // (this DOESN'T get called on page load)
    });
});

我猜 load 事件会在 $(document).ready() 之前触发。
这是一个简单的解决方案:
$(document).ready(function(){
    $('#element_id').bind('change', function () {
        ...
    });
    $('#element_id').trigger('change');
});

即使这样做会导致变更事件循环一百万次。不知道为什么。我尝试了这种方法和其他方法,但它仍然想要循环。 - Nathan McKaskle
你是在函数内触发事件吗?它不应该循环,一定有错误。你可以尝试创建一个最小的错误案例,并在单独的问题中发布代码;很可能在点击“发布”按钮之前就会解决问题。 :) - johndodo
不要在函数内触发它。$('#employeeDropDown').on('change', function (event) { var form = $(event.target).parents("form"); form.submit(); }).trigger('change');甚至如上所述,会导致它循环。 - Nathan McKaskle
我认为你使用 form.submit() 也可能会触发 change 事件。使用 console.log()(或者如果你喜欢的话,JavaScript 调试器)来查看哪一部分正在循环。但是实际上,这与这个问题无关,你应该发布自己的问题。我可以向你保证,上面的答案中没有任何会导致它循环的东西 - 我经常使用它并且它有效。 - johndodo
自从jQuery 3.0以后,bind已被弃用,但这仍然完美运行(只需将bind替换为on,然后调用trigger)。同时,根据文档,这是现在调用它的“正确”方式,不确定2011年时它读取的内容是什么。在ready事件上调用load被认为是不安全的,并且在动态加载脚本时不会运行。请参见:https://api.jquery.com/ready/ - oneWorkingHeadphone
更简单的写法:$('selector').change(function(){ ... }).change(); - Arnon Weinberg

10

对于已加载的内容,当你想在事件上运行一个函数并立即执行时,可以使用自己命名的自定义事件来避免触发任何现有绑定(如来自库等)的内置事件,例如:

$(".my-selector").on("change rightnow", function() {
  // do stuff...
}).triggerHandler("rightnow");

1

1

你只需要移除逗号不就行了吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接