如何使用 jQuery 将动态命名的事件附加到动态元素
How to attach dynamically named events to dynamic elements with jQuery
我的 DOM 中有元素包含一个名为 'data-event'.
的属性
其中一些元素可能会动态添加到 DOM,例如在 ajax 请求之后。
当然,我正在使用 jQuery 访问元素的数据事件属性:
$('.element-selector').data('event')
事件数据属性包含必须附加函数处理程序的事件的名称。假设此函数称为 generalHandler()
.
我不能直接使用 .on 函数,因为在访问元素本身之前我不知道附加该函数的事件的名称,而 .on 需要指定事件的名称首先(当然)。
$('[data-event]').on('????', generalHandler);
我可以使用 .each
,以便访问每个 $('[data-event]')
并提取事件名称并将函数附加到它,所有这些都来自 .each
调用的回调函数。
无论如何,使用 .each
也不是一个好的解决方案,因为这样我就不会处理所有动态添加的 $('[data-event]')
元素。
我可以使用 DOM 元素插入事件,将其附加到正文并等待 [data-event] 元素添加到 DOM,但我知道这些事件已被弃用。我可以扩展 MutationObserver
对象,但我对这种方式的性能编码一无所知。
我想知道是否有一种方法可以仅使用一个 instruction/function 来完成我需要的操作,也许可以以某种“神奇”的方式使用 .on
或类似的方法。我不想使用 MutationObserver
因为我应该执行两次“事件附件”操作(一次用于现有元素,另一次用于动态元素),我不确定如何使用它来保持最佳状态页面的性能,我不知道如何正确地实现它以仅做我需要的事情(找到事件名称并将我的处理程序附加到该元素)。
有什么想法吗?
如果我没理解错的话。您想要根据元素的数据属性中提供的事件执行操作,并且这些事件对于添加的每个元素都是不同的。如果是这样,你可以尝试这样的事情。
<div class="container">
</div>
$(".container")
.append("<div data-event='click' class='child'>Click</div>")
.append('<div data-event="mouseover" class="child">Mouseover</div>')
.append('<div data-event="mouseout" class="child">Mouseout</div>');
// Listen to all the possible event that can be triggered
$(".container").on("click mouseover mouseout", ".child", function(e){
// If the required event was triggered for this element then perform the action
if(e.type === $(this).data("event")){
console.log("Perform " + e.type);
} else{
console.log("Don't Perform " + e.type);
}
});
这是 link 到 JSFiddle
我的 DOM 中有元素包含一个名为 'data-event'.
的属性其中一些元素可能会动态添加到 DOM,例如在 ajax 请求之后。
当然,我正在使用 jQuery 访问元素的数据事件属性:
$('.element-selector').data('event')
事件数据属性包含必须附加函数处理程序的事件的名称。假设此函数称为 generalHandler()
.
我不能直接使用 .on 函数,因为在访问元素本身之前我不知道附加该函数的事件的名称,而 .on 需要指定事件的名称首先(当然)。
$('[data-event]').on('????', generalHandler);
我可以使用 .each
,以便访问每个 $('[data-event]')
并提取事件名称并将函数附加到它,所有这些都来自 .each
调用的回调函数。
无论如何,使用 .each
也不是一个好的解决方案,因为这样我就不会处理所有动态添加的 $('[data-event]')
元素。
我可以使用 DOM 元素插入事件,将其附加到正文并等待 [data-event] 元素添加到 DOM,但我知道这些事件已被弃用。我可以扩展 MutationObserver
对象,但我对这种方式的性能编码一无所知。
我想知道是否有一种方法可以仅使用一个 instruction/function 来完成我需要的操作,也许可以以某种“神奇”的方式使用 .on
或类似的方法。我不想使用 MutationObserver
因为我应该执行两次“事件附件”操作(一次用于现有元素,另一次用于动态元素),我不确定如何使用它来保持最佳状态页面的性能,我不知道如何正确地实现它以仅做我需要的事情(找到事件名称并将我的处理程序附加到该元素)。
有什么想法吗?
如果我没理解错的话。您想要根据元素的数据属性中提供的事件执行操作,并且这些事件对于添加的每个元素都是不同的。如果是这样,你可以尝试这样的事情。
<div class="container">
</div>
$(".container")
.append("<div data-event='click' class='child'>Click</div>")
.append('<div data-event="mouseover" class="child">Mouseover</div>')
.append('<div data-event="mouseout" class="child">Mouseout</div>');
// Listen to all the possible event that can be triggered
$(".container").on("click mouseover mouseout", ".child", function(e){
// If the required event was triggered for this element then perform the action
if(e.type === $(this).data("event")){
console.log("Perform " + e.type);
} else{
console.log("Don't Perform " + e.type);
}
});
这是 link 到 JSFiddle