javascript - 动态创建元素的事件绑定(bind)?

标签 javascript jquery events unobtrusive-javascript

我有一些代码循环浏览页面上的所有选择框并将 .hover 事件绑定(bind)到它们以在 mouse 上调整它们的宽度开/关.

这发生在页面准备就绪并且工作正常。

我遇到的问题是我在初始循环之后通过 Ajax 或 DOM 添加的任何选择框都不会绑定(bind)事件。

我找到了这个插件(jQuery Live Query Plugin),但是在我用插件向我的页面添加另一个 5k 之前,我想看看是否有人知道这样做的方法,无论是直接使用 jQuery 还是通过其他选项。

最佳答案

从 jQuery 1.7 开始你应该使用 jQuery.fn.on填充了选择器参数:

$(staticAncestors).on(eventName, dynamicChild, function() {});

解释:

这称为事件委托(delegate),其工作方式如下。该事件附加到应处理的元素的静态父级 (staticAncestors)。每次在此元素或其中一个后代元素上触发事件时,都会触发此 jQuery 处理程序。然后,处理程序检查触发事件的元素是否与您的选择器匹配 (dynamicChild)。当匹配时,您的自定义处理函数就会被执行。


在此之前,推荐的方法是使用 live() :

$(selector).live( eventName, function(){} );

但是,live() 在 1.7 中被弃用,取而代之的是 on(),并在 1.9 中完全删除。 live() 签名:

$(selector).live( eventName, function(){} );

... 可以替换为以下 on()签名:

$(document).on( eventName, selector, function(){} );

例如,如果您的页面正在动态创建类名称为 dosomething 的元素,您可以将事件绑定(bind)到 已存在的父级(这是问题在这里,您需要绑定(bind)到存在的东西,不要绑定(bind)到动态内容),这可以是(也是最简单的选择)是 document。虽然记住 document may not be the most efficient option .

$(document).on('mouseover mouseout', '.dosomething', function(){
    // what you want to happen when mouseover and mouseout 
    // occurs on elements that match '.dosomething'
});

绑定(bind)事件时存在的任何父级都可以。例如

$('.buttons').on('click', 'button', function(){
    // do something here
});

适用于

<div class="buttons">
    <!-- <button>s that are generated dynamically and added here -->
</div>

关于javascript - 动态创建元素的事件绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/203198/

相关文章:

javascript - 通过添加默认高度 javascript 创建 3D 对象

javascript - 基于属性的 JSON 数组合并

javascript - jQuery:非常简单的标签切换

jquery - UI 对话框上的自动高度,如果高度更改,对话框将不再垂直居中

.net - F# 事件和处理程序的类型参数是什么?

jQuery 全局监听自定义事件

javascript - 语义 UI - 模态打开后禁用移动滚动(即使在模态关闭后仍保持禁用状态)

javascript - 仅使用 javascript 且不使用 jquery 的 highcharts

jquery - 如何在 jquery 中更改表格的文本?

javascript - 指令内未触发滚动事件 - angular.js