我有一段代码,我循环浏览页面上的所有选择框,并将一个悬停事件绑定到它们上,以便在鼠标打开/关闭时对它们的宽度进行一些微调。
这在页面就绪时发生,工作正常。
我遇到的问题是,在初始循环之后通过Ajax或DOM添加的任何选择框都不会绑定事件。
我已经找到了这个插件(jQuery Live Query插件),但在我用插件向我的页面添加另一个5k之前,我想看看是否有人知道这样做的方法,无论是直接使用jQuery还是通过另一个选项。
我有一段代码,我循环浏览页面上的所有选择框,并将一个悬停事件绑定到它们上,以便在鼠标打开/关闭时对它们的宽度进行一些微调。
这在页面就绪时发生,工作正常。
我遇到的问题是,在初始循环之后通过Ajax或DOM添加的任何选择框都不会绑定事件。
我已经找到了这个插件(jQuery Live Query插件),但在我用插件向我的页面添加另一个5k之前,我想看看是否有人知道这样做的方法,无论是直接使用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>
其他回答
我更喜欢使用选择器,并将其应用于文档。
这将自身绑定到文档上,并将适用于页面加载后呈现的元素。
例如:
$(document).on("click", 'selector', function() {
// Your code here
});
这是一个没有任何库或插件的纯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>
注意元素所在的“MAIN”类,例如,
<div class="container">
<ul class="select">
<li> First</li>
<li>Second</li>
</ul>
</div>
在上述场景中,jQuery将监视的MAIN对象是“容器”。
然后,您将基本上在容器下具有元素名称,如ul、li和select:
$(document).ready(function(e) {
$('.container').on( 'click',".select", function(e) {
alert("CLICKED");
});
});
<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>
动态创建的元素上的事件绑定
单个元素:
$(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,但我不知道他们是否改变了它。