选择Javascript动态onChange事件

时间:2011-11-14 13:44:47

标签: javascript html select web

我有这个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永远是最后一个元素。

1 个答案:

答案 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"];