有代码如下:
1 2 3 4 5 6 7 8 9
| var lists = document.getElementsByTagName('li'); var oVideo = document.getElementsByTagName('video')[0]; oVideo.currentTime = 1; for (var i = 0; i < lists.length; i++) { lists[i].onclick = function () { oVideo.src = films[i]; oVideo.currentTime = 1; } }
|
由于执行事件时i已经被销毁,无法再获取到,for循环是一个外部闭包,依次绑定的点击事件是一个函数实例,也产生了一个闭包域,它引用了外部闭包的变量i
有两种解决方法:
1 2 3 4 5 6 7 8 9 10
| var lists = document.getElementsByTagName('li'); var oVideo = document.getElementsByTagName('video')[0]; oVideo.currentTime = 1; for (var i = 0; i < lists.length; i++) { lists[i].saveSub=i; lists[i].onclick = function () { oVideo.src = films[this.saveSub]; oVideo.currentTime = 1; } }
|
- 在循环中的点击事件套一个自调用函数,将
i的值传递进去
1 2 3 4 5 6 7 8 9 10
| var lists = document.getElementsByTagName('li'); var oVideo = document.getElementsByTagName('video')[0]; oVideo.currentTime = 1; for (var i = 0; i < lists.length; i++) { (function (arg) { lists[arg].onclick = function () { oVideo.src = films[arg]; oVideo.currentTime = 1; }})(i) }
|