我有一段代码,我循环浏览页面上的所有选择框,并将一个悬停事件绑定到它们上,以便在鼠标打开/关闭时对它们的宽度进行一些微调。
这在页面就绪时发生,工作正常。
我遇到的问题是,在初始循环之后通过Ajax或DOM添加的任何选择框都不会绑定事件。
我已经找到了这个插件(jQuery Live Query插件),但在我用插件向我的页面添加另一个5k之前,我想看看是否有人知道这样做的方法,无论是直接使用jQuery还是通过另一个选项。
我有一段代码,我循环浏览页面上的所有选择框,并将一个悬停事件绑定到它们上,以便在鼠标打开/关闭时对它们的宽度进行一些微调。
这在页面就绪时发生,工作正常。
我遇到的问题是,在初始循环之后通过Ajax或DOM添加的任何选择框都不会绑定事件。
我已经找到了这个插件(jQuery Live Query插件),但在我用插件向我的页面添加另一个5k之前,我想看看是否有人知道这样做的方法,无论是直接使用jQuery还是通过另一个选项。
当前回答
另一种创建元素和绑定事件的灵活解决方案(源代码)
// creating a dynamic element (container div)
var $div = $("<div>", {id: 'myid1', class: 'myclass'});
//creating a dynamic button
var $btn = $("<button>", { type: 'button', text: 'Click me', class: 'btn' });
// binding the event
$btn.click(function () { //for mouseover--> $btn.on('mouseover', function () {
console.log('clicked');
});
// append dynamic button to the dynamic container
$div.append($btn);
// add the dynamically created element(s) to a static element
$("#box").append($div);
注意:这将为每个元素创建一个事件处理程序实例(在循环中使用时可能会影响性能)
其他回答
动态创建的元素上的事件绑定
单个元素:
$(document.body).on('click','.element', function(e) { });
子元素:
$(document.body).on('click','.element *', function(e) { });
注意添加的*。将为该元素的所有子级触发事件。
我注意到:
$(document.body).on('click','.#element_id > element', function(e) { });
它已经不起作用了,但它以前也起过作用。我一直在使用谷歌CDN的jQuery,但我不知道他们是否改变了它。
这是一个没有任何库或插件的纯JavaScript解决方案:
document.addEventListener('click', function (e) {
if (hasClass(e.target, 'bu')) {
// .bu clicked
// Do your thing
} else if (hasClass(e.target, 'test')) {
// .test clicked
// Do your other thing
}
}, false);
其中hasClass是
function hasClass(elem, className) {
return elem.className.split(' ').indexOf(className) > -1;
}
现场演示
Dave和Sime Vidas的功劳
使用更现代的JS,hasClass可以实现为:
function hasClass(elem, className) {
return elem.classList.contains(className);
}
下面嵌入了相同的jsfiddle Live演示:
函数hasClass(elem,className){return elem.classList.contains(className);}document.addEventListener('click',函数(e){if(hasClass(e.target,'bu')){警报('bu');document.querySelector('.bu').innerHTML='<div class=“bu”>bu<div class=”tu“>tu</div></div>';}else if(hasClass(e.target,'test')){警报(“测试”);}否则if(hasClass(e.target,'tu')){警报('tu');}},假);测验.bu,.tu文件{边框:1px实心灰色;填充:10px;边距:10px;}<div class=“test”>测试<div class=“bu”>bu</div>测试</div>
我正在寻找一种解决方案,使$.bind和$.unbind在动态添加的元素中工作时不会出现问题。
As on()使用了附加事件的技巧,以便在我遇到的事件上创建一个假解绑:
const sendAction = function(e){ ... }
// bind the click
$('body').on('click', 'button.send', sendAction );
// unbind the click
$('body').on('click', 'button.send', function(){} );
你可以使用
$('.buttons').on('click', 'button', function(){
// your magic goes here
});
or
$('.buttons').delegate('button', 'click', function() {
// your magic goes here
});
这两种方法是等效的,但具有不同的参数顺序。
请参见:jQuery委托事件
<html>
<head>
<title>HTML Document</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
</head>
<body>
<div id="hover-id">
Hello World
</div>
<script>
jQuery(document).ready(function($){
$(document).on('mouseover', '#hover-id', function(){
$(this).css('color','yellowgreen');
});
$(document).on('mouseout', '#hover-id', function(){
$(this).css('color','black');
});
});
</script>
</body>
</html>