ADDEventListener 点击函数在无限滚动期间再次初始化后多次触发

EventListener click function firing multiple times after initialize again during infinite scroll

这是我的第一个问题,所以我尽量准确地描述它并遵循 Whosebug 指南 "How do I ask a good question?"

我的问题:

我正在使用 "old but gold" infinite-scroll jQuery plugin to load the next posts on a wordpress site. Im also using the lazyframe 插件加载 youtube 视频 "lazy" 单击视频的播放按钮。为了在使用无限滚动功能加载一组新帖子后确保延迟框架功能,我通过以下方式初始化延迟框架,将 lazyframe('.lazyframe'); 初始化代码添加到无限滚动 js 的 function(newElements) 部分:

    //infinite scroll
    if ($masonry.length && obj_testsite.infinitescroll != 'disable') {
    nextSelector = obj_testsite.nextselector;
    if (document.URL.indexOf('/source/') != -1) {
        nextSelector = '#navigation #navigation-next a';
    }

    $masonry.infinitescroll({
        navSelector : '#navigation',
        nextSelector : nextSelector,
        itemSelector : '.thumb',
        prefill: true,
        bufferPx : 500,
        loading: {
            msgText: '', // load spinner icon instead of gif images - see below
            finishedMsg: obj_testsite.__allitemsloaded,
            img: '',
            finished: function() {}
        }
    }, function(newElements) {

            lazyframe('.lazyframe');

            var $newElems = $(newElements);
            $('#infscr-loading').fadeOut('normal');
            $masonry.masonry('appended', $newElems, true);                                  
    });
}

到目前为止,一切正常。但是,当我向下滚动并使用无限滚动加载几组帖子然后单击播放按钮时,有时 lazyframe 插件会创建多个 youtube iframe。

到目前为止,我的研究表明,事件多次触发的原因是因为事件多次附加到元素。以下代码显示了 lazyframe 插件使用 addEventListener 函数来定位文档中的元素的部分:

            function n(e) {
            if (e instanceof HTMLElement != !1) {
                var t = {
                    el: e,
                    settings: i(e)
                };
                t.el.addEventListener("click", function() {
                    return t.el.appendChild(t.iframe)
                }), d.videolazyload ? l(t) : s(t, !!t.settings.thumbnail)
            }
        }

知道如何解决这个问题吗?我试图阻止事件传播,但由于缺乏知识而无法修复它。任何帮助将不胜感激。

您在 eventListener 中使用事件捕获。实际上,并非所有浏览器都支持事件捕获(例如,低于 9 的 Internet Explorer 版本不支持)但都支持事件冒泡,这就是为什么它是用于将处理程序绑定到所有 cross-browser 抽象中的事件的阶段, jQuery 包括在内。

最接近您在 jQuery 中查找的内容是使用 on()。 因此,您可以将代码更改为此(事件):

$(t.el).off('click').on('click', function() {
                    return t.el.appendChild(t.iframe)
                });

off() 函数删除您指定的元素上的事件侦听器(在我们的例子中为 'click'),因此您可以尝试此解决方案。

这里是插件作者。感谢您使用它!

插件中存在一个错误,会在重新初始化时在 element/elements 上附加多个事件侦听器。这是在 v1.1.1 中排序的,所以只需更新插件即可。