|
|
|
| При формировании списка с помощью php javascript в каждом элементе работает. Но если потом дополнить этот список таким же элементом при помощи ajax+js, то "активное" содержимое этого добавленного элемента списка перестаёт работать. Добавление осуществляется вот так container.innerHTML = req.responseText; ну и далее вставляется в документ через DOM. Да, я знаю, что когда используешь innerHTML js не работает. А как сделать чтобы работало? | |
|
|
|
|
|
|
|
для: Eblinkoff
(04.11.2014 в 09:18)
| | Нет не так. Не работает не потому, что добавлено в тело документа посредством innerHTML, а потому, что обработчики событий будут работать только у тех элементов, которые существовали на странице во время ее загрузки, то есть на которые они были установлены посредством скрипта.
Чтобы такие же обработчики работали и у динамически добавляемых элементов их нужно определить, а еще лучше делегировать обработку событий общему родителю, тогда сколь бы вы не добавляли элементов, все обработчики для них будут работать. И это гораздо эффективнее, нежели навешивать обработчик на каждый элемент. | |
|
|
|
|
|
|
|
для: confirm
(04.11.2014 в 09:29)
| | О, замечательная идея, спасибо! Не совсем понимаю, правда, как это сделать практически ( в смысле, делегировать обработку общему родителю.) Подскажите пожалуйста, где об этом можно почитать, а то не соображу что в гугле набирать :-))
А, уже нашёл: http://learn.javascript.ru/event-delegation | |
|
|
|
|
|
|
|
для: Eblinkoff
(04.11.2014 в 09:51)
| | Как у вас устанавливаются обработчики, что используется - Javascript в чистом виде или же jQuery?
В примере ниже посредством innerHTML вставляется кнопка, у которой есть нативный обработчик:
<button onclick="document.getElementById('ctr').innerHTML='<button onclick=\'alert(event)\'>Alert</button>'">Click</button>
<div id="ctr"></div>
|
и он будет работать у вставленной кнопки.
Если элементам А, В, С на странице при ее открытии устанавливаются обработчики addEventListener... или если используется jQuery - $(selector).click()..., то инициализация этих обработчиков будет определена только для элементов А, В, С, а для элементов добавляемых динамически нужно производить такую установку обработчика после добавления элемента в документ.
Другой способ это делегирование обработки события за счет того, что почти все события всплывают вверх и его можно перехватить на любом уровне вложенности иерархии объектов.
Пусть имеется таблица, в которой нужно обрабатывать щелчки по ее строкам. Значит можно делегировать обработку этих событий их общему родителю - элементу TABLE, где эти события будут перехвачены и обработаны.
В функцию обработчик передается не само событие, а сразу его источник, затем определяется нужный и производится действие.
Функция добавления строк в таблицу добавляет ячейки ее не методом insertCell(), а заполняется указанным html-содержимым, и как видите, сколь бы строк не добавлялось щелчки по ним будут обрабатываться также, как и у изначально имеющихся первых двух строках таблицы.
<script>
function addRow() {
var t = document.getElementById('tb'), n = t.rows.length+1;
t.insertRow(-1).innerHTML = '<td>'+n+'</td><td>text</td>';
}
function eventRow(e) {
while(e.tagName != 'TABLE') {
if(e.tagName == 'TR') {
alert(e.firstChild.innerHTML);
break;
}
e = e.parentNode;
}
}
</script>
<button onclick="addRow()">Add Row Table</button>
<table id="tb" border="1" onclick="eventRow(event.target || event.srcElement)">
<tr><td>1</td><td>text</td></tr>
<tr><td>2</td><td>text</td></tr>
</table>
|
В jQuery делегирование обработки событий производится так. Прочтите, это не сложно для понимания. Соответственно поступите в своем случае. | |
|
|
|
|
|
|
|
для: confirm
(04.11.2014 в 11:17)
| | Спасибо, помогло! Ну, как, помогло, да не совсем. Всё равно не работают методы типа removeChild, но работает хотя бы .style.display = "none"; (надо удалить элемент из списка) :-(( | |
|
|
|
|
|
|
|
для: Eblinkoff
(05.11.2014 в 07:34)
| |
<script>
function add_remove() {
var e = document.getElementById('elm');
e.innerHTML = '<span>Added</span>';
setTimeout(function() {
e.removeChild(e.firstChild);
//или
// e.innerHTML = '';
}, 1000);
}
</script>
<button onclick="add_remove()">Add/Remove Element</button>
<div id="elm"></div>
|
Надо просто изучать язык, а не действовать наугад. | |
|
|
|