在current&上运行匿名函数未来的元素?

时间:2014-06-02 17:59:39

标签: javascript jquery

我希望能够在指定的未来元素成为DOM的一部分后运行匿名函数。我找不到答案。我需要一个冒泡的跨浏览器事件,并且只在元素创建或准备就绪时运行一次,或者沿着那些线运行。

Internet Explorer有“激活”事件,这正是我所需要的,除了它只在IE中。我尝试在Chrome中使用DOMActivate事件,但是当我在文本输入框上测试它时,它表现得很奇怪。它只会在单击元素时触发,并且连续触发两次。它的作用就像一个被触发两次的焦点事件,这没有用。

这是我想要完成的一个例子:

            $('body').on('activate', '.date-picker', function () {
                $(this).datepicker({
                    dateFormat: 'mm/dd/yy'
                });
            });

            $('body').on('DOMActivate', '.date-picker', function () {
                $(this).datepicker({
                    dateFormat: 'mm/dd/yy'
                });
            });

我意识到我可以使用回调将其放在DOM上,或者通过触发我自己的事件来完成此操作,但我正在寻找更清晰的解决方案。

编辑:

我让它像这样工作:

            $('body').on('activate', '.date-picker', function (e) {
                $(this).datepicker({
                    dateFormat: 'mm/dd/yy'
                });
            });
            var activateSupported = 'onactivate' in document.documentElement;
            if (!activateSupported) {
                $(document).bind('DOMNodeInserted', function (e) {
                    var target = $(e.target);
                    target.trigger('activate');
                    target.find('*').trigger('activate');
                });
            }

这不是很理想,因为它必须在IE以外的浏览器中进行所有这些额外的函数调用。有人有更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

由于此插件的工作方式(在您关注输入之前它是不可见的),您可以使用事件委派来延迟绑定插件。

$(document).on("focus", ".date-picker", function (e) {
    e.preventDefault();
    $(this).removeClass(".date-picker").datepicker({dateFormat: 'mm/dd/yy'}).focus();
});

第一次聚焦时,它会被初始化。初始化之后,重新触发焦点事件以使日期选择器打开。通过删除.date-picker类,我阻止它在后续焦点事件上重新初始化datepicker。