jQuery .on('change', function() {} 不会触发动态创建的输入

IT技术 javascript jquery
2021-03-04 23:28:02

问题是我有一些动态创建的输入标签集,而且我还有一个函数可以在输入值改变时触发。

$('input').on('change', function() {
  // Does some stuff and logs the event to the console
});

但是,.on('change')不会为任何动态创建的输入触发,仅适用于加载页面时存在的项目。很不幸,这让我的处境有些作为.on,就是要为更换.live().delegate()所有这一切都为包装.bind():/

有没有其他人遇到过这个问题或知道解决方案?

6个回答

您应该为该on函数提供一个选择器

$(document).on('change', 'input', function() {
  // Does some stuff and logs the event to the console
});

在这种情况下,它将按您的预期工作。此外,最好指定一些元素而不是文档。

阅读这篇文章以获得更好的理解:http : //elijahmanor.com/differences-between-jquery-bind-vs-live-vs-delegate-vs-on/

替代语法:$(document).on({ change: handleChange }, 'input');加上函数const handleChange = (event) => { $(event.target)...避免麻烦的this.
2021-04-16 23:28:02
它就像一个魅力。非常感谢 !此外,我们可以使用 .once() 来防止添加两次相同的逻辑;)
2021-04-20 23:28:02
你真棒!我也遇到了这个问题。从未想过您可以将选择器添加为第二个参数。
2021-05-02 23:28:02
如果我的元素是动态的,我以后如何使用它?$this 给了我一个空对象。
2021-05-05 23:28:02
是的,正如指出将范围缩小到某个元素而不是整个文档的好处,在这种情况下,如果动态部分在某个 div 之后使用那个,例如: $('#ajax_table').on('change', 'input ', 功能() { ...
2021-05-07 23:28:02

用这个

$('body').on('change', '#id', function() {
  // Action goes here.
});
仅供参考,@enrey$('#id')在代码中指的是而不是'#id'
2021-04-17 23:28:02

您可以使用以下几种方法中的任何一种:

$("#Input_Id").change(function(){   // 1st way
    // do your code here
    // Use this when your element is already rendered
});


$("#Input_Id").on('change', function(){    // 2nd way
    // do your code here
    // This will specifically call onChange of your element
});

$("body").on('change', '#Input_Id', function(){    // 3rd way
    // do your code here
    // It will filter the element "Input_Id" from the "body" and apply "onChange effect" on it
});
$("#id").change(function(){
    //does some stuff;
});
这仍然不适用于动态创建的元素,因为它会尝试在文档加载时进行绑定。然而,@ArtemVyshniakov 的答案绑定到文档,当其中一个元素中的某些内容发生变化时,它会被触发,因为第二个参数可以定位所需的元素。(意思是当函数触发时,它会检查触发器的来源是否与第二个参数匹配)
2021-04-16 23:28:02
嗯......对代码片段做一点解释怎么样?
2021-04-21 23:28:02
在使用预加载的 DOM 之前,此代码将无法工作。您必须将选择器作为与文档相关的变量api.jquery.com/on/#on-events-selector-data 传递
2021-05-16 23:28:02

只是为了澄清一些潜在的混淆。这仅在 DOM 加载时存在元素时才有效:

$("#target").change(function(){
    //does some stuff;
});

当稍后动态加载元素时,您可以使用:

$(".parent-element").on('change', '#target', function(){
   //does some stuff;
});