的原因是,你要創建(這是一個閉合)事件處理程序有一個持久參考到field
變量,而不是複製它作爲創建功能時的感覺。因此,所有創建的事件處理程序都會看到相同的值field
(分配給它的最後一個值)。
因爲你已經在使用jQuery的,最簡單的解決辦法可能是使用$.each
:
function add_fields_on_change()
{
var map = {
"sponsor" : Array("New Sponsor", "new_sponsor"),
"blurb" : Array("New Blurb Suggestion", "new_blurb")
};
$.each(map, function(field, value) {
alert($('.bound[name='+field+']').val()); //alerts as expected
$('.bound[name='+field+']').change(function() {
alert(map[field][0]); //alerts "New Blurb Suggestion" for both "sponsor" and "blurb" fields
if ($(this).val() == map[field][0])
{
$('.hidden[name='+map[field][2]+']').show();
}
});
});
}
這工作,因爲該事件處理程序密切在呼叫你傳遞each
迭代器功能,所以他們每個人都得到自己的field
參數,這從來沒有改變。
如果你想做到這一點,而無需使用$.each
不管出於什麼原因,你會做這樣的事情:
function add_fields_on_change()
{
var map = {
"sponsor" : Array("New Sponsor", "new_sponsor"),
"blurb" : Array("New Blurb Suggestion", "new_blurb")
};
var field;
for (field in map)
{
alert($('.bound[name='+field+']').val()); //alerts as expected
$('.bound[name='+field+']').change(createHandler(field));
}
function createHandler(f) {
return function() {
alert(map[f][0]); //alerts "New Blurb Suggestion" for both "sponsor" and "blurb" fields
if ($(this).val() == map[f][0])
{
$('.hidden[name='+map[f][3]+']').show();
}
};
}
}
這是同樣的原理,事件處理程序關閉了調用createHandler
並使用f
參數,這對每次調用都是唯一的,而且我們永遠不會分配新的值。
請注意,我聲明瞭field
變量。您的原始代碼缺少該聲明,這意味着您正在墮入Horror of Implicit Globals。
更多閱讀:
你真的應該使用'[「New Sponsor」,「new_sponsor」]'創建一個數組。使用'Array'可能會導致令人驚訝的怪癖 - 請參閱Array(2)'返回的內容。 – pimvdb