使用JavaScript的事件委托
Event delegate with JavaScript
我有一个div列表,我想向其中添加"onmouseover"事件。我尝试迭代元素列表,并重新定义"onmouseover"函数,如下所示:
for (var i=0; i<3; i++) {
elements[i].onmouseover = function() { alert('FOO') };
}
不幸的是,在页面加载完成后,它看起来只应用于最后一个元素。我确信这是一个真正的新手问题,但我仍然没有弄清楚。。。
这里有一个更好的例子来展示我的问题:http://jsfiddle.net/qajPM/
您可以做的一件事是,不必为每个div
分配一个事件处理程序,而是可以为父级分配一个处理程序,然后简单地根据事件目标获取鼠标悬停在哪个div
上。
HTML:
<div id="parent">
<div>1</div>
<div>2</div>
<div>3</div>
</div>
Javascript:
document.getElementById('parent').onmouseover = function(e) {
var target = e.target || e.currentTarget;
alert('Target ' + target.innerHTML + ' was moused over');
};
Fiddle:http://jsfiddle.net/ZhpLA/
正如其他人所指出的,jQuery也使它的代码略少(尽管如果这就是你所需要的全部,那就毫无意义了):
$('#parent').on('mouseover', 'div', function(e) {
alert('Target ' + e.currentTarget.innerHTML + ' was moused over');
});
上述jQuery代码的优点是它将同时应用于#parent
的当前和未来子div
。如果您以程序方式添加更多mouseover
事件也将继续为他们工作。
问题是您创建的所有div元素如下:
parent.innerHTML += "<div> " + i + "</div>"
我相信你知道这相当于parent.innerHTML = parent.innerHTML + ...
,但.innerHTML
属性以字符串的形式返回html(没有任何已经关联的事件处理程序),所以每次这样做都会用一个新的字符串覆盖parent
div的整个innerHTML,这意味着你有效地添加到了文本内容中,但却破坏了已经设置的mouseover
处理程序。
试试这样的东西:
var el = document.createElement("div");
el.innerHTML = i;
parent.appendChild(el);
它在不影响现有元素的情况下附加一个新元素。
更新的演示:http://jsfiddle.net/qajPM/1/
相关文章:
- 召回窗口加载事件 - javascript
- 动态创建OnClick事件Javascript
- 全局屏幕span onclick触发一个事件javascript
- 使用react js在跨域上执行事件javascript
- 在change事件javascript上动态添加行
- 在粘贴事件Javascript的输入字段中删除所有非数字字符
- 如何在多表单的输入框中使用输入事件javascript
- 无法查看特定信息.单击事件.Javascript
- 两个文本框事件Javascript
- 阻止鼠标滚轮滚动,但不阻止滚动条事件.JavaScript
- 从 onkeydown 事件 (Javascript) 获取当前用户输入
- “稍后提醒我”/“快速事件”JavaScript解决方案
- 更改我正在侦听的事件Javascript的对象的CSS
- setInterval 不允许同时单击事件 - javascript
- 对每种情况使用一个事件(JavaScript 开关)
- 仅创建第二次点击事件 Javascript
- 每 60 秒仅启动一次事件 (JavaScript)
- 如何连接来自不同文件的事件?Javascript/Backbone
- URL 更改事件 - JavaScript
- 无法在无头模式下使用 watir Webdriver 执行按钮元素的 onclick 事件 javascript