JavaScript не запускается после добавления

Я пытаюсь создать форму, которая позволяет пользователю редактировать ввод через новое окно. PHP обработает вход, а затем добавит новый ввод с новыми значениями. По-видимому, когда я пытаюсь редактировать добавленный ввод, JavaScript просто не срабатывает. Пожалуйста, просветите меня, что я сделал не так. Это мой html-код:

<html> <head> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <script> $(document).ready(function(){ $('.races').click(function(e){ console.log("Inside Testing"); e.preventDefault(); var currID = this.id; var content = '<form id="theForm" action="ct.php" method="post"> Race: <input type="text" id="race" name="race"><button type="submit" onClick="OKClicked()">Click this!</button></form>'; childWin = window.open('', "_blank", "height=400, width=550, status=yes, toolbar=no, menubar=no, location=no,addressbar=no"); toBeAdded = $(this).closest('div'); childWin.document.close(); childWin.document.write(content); popupRace = childWin.document.getElementById("race"); parentRace = document.getElementById(currID); transferValues(); }) }); function transferValues() { popupRace.value = parentRace.value; } function setValue(text) { childWin.close(); toBeAdded.parent().append(text); toBeAdded.remove(); } </script> </head> <body> <div> Name: <input type="text" name="name"> </div> <div> <div> <input type="hidden" name="race-0" value="Human" id="race-0"> <span>race: Human</span> <a href="javascript:void(0)" class="races" id="race-0">Edit</a> </div> </div> <div> Name: <input type="text" name="name"> </div> <div> <div> <input type="hidden" name="race-1" value="God" id="race-1"> <span>race: God</span> <a href="javascript:void(0)" class="races" id="race-1">Edit</a> </div> </div> </body> </html> 

И это мой php-код:

 <?php $postDataKey = array_keys($_POST); $text = ""; foreach ( $postDataKey as $currPostKey ) { $currValue = $_POST[$currPostKey]; $text .= '<div><input type="hidden" name="'.$currPostKey.'-1" value="'.$currValue.'" id="'.$currPostKey.'-1"><span>'.$currPostKey.': '.$currValue.'</span> <a href="javascript:void(0)" class="races" id="race-1">Edit</a></div>'; } echo ' <html> <head> <script> window.opener.setValue(\''.$text.'\'); </script> </head> </html> ' ; ?> 

jQuery знает только о элементах страницы на момент запуска, поэтому новые элементы, добавленные в DOM, не распознаются jQuery. Для борьбы с этим использованием делегирования событий, барботирование событий из вновь добавленных элементов до точки в DOM, которая была там, когда jQuery выполнялся при загрузке страницы. Многие люди используют document в качестве места, чтобы поймать событие с пузырьками, но нет необходимости идти так высоко в дерево DOM. В идеале вам следует делегировать ближайший родитель, который существует во время загрузки страницы.

Вероятно, вы захотите изменить обработчики событий, чтобы они использовали метод on() .

Это было решено в более старых версиях jQuery с live функцией, противоположной функции bind .

  • Функция bind привязывала событие ко всем соответствующим элементам, если они существовали в момент выполнения. Любой элемент, добавленный впоследствии, будет исключен.
  • live funciton присоединяет событие к любому совпадающему элементу, даже если элемент был создан после выполнения команды.

В текущей версии jQuery bind и live были заменены on . Поведение по умолчанию on() похоже на bind . К счастью, есть способ использовать так, чтобы он работал как live .

Я написал статью об этом , что может помочь вам понять, как это сделать.

Подвести итог…

 // This behaves like `bind` $(".clickable").on("click", function(){...}); // This behaves like `live` $(".parent-element").on("click", ".clickable", function(){...}); 

Так что просто найдите общий родительский элемент, который мог бы иметь все возможные элементы (вы могли бы использовать $(document) если не хотите слишком сильно думать), и вы золотые.

jQuery on Method – это то, что вы ищете; щелкните ссылку и найдите делегированные события.

«Делегированные события имеют то преимущество, что они могут обрабатывать события из элементов-потомков, которые будут добавлены в документ позже».