为什么它不工作
您的代码不工作的原因:您还可以链的方法,无需每次调用选择是这样的:
i
将具有正确的代码立即执行的值(例如show
和d呼叫)。但是,由于JavaScript的工作方式,这不适用于回调(例如您给hover
的那个)。 JavaScript将记住提供回调时变量的变量,而不是值。在循环完成后,将不会调用回调。这就是为什么在回调i
将永远是,因为这是i
的最后值。
你可以阅读更多有关在这里:Closures (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
function不只是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() and hover() all wor k on jQuery 集合(以及单个jQuery对象)。整洁,嗯?
而不是一个for循环,我认为这将是一个更清洁的一个或两个CSS类,减少JavaScript的单行左右。 – 2012-08-02 18:22:16
我删除了您添加的新代码,因为您提出了**新问题**。请把它作为一个新问题发布。您仍然可以[在修订版中找到代码](http://stackoverflow.com/posts/11783427/revisions)。 – PPvG 2012-08-02 19:09:38
啊好吧我想我可以把更多的东西,并继续后,好的,我会创建新的职位 – Fran 2012-08-02 19:13:18