Javascript EventListener在无限滚动期间再次初始化后多次单击函数激发
这是我的第一个问题,所以我试图尽可能精确地描述它,并遵循stackoverflow准则“我如何提出一个好问题?” 我的问题是: 我使用“老而金”的jQuery插件在wordpress网站上加载下一篇文章。我还使用这个插件来加载youtube视频“懒惰”,只需点击视频的播放按钮。为了确保在使用infinte滚动功能加载一组新帖子后lazyframe的功能,我用以下方式初始化lazyframe,添加Javascript EventListener在无限滚动期间再次初始化后多次单击函数激发,javascript,jquery,wordpress,infinite-scroll,Javascript,Jquery,Wordpress,Infinite Scroll,这是我的第一个问题,所以我试图尽可能精确地描述它,并遵循stackoverflow准则“我如何提出一个好问题?” 我的问题是: 我使用“老而金”的jQuery插件在wordpress网站上加载下一篇文章。我还使用这个插件来加载youtube视频“懒惰”,只需点击视频的播放按钮。为了确保在使用infinte滚动功能加载一组新帖子后lazyframe的功能,我用以下方式初始化lazyframe,添加lazyframe('.lazyframe')初始化代码到无限滚动js的函数(新元素)部分:
lazyframe('.lazyframe')代码>初始化代码到无限滚动js的函数(新元素)
部分:
//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版本不支持),但所有浏览器都支持事件冒泡,这就是为什么它是用于将处理程序绑定到所有跨浏览器抽象(包括jQuery)中的事件的阶段
最接近您在jQuery中查找的内容是使用on()。
因此,您可以将代码更改为此(事件):
off()函数在指定的元素上删除事件监听器(在我们的例子中是“单击”),以便您可以尝试此解决方案。插件作者在此。谢谢你使用它
插件中有一个bug,在重新初始化时会在元素上附加多个事件侦听器。这在v1.1.1中进行了排序,所以只需更新插件,它就可以工作。为什么不通过jquery设置“单击”事件?不要工作Nedim,页面的一半已经消失了。请看一看完整的代码等等,这个点击监听器是在插件中,而不是在你的代码中?不,我指的是github代码,不是wp插件。我把代码手动放在我的自定义js文件中。你能在fiddle上粘贴一些代码,让我能真正弄清楚到底发生了什么吗?
$(t.el).off('click').on('click', function() {
return t.el.appendChild(t.iframe)
});