jquery - 只运行一次 window.addEventListener 函数
问题描述
我有这个功能,当我滚动到它时会运行一个视频:
var _video = document.getElementById('video-one');
function isScrolledIntoView(element) {
var elementTop = element.getBoundingClientRect().top,
elementBottom = element.getBoundingClientRect().bottom;
return elementTop >= 0 && elementBottom <= window.innerHeight;
}
window.addEventListener("scroll", function() {
if (isScrolledIntoView(_video)) {
_video.play();
}
});
问题是,在视频停止并且我滚动并返回它之后 - 它再次运行。但我只需要它运行一次,只有当我第一次滚动到它时。我尝试将函数标记为运行一次,但它不起作用:
var _video = document.getElementById('video-one');
function isScrolledIntoView(element) {
var elementTop = element.getBoundingClientRect().top,
elementBottom = element.getBoundingClientRect().bottom;
return elementTop >= 0 && elementBottom <= window.innerHeight;
}
var started = false;
if (!started) {
window.addEventListener("scroll", function() {
if (isScrolledIntoView(_video)) {
_video.play();
}
});
started = false;
}
我究竟做错了什么?
解决方案
我们必须传递完全相同的参数以防删除 eventListener。这种方法必须解决问题。原因是 removeEventListener 从处理程序的参数列表中获取所有参数。
我已将 eventPhase 更改为 TRUE 并且可以正常工作。
window.addEventListener('scroll', function(e){
if (isScrolledIntoView(_video)) {
_video.play();
this.removeEventListener(e.type,arguments.callee,e.eventPhase);
}
}, true); // CHANGED HERE!!!!
推荐阅读
- azure-data-lake - 如何在 Azure 数据湖分析和 Azure Databricks 之间进行选择
- javascript - php - js 承诺捕获的返回错误
- c# - Ajax 没有命中控制器方法
- javascript - 是否有任何回调可以在 ajax 发送之后但在成功返回之前用于轮询目的?
- r - 过滤掉转发和回复的 Twitter API 查询
- ios - SceneKit在旋转后获取节点位置
- python - 导入 csv 文件时 csv.reader 和 .read 的区别
- android - 原因:重复条目:com/google/vr/cardboard/AndroidNCompat.class
- bash - 在 shell 脚本 bash 中获取一天的结束时间
- kotlin - RxJava2如何将2个单列表加入一个列表