Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как обойти innerHTML?
 
 автор: Eblinkoff   (04.11.2014 в 09:18)   письмо автору
 
 

При формировании списка с помощью php javascript в каждом элементе работает. Но если потом дополнить этот список таким же элементом при помощи ajax+js, то "активное" содержимое этого добавленного элемента списка перестаёт работать. Добавление осуществляется вот так container.innerHTML = req.responseText; ну и далее вставляется в документ через DOM. Да, я знаю, что когда используешь innerHTML js не работает. А как сделать чтобы работало?

  Ответить  
 
 автор: confirm   (04.11.2014 в 09:29)   письмо автору
 
   для: Eblinkoff   (04.11.2014 в 09:18)
 

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

  Ответить  
 
 автор: Eblinkoff   (04.11.2014 в 09:51)   письмо автору
 
   для: confirm   (04.11.2014 в 09:29)
 

О, замечательная идея, спасибо! Не совсем понимаю, правда, как это сделать практически ( в смысле, делегировать обработку общему родителю.) Подскажите пожалуйста, где об этом можно почитать, а то не соображу что в гугле набирать :-))
А, уже нашёл: http://learn.javascript.ru/event-delegation

  Ответить  
 
 автор: confirm   (04.11.2014 в 11:17)   письмо автору
 
   для: 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 делегирование обработки событий производится так. Прочтите, это не сложно для понимания. Соответственно поступите в своем случае.

  Ответить  
 
 автор: Eblinkoff   (05.11.2014 в 07:34)   письмо автору
 
   для: confirm   (04.11.2014 в 11:17)
 

Спасибо, помогло! Ну, как, помогло, да не совсем. Всё равно не работают методы типа removeChild, но работает хотя бы .style.display = "none"; (надо удалить элемент из списка) :-((

  Ответить  
 
 автор: confirm   (05.11.2014 в 08:51)   письмо автору
 
   для: 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>


Надо просто изучать язык, а не действовать наугад.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования