无法附加事件处理程序

时间:2014-05-16 14:10:59

标签: javascript jquery jquery-plugins nested-lists

using this plugin来管理分层数据。现在,我想要做的就是收听onclick事件。是的,这听起来像愚蠢,但它根本不起作用!

问题是元素确实存在,但是无法将侦听器附加到它们上面!

        $('#nestable2').find('.dd-handle, .dd-item').on('click', function(e){
            alert("Test");
        });

有人遇到过这个问题吗?

更新

  • 是的,它内部DOM Ready
  • $('#nestable2').find('.dd-handle, .dd-item').length不会返回0,但会返回更大的值
  • 我已经尝试了事件授权和"常规"事件监听器

2 个答案:

答案 0 :(得分:1)

如果您完全确定$('#nestable2').find('.dd-handle, .dd-item')实际返回元素,那么实际可能发生的是您在其他位置取消注册该元素的单击处理程序。这看起来像这样:

$('.dd-handle, .dd-item').off("click")

它甚至可能更加模糊,例如$("button").off("click")

如果您的代码库很大,则很难找到。

你可以做的一个巧妙的技巧是利用jQuery的特殊事件。 您可以添加一个在每次添加或删除事件处理程序时运行的方法,并在其中放置调试器语句,最后检查它在代码库中的位置(例如使用chrome中的dev工具并检查调用堆栈)

以下是如何做到这一点(在加载jquery之后,在页面中尽快添加此内容):

$.event.special.click = {
  add: function(handlerObj){ debugger; },
  remove: function(handlerObj){ debugger; }
};

handlerObj包含
  型
   事件的类型,在这种情况下,它将点击
  -namespaces    如果有的话,在“on”上提供所有名称空间的字符串   -selector
  -guid
  -数据   -handler

这是一个解释special events

的好资源

不排除已添加的事件处理程序,它们可能会调用stopPropagation,并且这样会对您运行而不是运行的处理程序负责。

答案 1 :(得分:0)

是的,您的活动正在注册元素。但问题是您正在使用的第三方代码。在线的某处,它们会覆盖或取消点击操作。

如果您将click更改为mousedown,您将看到警报,以便证明事件正在注册。

在测试页面上运行

    $('#nestable2').find('.dd-handle, .dd-item').on('click', function(e){
        alert("CLICK");
    }).on('mousedown', function(e){
        alert("mousedown");
    });

我看到了mousedown,而不是点击。