$(document).on(“click”…不工作?

我可以在这里做出一个众所周知的错误吗?

我有一个使用.on()的脚本,因为一个元素是dynamic生成的,它不工作。 只是为了testing它,我用静态的dynamic元素的换行replace了select器,它仍然不起作用! 当我切换到普通旧.click的包装工作,虽然。
(这显然不适用于dynamic元素,重要的元素。)

这工作:

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

这不:

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

更新:

我右键单击并在Chrome中执行“检查元素”,只需再次检查某些内容,然后单击事件即可正常工作。 我刷新了,它没有工作,检查元素,然后它的工作。 这是什么意思?

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

由于以下原因可能不起作用:

  • 不使用最新版本的jQuery
  • 不要把你的代码包装在DOM里面
  • 或者你正在做的事情导致事件不起泡到文档上的监听器。

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

例如:

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

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

jQuery的:

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

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

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

如果这两个都不是答案,那么张贴HTML将会大大减less这个问题。

尝试这个:

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

文件的做法也很奇怪。 如果用于类select器,这对我来说是有意义的,但是在一个id的情况下,你可能只是在那里有无用的DOM遍历。 在idselect器的情况下,你立即得到这个元素。

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

问题是:我们做了一个函数来处理指定的HTML元素,但是与这个函数相关的HTML元素还没有被创build(因为元素是dynamic生成的)。 要做到这一点,我们应该在创造元素的同时做出function。 元素首先要做与之相关的function。

简单地说,一个函数只会对它之前创build的元素(他)起作用。 任何dynamic创build的元素都意味着他。

但请检查一下这个不关注上述情况的例子:

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

dynamic追加:

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

点击button,该function正常运行:

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

或者你可以使用如下身体:

 $('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); }); }); 

希望这会有所帮助

这工作:

 <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"); }); 

这是小提琴