【发布时间】:2015-11-20 14:07:39
【问题描述】:
基本上我正在为 html5 视频元素创建一个自定义视频控制栏。一切正常,除了我使用范围输入元素的搜索栏。
现在,对于控制栏中的每个元素,我将其分配给 js 函数中的一个变量,该变量在窗口加载和添加事件侦听器时被调用。像这样:
function handleWindowLoad() {
var video = document.getElementById ("video");
var playPause = document.getElementById ("playPause");
var muteUnmute = document.getElementById ("muteUnmute");
var fullScreen = document.getElementById ("toggleFullscreen");
var scrubSlider = document.getElementById ("seekBar");
playPause.addEventListener ("click", togglePlay);
muteUnmute.addEventListener("click", toggleMute);
fullScreen.addEventListener("click", toggleFullscreen);
scrubSlider.addEventListener("change", scrubVideo);
}
所有事件处理程序都可以顺利工作。
例如:
function togglePlay() {
if (video.paused) {
video.play();
playPause.innerHTML = "Pause";
}
else {
video.pause();
playPause.innerHTML = "Play";
}
}
工作得很好。
但是,scrubSlider 事件处理程序,scrubVideo():
function scrubVideo() {
var scrubTime = video.duration * (scrubSlider.value/100);
video.currentTime = scrubTime;
}
抛出“scrubSlider undefined”错误。
事件监听器工作正常,因为 scrubVideo() 在预期时被调用,但在 handleWindowLoad() 函数之外我无法访问 scrubSlider。我尝试过解决此错误的唯一方法是使用 document.getElementById 而不是 var 或全局声明 scrubSlider。
我觉得这很有趣,因为 scrubSlider 和其余元素之间的唯一区别是,有问题的元素是 <input> 而不是 <button> 并且正在侦听的事件是“更改”而不是“点击”。
这个错误是由 HTML 元素的某种固有功能造成的,还是由于我忽略的更微不足道的原因?
【问题讨论】:
-
不针对 OP:我讨厌人们仅仅因为提问的人是一个犯了简单错误的新手而对问题投反对票。如果有人搜索“JavaScript 作用域是如何工作的”,他也很可能会发现这一点,但他不会仅仅从它显示的错误中知道这一点。
-
@JonathanG 问题标题不应包含标签。请不要重新编辑标签。
标签: javascript html scope addeventlistener