页面上新添加的元素,可识别先前定义的Javascript代码

kev*_*vin 0 jquery

在这个极简化的和最小化的例子Click事件处理程序已经为每个定义的一个标签(链接被点击后,显示简单的警告).单击该按钮后,第二个链接将添加到页面中.

但是,如果单击此新添加的链接,则不会调用事件处理程序.知道为什么吗?应该添加/更改什么,以便新添加的元素知道主页上定义的脚本?

<html>
<head>
    <script type="text/javascript" src="http://code.jquery.com/jquery-1.6.1.min.js"></script>
    <script type="text/javascript">
        $("document").ready(function() {
            $("a").click(function() {
                alert("link is clicked");
                return false;
            });
            $("#btn").click(function() {
                $("#second").html("<a href='#'>Second link</a>");
            });
        });
</script>
</head>
<body>
    <div id="first">
        <input id="btn" type="button" value="Get new content"/>
        <a href="#">Original link</a>
</div>
<div id="second"/>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

在这种特殊情况下,应该做什么,以便第二个链接知道脚本部分中定义的事件处理程序,以便在单击链接后显示警报?

您对解决这类情况的建议是什么?如何让页面上新添加的元素知道以前定义的Javascript代码?

Mar*_*ahn 5

因为您绑定了页面上的所有现有链接.尝试:

$('a').live('click', function(){
    alert('link is clicked');
    return false;
});
Run Code Online (Sandbox Code Playgroud)

jQuery的live函数实际上附加了一个事件处理程序document.body,然后检查事件是否匹配,当它最终冒泡到正文时.因此它适用于页面上的所有当前和未来对象.

请注意,如果这些链接位于特定容器中,则此代码更有效:

$('#container').delegate('a', 'click', function(){
    ...
});
Run Code Online (Sandbox Code Playgroud)

delegate只检查冒泡到的事件#container,因此jQuery不会检查页面上任何位置的每次点击.