За последние 24 часа нас посетили 34960 программистов и 1737 роботов. Сейчас ищут 804 программиста ...

Не работает событие onclick на странице со многими импутами (PHP + JS)

Тема в разделе "PHP для новичков", создана пользователем rugleb, 27 ноя 2016.

  1. rugleb

    rugleb Новичок

    С нами с:
    27 ноя 2016
    Сообщения:
    25
    Симпатии:
    0
    История такая. Разметка лежит в php файле, который инклюдит еще один файл.
    Код (Text):
    1. <div id="table-container">
    2.                     <table id="select-table">
    3.                         <tbody>
    4.                             <?php include 'dynamic_content.php' ?>
    5.                         </tbody>
    6.                     </table>
    7.                 </div>
    8.                 <div id="main-content-left"></div>
    Этот dynamic_content берет из MySQL данные и выводил их в таблицу. Это все работает и все здорово. Вставка происходит следующим образом:
    Код (Text):
    1.     while($data = $result->fetch())
    2.     {
    3.         echo "
    4.                 <tr id=\"id_patient\">
    5.                     <td>".$data['firstName']."</td>
    6.                     <td>".$data['secondName']."</td>
    7.                     <td>".$data['address']."</td>
    8.                     <td>".$data['passport']."</td>
    9.                     <td>".$data['diagnosisIn']."</td>
    10.                     <td>".$data['dateIn']."</td>
    11.                     <td>".$data['id_ward']."</td>
    12.                     <td><input type=\"button\" value=\"Редактировать\" class=\"button\" /></td>
    13.                 </tr>
    14.         ";
    15.     }
    Как видите, добавляется в каждой последней колонке инпут вида кнопки. В плане функционала все мне тут нравится. Таблица динамически меняется с помощью ajax когда пользователь меняет отделение в select-е (см скрин).

    И вот проблема. По клику на "редактирование" должно происходить редактирование с написанное на JS (это я напишу), но скрипт не распознает это нажатие, то есть я тыкаю на инпуты, а он не понимает. В чем может быть проблема, перепробовал все возможные варианты, но бестолку?

    Предварительный код:
    Код (Text):
    1. $(document).ready(function() {
    2.  
    3.     $('input.button').click(function() {
    4.         alert("Hello!");
    5.     }  
    6.  
    7. });
    Без имени-1.jpg
     
  2. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    В таких случаях используется делегированная обработка событий. Т.е. обработчик устанавливается не на сам элемент, а на какой-нибудь его родительский статичный элемент. В принципе, это может быть даже document
    Код (Javascript):
    1. $(document).on('click', 'input.button', function(){
    2.      // ...
    3. });
     
    denis01 нравится это.
  3. rugleb

    rugleb Новичок

    С нами с:
    27 ноя 2016
    Сообщения:
    25
    Симпатии:
    0
    Спасибо!

    А с чем связано то, что мой вариант не работает и в чем конкретно отличия? Хочется суть проблемы понять
     
  4. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    В общем-то, тут всё просто. JS работает с теми элементами, на которые ему конкретно указали. То есть, в jQuery вы устанавливаете обработчик, указав какой-то селектор, но "за кулисами" в самой библиотеке, работает нативный JS, а значит событие устанавливается на каждый элемент отдельно:
    Код (Javascript):
    1. // код jQuery
    2. $('.some_class').on('click', foo);
    3. // Как отрабатывает в библиотеке (примерно)
    4. [].forEach.call(document.querySelectorAll('.some_class'), function(el){
    5.    el.addEventListener('click', foo);
    6. });
    Пробегаемся в цикле по элементам с классом "some_class" и на каждый отдельно устанавливаем обработчик. Если в DOM динамически появляется какой-то еще элемент, пусть и с таким же классом, то на него обработчик не устанавливался. Делегированная обработка работает по другому принципу, за счет "всплытия событий" (bubbling): установили обработчик на статичный родительский элемент, а в callback-функции проверяем на каком именно элементе сработало событие. Если, как в примере выше, у этого элемента есть класс "some_class", то всё гуд, выполняем какое-то действие.
     
    denis01 нравится это.
  5. rugleb

    rugleb Новичок

    С нами с:
    27 ноя 2016
    Сообщения:
    25
    Симпатии:
    0
    То есть получается так: браузер загрузил страницу, сразу поставил на каждый мой элемент обработчик, а потом когда аякс меняет мне дом, добавляя новые элементы - на них обработчик не встал? А в вашем пример за счёт того, что обработчик стоит на родителе, то по сути он обрабатывает клик на родитель, а тот уже определяет конкретику на ребёнке?
     
  6. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Получается... если не вдаваться в подробности и терминологию.
    --- Добавлено ---
    Для лучшего понимания, маленький пример
     
    denis01 нравится это.
  7. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Получается, что прежде, чем пилить что-то сложнее автопрокрутки, с использованием JQuery, надо сначала изучить JavaScript как он есть.
     
    denis01 нравится это.
  8. rugleb

    rugleb Новичок

    С нами с:
    27 ноя 2016
    Сообщения:
    25
    Симпатии:
    0
    Спасибо большое, разобрался!)