【问题标题】:Event bubbling jQuery .delegate() or .live() after click event单击事件后冒泡 jQuery .delegate() 或 .live() 的事件
【发布时间】:2010-08-05 00:05:22
【问题描述】:

我尝试了很多不同的可能性来实现我认为应该是简单的代码执行。我正在通过.load() 从服务器加载 DOM 对象。其中一个加载的项目是一个带有日期的输入文本框。当我点击输入框时,我想加载 jdpicker(一个插件 datepicker)。由于.live() 和.delegate() 的行为,即使我分别使用.die() 或.undelegate(),我也无法让弹出日期选择器正常运行。它要么弹出,允许我单击窗口中的一个对象,然后立即关闭(我无法在不关闭窗口的情况下浏览数月、数年),或者弹出窗口并且每次后续单击都会重新执行生成多个实例的代码日期选择器。

我尝试了.live()、.delegate()、.one() 的不同组合,但没有成功。我已经在主窗口中测试了日期选择器,并且知道它在那里工作正常。我可以发布代码,但不确定我所做的十种不同尝试中的哪一种是最好的例子。我可以展示我最近的尝试。

有人有合适的例子吗?谢谢!


更新

我已将代码编辑为如下:

$("#edit-entry").load("/edit/", { id:id }, function(){
                $('.jdpicker').one('click', function(){
                    $(this).jdPicker();
                });
});

这取决于成为完整的答案。日期选择器不再调用多个实例,这很好,但我仍然无法导航它的控件(月、年选择)。如果我点击下个月,它将加载并关闭。下次我点击它时,它会在下个月重新打开。所以,它确实有效,但肯定是不可取的。有什么建议吗?

【问题讨论】:

    标签: javascript dom jquery event-delegation


    【解决方案1】:

    你不能用“live”或“delegate”来做到这一点。事实上,您需要在“.load()”成功后显式应用插件初始化。

    edit — 您所做的更改可能不起作用。这是您的英文代码:

    “从 URL '/edit/' 获取内容并将其存放到 id 为 'edit-entry' 的元素中。收到该内容后,将一次性事件处理程序绑定到所有具有“jdpicker”类的元素。在该事件处理程序中,为元素设置“jdPicker”功能。”

    相反,您应该做的只是直接调用 jdPicker 设置,而不是设置它,以便用户必须先点击元素。

    $("#edit-entry").load("/edit/", { id:id }, function(){
        $('.jdpicker').each(function(){
            $(this).jdPicker();
        });
    });
    

    【讨论】:

    • 现在你提到它很有趣,因为你的评论让我回到了我开始的地方。我是新手,所以一切对我来说都是第一次。我接受了您的建议,但仍有一个小问题……请参阅上面的编辑。谢谢!
    • 太棒了,使用 .each 不是我以前看过的东西。它的表现比以前好,但我仍然无法导航。我认为我正在使用的插件可能存在错误。当我选择一个类元素“jdpicker”时,弹出窗口会打开,但下一次点击会关闭它,无论点击发生在哪里。我可以单击导航箭头,只要新日期在可见窗口中,我就可以单击它,或者我可以单击主窗口....每秒钟单击一次关闭窗口,但仅在动态加载代码时...?
    • 好的,我从来没有用过“jdPicker”,所以我不能提供任何具体的建议。
    猜你喜欢
    • 2011-03-19
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 2010-12-30
    • 2011-06-11
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多