我有这个javascript片段:
var selectName["id1","id2","id3"];
setOnClickSelect = function (prefix, selectName) {
for(var i=0; i<selectName.length; i++) {
var selId = selectName[i];
alert(selId);
$(selId).onchange = function() {
$(selId).value = $(selId).options[$(selId).selectedIndex].text;
}
}
}
但是当我将值更改为我的id1元素时,警告总是写着“id3”。 我能解决吗?
编辑: 我用这些陈述改变了我的片段:
setOnChangeSelect = function (prefix, selectName) {
for(var i=0; i<selectName.length; i++) {
var selId = selectName[i];
$(selId).onchange = (function (thisId) {
return function() {
$(selId).value = $(thisId).options[$(thisId).selectedIndex].text;
}
})(selId);
}
}
但是selId永远是最后一个元素。
答案 0 :(得分:0)
这是由javaScript Closure的行为引起的,selId
已在循环结束时设置为selectName[2]
,这就是为什么你得到'id3'的原因。
修复如下,关键是将回调函数包装在另一个函数中以创建另一个闭包。
var selectName = ["id1","id2","id3"];
var setOnClickSelect = function (prefix, selectName) {
for(var i = 0; i < selectName.length; i++) {
var selId = selectName[i];
$(selId).onchange = (function (thisId) {
return function() {
$(thisId).value = $(thisId).options[$(thisId).selectedIndex].text;
}
})(selId);
}
};
Ps:var selectName["id1","id2","id3"]
存在synyax错误,您应该使用var selectName = ["id1","id2","id3"];