您可以通過使用一個函數調用來爲每個處理器下一個上下文(見下文),這樣做:
var ratings = new Array("happy", "clean");
for(y = 0; y < 2; y++)
{
for(x = 0; x < 5; x++)
{
fullname = ratings[y] + '_' + x;
(function(thisx, thisy) {
document.getElementById(fullname).onmouseover = function() {
star_rate(ratings[thisy], thisx, 1);
};
document.getElementById(fullname).onmouseout = function() {
star_rate(ratings[thisy], thisx, 2);
};
})(x, y);
}
}
通過傳遞x
和y
作爲參數到工作一個函數,然後建立使用參數,而不是x
和y
外環的版本的事件處理程序。 (我也刪除了上述事件處理程序分配的功能名稱。在函數表達式[,而不是一個函數聲明]使用的名稱是在某些瀏覽器有問題,more here。另外,你叫他們倆onmouseover
,這可能不是你的意思做。:-))
但是,這不是我建議你這樣做。它爲每個元素創建一個新的函數。相反,我可能會將必要的信息作爲屬性存儲在元素本身上,併爲所有這些使用通用函數。這就是HTML5的data-
前綴所適用的(即使在技術上無效的情況下,它現在也能正常工作)。隱約的東西是這樣的:
var ratings = new Array("happy", "clean");
var element;
for(y = 0; y < 2; y++)
{
for(x = 0; x < 5; x++)
{
fullname = ratings[y] + '_' + x;
element = document.getElementById(fullname);
element.setAttribute('data-star-x', x);
element.setAttribute('data-star-y', y);
element.onmouseover = handleMouseOver;
element.onmouseout = handleMouseOut;
}
}
function handleMouseOver() {
star_rate(this.getAttribute('data-star-y'), this.getAttribute('data-star-x'), 1);
}
function handleMouseOut() {
star_rate(this.getAttribute('data-star-y'), this.getAttribute('data-star-x'), 2);
}
你甚至可以使用事件冒泡(因爲鼠標懸停及移出泡沫)掛鉤的整體容器,而不是每個元素的事件,因爲你得到的元素中的數據。 (這有時也被稱爲「事件委託」。)
*「...但是我想可能你的問題是x和y在onmouseover調用中不可見...」*是的,他們是事件處理函數是關閉這些變量的閉包。他們沒有*期望他們擁有的*值。 (順便處理程序被調用時,'y'始終是2和'x'始終是5,禁止其他代碼改變它們的報價代碼完成後。)http://blog.niftysnippets.org/2008/02/closures -are - 不complicated.html – 2010-09-10 14:11:30