Javascript динамическое событие onChange при выборе - PullRequest
0 голосов
/ 14 ноября 2011

У меня есть этот фрагмент 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». Можно это исправить?

EDIT: Я изменил свой фрагмент с этими утверждениями:

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 голосов
/ 14 ноября 2011

Это вызвано поведением 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: ошибка synyax для var selectName["id1","id2","id3"], вы должны использовать var selectName = ["id1","id2","id3"];

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...