我有一段代码,我循环浏览页面上的所有选择框,并将一个悬停事件绑定到它们上,以便在鼠标打开/关闭时对它们的宽度进行一些微调。

这在页面就绪时发生,工作正常。

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

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


当前回答

您可以简单地将事件绑定调用包装成一个函数,然后调用它两次:一次在文档就绪时调用,一次在添加新DOM元素的事件之后调用。如果这样做,您将希望避免在现有元素上绑定同一事件两次,因此您需要解除现有事件的绑定,或者(更好)只绑定到新创建的DOM元素。代码看起来像这样:

function addCallbacks(eles){
    eles.hover(function(){alert("gotcha!")});
}

$(document).ready(function(){
    addCallbacks($(".myEles"))
});

// ... add elements ...
addCallbacks($(".myNewElements"))

其他回答

另一种解决方案是在创建元素时添加侦听器。不是将监听器放在主体中,而是在创建元素的瞬间将监听器放入元素中:

var myElement = $('<button/>', {
    text: 'Go to Google!'
});

myElement.bind( 'click', goToGoogle);
myElement.append('body');


function goToGoogle(event){
    window.location.replace("http://www.google.com");
}

尝试使用.live()代替.bind();在Ajax请求执行后,.live()将把.holl绑定到您的复选框。

<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>

我更喜欢以模块化函数的方式部署事件侦听器,而不是编写文档级事件侦听器的脚本。所以,我喜欢下面。注意,您不能使用同一个事件侦听器超额订阅某个元素,因此不要担心多次附加侦听器-只需一个侦听器。

var迭代=4;var按钮;var body=document.querySelector(“body”);for(var i=0;i<迭代次数;i++){button=document.createElement(“button”);button.classList.add(“我的按钮”);button.appendChild(document.createTextNode(i));button.addEventListener(“单击”,myButtonWasClicked);body.appendChild(按钮);}函数myButtonWasClicked(e){console.log(e.target)//访问此特定按钮}

当使用jQuery(html,属性)动态创建时,可以将事件附加到元素。

从jQuery1.8开始,任何jQuery实例方法(jQuery.fn的方法)都可以用作传递给第二个参数:

函数handleDynamicElementEvent(事件){console.log(事件类型,此值)}//创建事件并将其附加到动态元素jQuery(“<select>”{html:$.map(数组(3),函数(_,索引){返回新选项(索引,索引)}),日期:{更改:handleDynamicElementEvent}}).appendTo(“正文”);<script src=“https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>