爲什麼它不工作
您的代碼不工作的原因:您還可以鏈的方法,無需每次調用選擇是這樣的:
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