1

我已经阅读了 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。

4

1 回答 1

3

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

一般来说,动态形式的.on()作品是这样的:

$(static selector that exists).on('click', 'dynamic selector', function() {});

由于您没有向我们展示您的 HTML 或 ajax,我只能列举出可能出错的类型:

  1. 静态选择器表示的对象在.on()调用执行时必须存在。
  2. 静态选择器对象必须是动态对象的父对象。
  3. 动态选择器必须匹配在原始调用时存在或稍后添加的子对象。
  4. 在调用之前您可能会遇到 javascript 错误.on(),因此它永远不会执行。
  5. 您的处理程序函数中似乎有一个 javascript 错误。您引用的代码a.parentElement似乎是错误的。在那种情况下,a是一个 jQuery 事件对象,我不相信它有一个parentElement属性。而且,即使 parentElement 是一个元素,那么你做的下一行target.is(":visible")也不会工作,因为target它不是一个 jQuery 对象。因此,您至少必须修复处理程序函数中的代码。如果这是唯一的错误,那么您应该能够在 javascript 错误控制台或调试控制台中看到这些错误。
于 2013-02-23T01:30:40.057 回答