在循环内部应用mouseover事件侦听器
Applying a mouseover event listener inside of a loop
我有一个按钮(<a class="gmButton"></a>
)和一个<span id="gmToolTip"></span>
,我希望span
在鼠标悬停相关链接时显示某些文本。
要显示的文本是一个名为toolTips
的字符串数组。
gmButtons[i].addEventListener("mouseover", function(){
clearTimeout(t);
t = setTimeout(function() {
gmToolTip.textContent = toolTips[i];
}, 500);
});
gmButtons[i].addEventListener("mouseout", function(){
gmToolTip.textContent = null;
clearTimeout(t);
});
当一个接一个地应用到链接时,代码似乎可以按预期执行。在这样的循环中应用时,它不起作用。我搞砸了什么?
小提琴在这儿:http://jsfiddle.net/d5tpqt5h/1/
问题是,在遍历完所有元素之后,事件侦听器函数就会被触发。这意味着当调用它们时,i
等于9
(并且toolTips[9]
是未定义的,因为数组中最后一个元素的索引比其length
少一个)。
一种选择是将逻辑封装在IIFE中,以获取i
:的当前值
更新示例
for (var i = 0; i < gmButtons.length; i++) {
(function(i) {
gmButtons[i].addEventListener("mouseover", function() {
clearTimeout(t);
t = setTimeout(function() {
gmToolTip.textContent = toolTips[i];
}, 500);
});
gmButtons[i].addEventListener("mouseout", function() {
gmToolTip.textContent = null;
clearTimeout(t);
});
})(i);
}
或者,您也可以使用.bind()
方法将i
的当前值传递给函数:
更新示例
for (var i = 0; i < gmButtons.length; i++) {
gmButtons[i].addEventListener("mouseover", function(i) {
clearTimeout(t);
t = setTimeout(function() {
gmToolTip.textContent = toolTips[i];
}, 500);
}.bind(this, i));
gmButtons[i].addEventListener("mouseout", function() {
gmToolTip.textContent = null;
clearTimeout(t);
});
}
将gmTooltip.textContent = null;
更改为gmToolTip.textContent = null;
gmTooltip到gmTooltip
希望它能有所帮助!
尝试使用innerHTML和闭包:
for (var i = 0; i < gmButtons.length; i++){
(function(i) {
gmButtons[i].addEventListener("mouseover", function(){
clearTimeout(t);
t = setTimeout(function() {
gmToolTip.innerHTML = toolTips[i];
}, 500);
});
gmButtons[i].addEventListener("mouseout", function(){
gmTooltip.innerHTML = null;
clearTimeout(t);
});
})(i);
}
演示
相关文章:
- 如何在for循环中添加事件侦听器
- 未命中服务器发送的事件侦听器
- 如何覆盖原型中的事件侦听器
- 无法将事件侦听器附加到画布
- 如何在d3.js中自定义事件侦听器
- 在es6中,将带有回调的事件侦听器设置为可迭代的
- 事件侦听器未在chrome扩展中的options.js中启动
- IE8更改文本区域上的事件侦听器不工作
- 将事件侦听器添加到文档,而不是签入元素存在,然后添加事件侦听器
- javascript删除事件侦听器
- 我应该/如何清除mousemove JQuery事件侦听器
- 在JQuery中使用谷歌地图Api事件/侦听器
- 如何使用我的Jquery代码创建委托事件侦听器
- 'mousemove'画布中的事件侦听器-指针仅在最后一个矩形中更改
- 为什么此事件侦听器不工作
- 是否可以在数字输入框中的小按钮中添加事件侦听器
- 在Google Chrome扩展中添加事件侦听器
- SVG元素在转换后会丢失事件侦听器
- jQuery事件侦听器多次启动
- 如何在不删除类似侦听器的情况下从父对象中删除jQuery事件侦听器