Javascript 使用jquery对新创建的元素执行函数
当我动态添加一个新元素时,我想对它应用一些函数。例如,要将常规的Javascript 使用jquery对新创建的元素执行函数,javascript,jquery,Javascript,Jquery,当我动态添加一个新元素时,我想对它应用一些函数。例如,要将常规的转换为日期时间选择器(通过一些插件),我需要 $('.dt').dateTime(); 上述函数仅在我在初始化期间第一次添加元素时起作用。 当我以后使用.append()添加它们时,该函数将不被应用。对于事件侦听器,我使用$(document).on(): $(document).on('click', '.dt', function () {}); 而且它在任何情况下都有效 在创作中使用什么等价物 在上,我看到了类似问题的解决
转换为日期时间选择器(通过一些插件),我需要
$('.dt').dateTime();
上述函数仅在我在初始化期间第一次添加元素时起作用。
当我以后使用.append()
添加它们时,该函数将不被应用。对于事件侦听器,我使用$(document).on()
:
$(document).on('click', '.dt', function () {});
而且它在任何情况下都有效
在创作中使用什么等价物
在上,我看到了类似问题的解决方案,要么使用现在已被弃用的function.live()
,要么使用我不想要的某种插件
普通jquery中有什么解决方案吗?根据您可以使用的
根据继承方法重写.live()方法非常困难
直截了当的这些是用于所有应用程序的等效调用的模板
三种事件附件方法:
我在中进行了尝试,当您在父元素上设置.on
函数时,其中的所有元素(将来也会)都将附加此事件
$(.main”).on('click','.cl',function(){alert('clicked');});
$(“.add”)。单击(函数(){
$(“.main”).append(Test
);
});代码>
添加
1
二,
3
四,
无法在jquery中侦听元素创建
为了在将元素添加到DOM时初始化某些内容,您有几个选项:
使用MutationObserver,但是它没有最好的支持
在添加元素后手动初始化插件(最佳匹配)
另一种解决方案(关于@vxsx答案和插件行为的其他解决方案)可能是使用委派事件,例如,mouseenter
并使用它初始化插件,例如:
$(document).on('mouseenter', '.dt:not(.dt_initiliazed)', function () {
$(this).addClass('dt_initiliazed').dateTime();
});
另一个解决方案是在特定元素.dt
上设置一个假CSS动画/转换,并使用相关事件animationEnd/transitionEnd
初始化插件。这甚至适用于以后在DOM中添加的元素。在一些使用jQuery的现代浏览器上,您可以尝试:
$(document).on('DOMNodeInserted', '.dt', function(event) {
$(event.currentTarget).dateTime();
});
此功能实际上已被弃用,因此我建议您遵循vxsx的答案,或者使用MutationObserver工具,或者最好在每次添加.dt
元素时手动应用此功能。它不需要比实际设置事件侦听器更多的代码。您可以使用它来检测新的DOM元素并强制绑定这些新项
您可以阅读以下内容:是否可以创建元素,调用插件函数,然后附加它?而不是直接追加?e、 g变量$dt=$('')$dt.dataTime()$('body')。追加($dt);也许插件可以处理委托。你能提供插件和JSFIDLE的链接吗?!jQuery在运行时只知道页面中的元素,因此jQuery无法识别添加到DOM中的新元素。为了防止这种使用,将事件从新添加的项冒泡到DOM中的某个点,当jQuery在页面加载上运行时,该点就在DOM中。许多人使用document
作为捕获冒泡事件的地方,但没有必要在DOM树中占据那么高的位置。理想情况下,这并不能回答问题。我知道@xaxa希望将click callback设置为每个DOM元素:已经创建,这是动态创建的。我认为这可能会解决这个问题problem@suvroc在我的情况下,事件
等于什么?(在创建元素时)实际上它看起来像您的$(文档)代码>来自回答他不想添加点击事件,他的点击事件示例解释说他想绑定一个插件,类似于使用“on”绑定点击事件。插件不会在单击时启动,它应该在附加元素时应用于元素。
$(document).on('DOMNodeInserted', '.dt', function(event) {
$(event.currentTarget).dateTime();
});