92

我可能会在这里犯一个众所周知的错误吗?

我有一个使用 .on() 的脚本,因为元素是动态生成的,但它不起作用。只是为了测试一下,我用动态元素的 wrap 替换了选择器,它是静态的,但它仍然不起作用!但是,当我切换到普通的旧 .click 进行换行时,它起作用了。
(这显然不适用于动态元素,重要的是。)

这有效:

$("#test-element").click(function() {
    alert("click");
});

这不会:

$(document).on("click","#test-element",function() {
    alert("click");
});

更新:

我右键单击并在 Chrome 中执行“检查元素”以仔细检查某些内容,然后单击事件起作用。我刷新了,但它不起作用,检查了元素,然后它起作用了。这是什么意思?

4

6 回答 6

166

您正在使用正确的语法绑定到文档以侦听 id="test-element" 元素的单击事件。

由于以下原因之一,它可能无法正常工作:

  • 不使用最新版本的 jQuery
  • 没有准备好将代码包装在 DOM 中
  • 或者您正在做的事情导致事件不会冒泡到文档上的侦听器。

要捕获在声明事件侦听器之后创建的元素上的事件 - 您应该绑定到父元素或层次结构中更高的元素。

例如:

$(document).ready(function() {
    // This WILL work because we are listening on the 'document', 
    // for a click on an element with an ID of #test-element
    $(document).on("click","#test-element",function() {
        alert("click bound to document listening for #test-element");
    });

    // This will NOT work because there is no '#test-element' ... yet
    $("#test-element").on("click",function() {
        alert("click bound directly to #test-element");
    });

    // Create the dynamic element '#test-element'
    $('body').append('<div id="test-element">Click mee</div>');
});

在此示例中,只有“绑定到文档”警报会触发。

JSFiddle 与 jQuery 1.9.1

于 2013-07-11T23:58:27.050 回答
13

您的代码应该可以工作,但我知道答案对您没有帮助。您可以在此处 (jsfiddle)看到一个工作示例。

查询:

$(document).on('click','#test-element',function(){
    alert("You clicked the element with and ID of 'test-element'");
});

正如有人已经指出的那样,您使用的是 ID 而不是类。如果页面上有多个具有 ID 的元素,则 jquery 将仅返回具有该 ID 的第一个元素。不会有任何错误,因为它是这样工作的。如果这是问题所在,那么您会注意到 click 事件适用于第一个事件,test-element但不适用于随后的任何事件。

如果这不能准确描述问题的症状,那么您的选择器可能是错误的。您的更新使我相信这是因为检查了一个元素然后再次单击该页面并触发了单击。如果您将事件侦听器放在实际document而不是test-element. 如果是这样,当您单击文档并重新打开(例如从开发人员窗口返回文档)时,将触发该事件。如果是这种情况,您还会注意到,如果您在两个不同的选项卡之间单击,就会触发 click 事件(因为它们是两个不同document的 s,因此您正在单击 document.

如果这些都不是答案,那么发布 HTML 将有助于解决这个问题。

于 2013-07-12T00:03:35.667 回答
5

一个旧帖子,但我喜欢分享,因为我有同样的情况,但我终于知道了问题:

问题是:我们制作了一个函数来处理指定的 HTML 元素,但尚未创建与此函数相关的 HTML 元素(因为该元素是动态生成的)。为了让它工作,我们应该在创建元素的同时创建函数。元素优先于与它相关的功能。

简单来说,一个函数只对在它之前创建的元素(他)起作用。任何动态创建的元素都意味着在他之后。

但请检查没有注意上述情况的样品:

<div class="btn-list" id="selected-country"></div>

动态附加:

<button class="btn-map" data-country="'+country+'">'+ country+' </button>

通过单击按钮,此功能运行良好:

$(document).ready(function() {    
        $('#selected-country').on('click','.btn-map', function(){ 
        var datacountry = $(this).data('country'); console.log(datacountry);
    });
})

或者你可以使用 body :

$('body').on('click','.btn-map', function(){ 
            var datacountry = $(this).data('country'); console.log(datacountry);
        });

与之相比,这不起作用:

$(document).ready(function() {     
$('.btn-map').on("click", function() { 
        var datacountry = $(this).data('country'); alert(datacountry);
    });
});

希望它会有所帮助

于 2016-09-27T14:02:40.840 回答
3

这有效:

<div id="start-element">Click Me</div>

$(document).on("click","#test-element",function() {
    alert("click");
});

$(document).on("click","#start-element",function() {
    $(this).attr("id", "test-element");
});

这是小提琴

于 2013-07-11T23:51:16.067 回答
1

尝试这个:

$("#test-element").on("click" ,function() {
    alert("click");
});

这样做的文档方式也很奇怪。如果用于类选择器,这对我来说是有意义的,但在 id 的情况下,您可能只是在那里遍历无用的 DOM。对于 id 选择器,您可以立即获得该元素。

于 2013-07-11T23:42:11.790 回答
1

如果此代码即使在文档准备好的情况下也不起作用,则很可能您return false;在 js 文件中的某个位置为该按钮分配了一个,如果是按钮,请尝试将其更改为 ,span,anchor 或 div 并测试它是否工作。

$(document).on("click","#test-element",function() {
        alert("click bound to document listening for #test-element");
});
于 2021-01-12T13:38:23.747 回答