Цикл CKEditor работает только в последнем случае - PullRequest
3 голосов
/ 21 сентября 2011

Я пытаюсь установить фокусное событие для всех моих текстовых областей CKEditor на странице.Вот код, который загружается в готовый документ jQuery:

for (var i in CKEDITOR.instances) {
    alert(CKEDITOR.instances[i].name);
    CKEDITOR.instances[i].on('focus', function() {
        alert(CKEDITOR.instances[i].name);
        remove_invalidation(CKEDITOR.instances[i].name);
    });
}

(Примечание: remove_invalidation () - это функция, которую я написал, которая просто удаляет некоторые CSS-форматирование текстовой области. Это не должно влиять на проблему.)

Я добавил пару предупреждений, чтобы увидеть, что происходит.Итак, сразу же, как и ожидалось, когда событие готовности документа запускает этот код, я получаю одну текстовую область за другой с именами каждой из текстовых областей CKEditor.Это работает.

Но когда я щелкаю внутри любой текстовой области, чтобы сфокусировать ее, в предупреждении всегда появляется имя последней текстовой области на странице.

Ответы [ 2 ]

7 голосов
/ 21 сентября 2011

попробуйте это:

for (var i in CKEDITOR.instances) {
    (function(i){
        alert(CKEDITOR.instances[i].name);
        CKEDITOR.instances[i].on('focus', function() {
           alert(CKEDITOR.instances[i].name);
           remove_invalidation(CKEDITOR.instances[i].name);
        });
    })(i);
}

проблема заключалась в том, что вы использовали один и тот же i в каждом событии, находящемся в фокусе, и что меня увеличивали до значения для последнего редактора.Помещение кода в немедленно выполняемую функцию решает эту проблему, предоставляя коду собственную область действия.

1 голос
/ 01 марта 2017

Перефразируя статью MDN Закрытия (раздел «Создание замыканий в циклах: распространенная ошибка»):

В цикле было создано несколько замыканий, но каждое разделяет та же единая лексическая среда, которая имеет переменную с изменением значения (i). Значение i определяется, когда on('focus') обратные вызовы выполняются. Поскольку цикл уже запустил Конечно, к тому времени, переменная i (общая для всех замыкания) было оставлено, указывая на последнюю запись в CKEDITOR.instances список.

...