为什么它不起作用
您的代码不起作用的原因是:
i
将具有立即执行的代码的正确值(例如show
andhover
调用)。但是,由于 JavaScript 的工作方式,这不适用于回调(例如你给的回调hover
)。JavaScript 将记住变量,而不是提供回调时变量的值。直到循环完成后才会调用回调。这就是为什么在回调i
中总是5,因为那是i
最后一个值。
您可以在此处阅读更多相关信息:闭包 (MDN)
另外,请注意id
'必须是唯一的。您不能将id
“菜单”赋予五个不同的元素;这就是课程的用途。换句话说:你的代码已经得到了id
和class
倒退。
如何使它工作
规避闭包“问题”的最简单方法是$(this)
在回调函数内部使用。在 jQuery 中,this
回调函数中的关键字总是指向触发事件的对象。通过使用$(this)
你有完全正确的 jQuery 对象,没有任何大惊小怪:
for (i=1; i<=menu_h_number; i++)
{
var currentItem = $(".web_header_mb_" + i);
currentItem
.show(1000)
.css("background", "#FF0000");
.hover(
function() { // mouseenter
$(this).css("width", 200); // <--
},
function() { // mouseleave
$(this).css("width", 300); // <--
});
}
我在上面的代码中做的另一件事是将 jQuery 对象缓冲在一个局部变量 ( currentItem
) 中。这使您的代码更快,因为您只需查找元素一次(而不是 6 次,在这种情况下)。你应该尽可能地这样做。
此外,如您所见,该hover
功能不仅适用于mouseover
事件。你可以给它回调来处理mouseover
和mouseout
。
正如其他人已经建议的那样,您可以做的另一件事是使用单个类而不是 5 个不同的类。如果查询匹配多个对象,jQuery 函数 ( $()
) 实际上会返回一个集合。
因此,给定以下 HTML:
<div class="menu web_header_mb"></div>
<div class="menu web_header_mb"></div>
<div class="menu web_header_mb"></div>
<div class="menu web_header_mb"></div>
<div class="menu web_header_mb"></div>
您可以使用each(),如下所示:
$(".menu.web_header_mb").each(function() {
$(this)
.show(1000)
.css("background", "#FF0000");
.hover(
function() { // mouseenter
$(this).css("width", 200);
},
function() { // mouseleave
$(this).css("width", 300);
});
});
甚至这样:
$(".menu.web_header_mb").
.show(1000)
.css("background", "#FF0000");
.hover(
function() { // mouseenter
$(this).css("width", 200);
},
function() { // mouseleave
$(this).css("width", 300);
});
最后一个有效,因为show()、css()和hover()都适用于 jQuery集合(以及单个 jQuery 对象)。整齐吧?