Я создал конструктор, который будет обрабатывать пользовательский элемент управления списком. Я создал метод, чтобы позволить пользователю добавлять элементы в список, и мне нужно назначить обработчики событий событиям щелчка элементов списка (div).Javascript: назначить onclick внутри класса
Упрощенная версия кода находится здесь. Элементы списка создаются с использованием свойства innerHTML и шаблона строки, на котором я заменяю определенные части. Позже я получить элемент по его идентификатору и присвоить ему функцию закрытия:
function prueba(){
var plantilla = '<div id="«id»">«texto»</div>';
var f = function(nombre){
return function(){console.log('mi nombre es ' + nombre)};
};
this.agregar = function(id, texto){
var tmp = plantilla.replace('«id»', id);
tmp = tmp.replace('«texto»', texto);
document.body.innerHTML += tmp;
document.getElementById(id).onclick = f(id);
};
};
Проблема заключается в том, что, по-видимому, обработчик событий unasigned предыдущих созданных дивы, так только удерживается последним, так как его можно проверить при помощи нижеуказанного кода:
var p = new prueba;
p.agregar('i1', 'texto1');
console.log(document.getElementById('i1').onclick.toString());//shows the function code
p.agregar('i2', 'texto2');
console.log(document.getElementById('i2').onclick.toString());//shows the function code
console.log(document.getElementById('i1').onclick.toString());//returns 'null' error
p.agregar('i3', 'texto3');
console.log(document.getElementById('i3').onclick.toString());//shows the function code
console.log(document.getElementById('i2').onclick.toString());//returns 'null' error
Это происходит в Iceweasel, а также в Chromium. Это НЕ произойдет, когда я добавлю «onclick = f (« id »)» в шаблон (который я не могу сделать здесь из-за выделенной области функции), и это не происходит, если я использую document.createElement. Что я делаю не так?
insertAdjacentHTML действительно решает проблему, спасибо !. У меня есть еще одно сомнение: вы говорите, что это уничтожает ранее созданные элементы, но единственное, что уничтожено, - это назначенная им функция (я действительно вижу новые divs со своим соответствующим текстом). Является ли функция считанной новым элементом? –
@CarlosPrieto: он уничтожает элементы, а также все, что связано с ними, например функции обработчика событий. Затем он воссоздает их. Это очень неэффективно. Скажем, что у вас есть всего 100 узлов DOM в 'body'. Что происходит, так это то, что движок JS должен проходить через * каждый * узел, преобразовывать их в строку HTML, добавлять новый HTML в конец этой строки, уничтожать старые узлы, анализировать только что созданный HTML, создавать новые узлы и положить их в «тело». Так что да, это в основном уничтожает их, а затем воссоздает их, что является расточительным. –
... есть * могут быть некоторые оптимизации, чтобы сделать его несколько более эффективным, чем тот, но кто знает. Принцип разрушительный и определенно уничтожает обработчики событий и другие вещи, поэтому '.insertAdjacentHTML' помогает очень. –