Моя страница состоит из двух компонентов, зависящих от JavaScript. Слева находится навигация на основе атрибутов (abn). А правая часть - это Результат abn.
Есть обработчик событий для abn и обработчик событий для результата (оба находятся при щелчках) Всякий раз, когда пользователь нажимает на abn, я выполняю вызов Ajax, который возвращает объект JSON, в котором результатом HTML является значение одной из пары ключ / значение. HTML вставляется в компонент результата.
Обработчик событий для результата страницы отлично работает при обновлении страницы. Он перестает работать, когда я вставляю содержимое HTML в слот результата после вызова Ajax. Я проверил, что в результате есть все div и классы, от которых зависит мой JavaScript.
Думаю, когда я заменил HTML-контент, обработчик JavaScript просто перестал работать. Может кто-нибудь объяснить, почему это происходит и как я могу это решить?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы вставили элемент с таким же идентификатором (повторяющийся идентификатор)?
как вы заменяете html-содержимое результата? Я предполагаю, что у вас есть обработчик событий, определенный при загрузке страницы, но вы перезаписываете элемент dom новым элементом dom, у которого нет обработчика событий. Но мне нужно было бы увидеть часть кода или получить больше объяснений, прежде чем я узнаю больше :-)
Это класс, а не div. И у них один и тот же класс. Обработчик событий не является частью результата. JavaScript находится внизу страницы, а результат вверху. Так что там есть javascript. Они не заменяются.
Да, давайте посмотрим код ... Викторины - это весело, но не здесь! -)
При обновлении HTML новыми данными вы повторно присоединяете какие-либо обработчики событий, которые у вас были ранее?
Возможно, вы заменили элемент, который раньше имел обработчик событий, а теперь его нет.
Я видел подобное поведение, когда при манипулировании DOM с помощью innerHTML обработчики событий zaps, которые были ранее настроены, но только тогда, когда вы заменяете фактические элементы, к которым были прикреплены обработчики. Это верно для атрибутов встроенных обработчиков событий, а также «правильных» обработчиков событий, подключенных через Javascript.
Лучший способ проверить, происходит ли это, - добавить несколько операторов отладки к функции, которая вызывается при нажатии на abn. Если вы не используете отладчик, просто добавьте несколько предупреждений (а затем изучите возможность использования отладчика JavaScript)
function iAmCalledWhenSomeoneClicksOnAbn(){
alert("I was called, w00t!");
//...rest of function
}
Первый щелчок (который работает) выдаст вам предупреждение. Если второй щелчок (который не работает) пропускает предупреждение, вы знаете, что ваши манипуляции с DOM удаляют ваши обработчики событий.
Если второй щелчок по-прежнему вызывает предупреждение, значит, происходит что-то еще. Наиболее вероятной причиной является необработанное исключение Javascript, которое останавливает выполнение. Загрузите отладчик для своего браузера (Firefox / Firebug, IE / Visual Studio Express Web Developer, Safari / Drosera) и следуйте по пути выполнения до тех пор, пока не будет выбрано исключение или вы не дойдете до той части вашего кода, где должно произойти манипулирование DOM. Если вы дойдете до последнего, проверьте содержимое всех переменных, а также текущее содержимое DOM, чтобы определить, почему ожидаемые манипуляции с DOM не происходят.
They are class, not div. And they have the same class. The event handler is not part of the result. The javascript is at the bottom of the page while the Result is at the top. So the javascript is sitll there. They are not being replaced.
Если вы заменяете элементы новыми элементами через .innerHTML, JavaScript в нижней части страницы не будет повторно выполняться, когда вы это сделаете. Если вы добавляете обработчики событий с использованием JavaScript (уровень 2), а не как атрибуты html (уровень 0), то эти обработчики добавляются только тогда, когда пользователь впервые посещает страницу. Вам нужно вызывать этот код каждый раз, когда вы размещаете новые элементы DOM на странице.
Конечно, этот ответ может быть совершенно неуместным. Мы могли бы сказать, если бы вы дали нам образец кода.
Не могли бы вы опубликовать код, пожалуйста? это упростит нам помощь.