Javascript 根据文档使用jQuery.on()时不工作?

Javascript 根据文档使用jQuery.on()时不工作?,javascript,jquery,Javascript,Jquery,我已经阅读了live()(现在已从jQuery中删除)、delegate()和on()的所有文档。这个问题困扰了我八个小时之后,我想不出如何解决它。 我想在一组链接中添加一个匿名函数,这些链接是通过AJAJ引入的数据创建的。我尝试了以下代码: $("#more_items_outer").on( 'click', '.show_more', function(a){ var target =

我已经阅读了live()(现在已从jQuery中删除)、delegate()和on()的所有文档。这个问题困扰了我八个小时之后,我想不出如何解决它。 我想在一组链接中添加一个匿名函数,这些链接是通过AJAJ引入的数据创建的。我尝试了以下代码:

$("#more_items_outer").on(
            'click',
            '.show_more',
            function(a){
                var target = a.parentElement;
                if (target.is(":visible")){
                    target.hide("slow");
                } else {
                    target.show();
                }
            }
        );

加载页面后,当我在开发浏览器的JS控制台中运行该代码时,该代码工作正常。但是,如果此代码在创建实际链接之前运行,则不会对这些链接执行任何操作。据我所知(包括官方jQuery文档在内的多个源文件都对其进行了描述),我在上面的代码中使用的on()函数应该能够使“show_more”类的任何元素在被单击时都会执行匿名函数,该元素是作为id为“more_items_outer”的任何元素的后代创建的。即使新元素的创建日期晚于此代码的执行日期,也应该如此。这在我的开发系统上是不会发生的,我很清楚为什么会这样。如果有帮助的话,我正在运行jQuery 1.9.1。

首先,查看下面的第5项。在我看来,click事件处理程序函数中有几个javascript错误

通常,
.on()
的动态形式如下:

$(static selector that exists).on('click', 'dynamic selector', function() {});
由于您没有向我们展示您的HTML或ajax,因此我可以列举出可能出现错误的情况:

  • 执行
    .on()
    调用时,静态选择器表示的对象必须存在
  • 静态选择器对象必须是动态对象的父对象
  • 动态选择器必须匹配原始调用时存在的或以后添加的子对象
  • 在调用
    .on()
    之前,可能会出现javascript错误,因此它永远不会执行
  • 处理程序函数中似乎存在javascript错误。您引用
    a.parentElement
    的代码似乎是错误的。在这种情况下,
    a
    是一个jQuery事件对象,我认为它没有
    parentElement
    属性。而且,即使parentElement是一个元素,那么执行
    target.is(“:visible”)
    的下一行也不会工作,因为
    target
    不是jQuery对象。因此,您至少必须修复处理程序函数中的代码。如果这是唯一的错误,那么您应该能够在javascript错误控制台或调试控制台中看到这些错误

  • 您的代码是否在加载dom后执行?例如,在$(function(){..})块内?呃,如何单击不可见div中的链接?当第一次加载页面并调用
    on()
    时,是否存在
    更多的外部项目?是否可以制作JSFIDLE?@MikeBrant调用代码时,静态选择器应该在那里,是的。“.show_more”链接不存在;它们是动态创建的。对,你说的是“a”,我甚至不需要它。我需要的是“this”,然后我可以导航到我需要的位置。问题是我不能在HTML文件中使用静态元素并让它工作。所有内容都是在静态选择器指向的div内创建的,但是浏览器的行为就像链接不是div的子对象一样。我认为这可能是传单问题,而不是jQuery问题。@lima-文档中的某个地方有一个静态父对象,即使您一直到
    document.body
    ,或者您可以在创建更直接的父级之后运行事件处理代码。必须在存在的对象上安装事件处理程序。你不能直接在未来的对象上安装事件处理程序。在重新阅读我的评论后,我不得不说我非常不清楚。我的意思是,我已经尝试使用硬编码文档中存在的元素,由于某种原因,click事件从未被触发。例如,如果我使用$(document),这显然是在.on()函数运行之前就存在的,那么链接不会做任何事情。如果我强制.on()函数等待整个页面加载,然后使用链接的直接(非静态)父级选择器运行它,那么我会得到结果。为什么$(document)不起作用?
    $(document).on()
    将起作用,如果您对
    .on()
    使用正确的参数,那么代码中没有任何其他内容阻止事件传播。您必须显示您(在原始问题中)尝试的HTML和代码,以便我们知道哪些不正确。如果这些是链接,则在委托事件处理程序访问事件之前,将在链接上处理href,这有时是在委托事件处理中使用
    标记的问题。