在我的页面上,我想要在鼠标移过时突出显示多个部分。这可以使用onmouseover
和onmouseout
来完成。我有超过100个部分,我不认为在每个部分调用方法是非常有效的。像这样。
<li id="1" onmouseover="h(1)" onmouseout="h(1)">
<label>1</label>
</li>
<li id="2" onmouseover="h(2)" onmouseout="h(2)">
<label>2</label>
</li>
<li id="3" onmouseover="h(3)" onmouseout="h(3)">
do something
</li>
...
<li id="4" onmouseover="h(4)" onmouseout="h(4)">
do something
</li>
我希望在Javascript中得到这个答案,因为我不知道jQuery。
答案 0 :(得分:6)
您所追求的是活动委派。这是将事件处理程序绑定到共同的祖先。在你的情况下,它可能是一些事情:
// assuming `ul` refers to the list element that contains those `li` elements
ul.onmouseover = function(event) {
// some cross-browser handling (IE)
event = event || window.event;
var target = event.target || event.srcElement;
// if the event was triggered on a `li` element
if(target.nodeName === 'LI') {
h(this.id); // do the stuff
}
};
这只是一个示例,您必须根据自己的需要进行调整,例如:如果li
元素本身包含元素,则情况会有所不同。
如果您想了解有关事件处理的更多信息,建议您阅读the great articles on quirksmode.org。
那就是说,jQuery会让这更容易,也因为它模拟来自IE的mouseenter
和mouseleave
事件,这些事件更有用,并且照顾交叉 - 浏览器问题。
例如:
$('#listId').on('mouseenter', 'li', function() {
h(this.id);
});
$('#listId').on('mouseleave', 'li', function() {
h(this.id);
});
如果您在事件处理和/或DOM操作方面做了很多工作,那么建议使用jQuery。
答案 1 :(得分:1)
<li id="1" class="btn">
do something
</li>
JS:
<script type="text/javascript">
window.onload = function(){
var allBtns = document.getElementsByClassName("btn");
for (var i = 0; i < allBtns.length; i++) {
allBtns[i].onmouseover = function(){h(this.id)};
allBtns[i].onmouseout = function(){h(this.id)};
}
}
</script>
或:
<ul class="myBTNS">
<li id="1">do something</li>
<li id="2">do something</li>
<ul>
JS:
<script type="text/javascript">
window.onload = function() {
var btnsContainer = document.getElementsByClassName("myBTNS");
for (var i = 0; i < btnsContainer.length; i++) {
var allBtns = btnsContainer[i].getElementsByTagName("li");
for (var i = 0; i < allBtns.length; i++) {
allBtns[i].onmouseover = function() {h(this.id)};
allBtns[i].onmouseout = function() {h(this.id)};
}
}
}
</script>
答案 2 :(得分:1)
非常简单的解决方案:
<强> HTML:强>
对于每个放置/移出鼠标时要执行操作的<li>
个元素,请指定一个类值。在这个例子中,我使用了类名“someclass
”,但是你可以将它改为你觉得最合适的名字。另请注意,元素可以包含多个类。例如<li class="someclass anotherclass"></li>
。
<ul>
<li class="someclass secondaryclass">Example</li>
<li class="someclass">Example</li>
<li class="someclass">Example</li>
<li class="someclass">Example</li>
<ul>
<强> JavaScript的:强>
循环遍历所有具有类名“someclass”的元素,并附加事件侦听器。在这个例子中,我已经减轻了'out
'和'over
'函数声明,但是请看下面的jsFiddle示例以查看它们的运行情况。
for(var i in document.getElementsByClassName('someclass'))
{
document.getElementsByClassName('someclass')[i].addEventListener('mouseover', over ,false);
document.getElementsByClassName('someclass')[i].addEventListener('mouseout', out ,false);
}
http://jsfiddle.net/eVs9L/&lt; - 查看浏览器控制台以查看鼠标输出/输出功能的输出。
jQuery方法:
$('.someclass').hover(function(){
//Mouse Over Code goes here...
}, function(){
//Mouse Out code goes here...
});
答案 3 :(得分:0)
是的,答案是使用jQuery .each。
答案 4 :(得分:0)
您可以使用document.getElementsByTagName获取所有li元素并将它们存储在数组中。然后,只需循环遍历数组并为onmouseover和onmouseout事件分配函数。
var elems = document.getElementsByTagName('li');
for (var i = 0; i < elems.length; i++) {
elems[i].onmouseover = function () {
this.innerHTML = "over";
this.style.background = "yellow";
};
elems[i].onmouseout = function () {
this.innerHTML = "out";
this.style.background = "white";
};
}
Here是jsFiddle演示的链接。我让函数改变了文本和bg颜色,只是为了演示代码实际上在做什么。