Jquery клик не работает

Событие Click не работает с динамически сгенерированными элементами [дубликат]

этот вопрос уже есть ответ здесь:

  • привязка событий к динамически созданным элементам? 23 ответов

Я пытался создать новый тег с именем класса test на

при нажатии на кнопку. Я также определил событие click, связанное с test . Но событие не работа.

может кто-нибудь помочь?

20 ответов

The click() привязка, которую вы используете, называется» прямой » привязкой, которая будет присоединять обработчик только к элементам, которые уже есть. Он не будет привязан к элементам, созданным в будущем. Для этого вам нужно будет создать «делегированную» привязку с помощью on() .

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

вот что вы ищете:

выше работает для тех, кто использует jQuery версии 1.7+. Если вы используете более старую версию, обратитесь к предыдущему ответу ниже.

Предыдущий Ответ:

работал для меня. попытался это С jsFiddle.

или есть новый способ сделать это с delegate() :

на .on() метод позволяет делегировать любой желаемый обработчик событий:
настоящее элементы или будущее элементы, добавленные в DOM позже.

P. S: Не используйте .live() ! Из jQuery 1.7+ the .live() метод устарел.

причина:

в jQuery нажмите () — присоединяет обработчик событий, только если элемент уже существует в html-коде.

Он не будет рассматривать новый элемент, который создается динамически(элемента) после загрузки страницы.

динамические элементы создаются с помощью javascript или jquery (не в html).

таким образом, событие click не срабатывает.

решение :

чтобы преодолеть это, мы должны использовать on ()

добавить эту функцию в JS файл. Он будет работать на любом браузере

LIVE DEMO

вам нужно использовать .жить для этого:

или если вы используете jquery 1.7 + use .on:

попробовать .live() или .delegate()

код .test элемент был добавлен после .click() метод, поэтому к нему не было прикреплено событие. Live и Delegate дают этот триггер события родительским элементам, которые проверяют своих детей, поэтому все, что добавлено впоследствии, все еще работает. Я думаю, что Live проверит весь документ, в то время как делегат может быть передан элемент, поэтому делегирование более эффективно.

Я нашел два решения в документации jQuery:

во-первых: используйте делегат на теле или документе

ответ: прикрепить обработчик к одному или более событий для всех элементов, которые соответствуют селектор, сейчас или в будущем, на основе определенного набора корневых элементов. ссылка:http://api.jquery.com/delegate/

во-вторых: поместите свою функцию в «$( документ )», используя «на» и прикрепите его к элементу, который вы хотите запустить. Первый параметр — это «обработчик событий», Второй-элемент и третий-функция. Например:

ответ: обработчики событий привязаны только к выбранным элементам; они должны существовать на странице во время вызова кода .on (). Чтобы убедиться, что элементы присутствуют и могут быть выберите, выполните привязку событий внутри обработчика готовности документа для элементов, которые находятся в разметке HTML на странице. Если на страницу вводится новый HTML, выберите элементы и присоедините обработчики событий после того, как новый HTML будет помещен на страницу. Или используйте делегированные события для присоединения обработчика событий, как описано далее . ссылка:https://api.jquery.com/on/

лучший способ применить событие к динамически генерируемому контенту с помощью делегирования.

Итак, ваш код теперь такой

будет работать только если DIV с классом .surrounding_div_class является непосредственным родителем объекта .тест

Если в div есть другой объект, который будет заполнен, он не будет работать.

проблема заключается в том, что вы пытаетесь привязать класс «test» к событию, прежде чем в DOM . Хотя может показаться, что все это динамично, на самом деле происходит JQuery делает пас над DOM и подключает событие click, когда ready() функция уволена, что происходит до того, как вы создали «нажмите меня» в событии кнопки.

добавив событие» test «Click в обработчик щелчка» button», он будет подключите его после того, как правильный элемент существует в DOM .

используя live() (как уже упоминалось) — это еще один способ сделать это, но я чувствовал, что это также хорошая идея, чтобы указать на небольшие ошибки в JS коде. То, что вы написали, не было неправильным, его просто нужно было правильно определить. Схватывая, как DOM и JS works — одна из сложных вещей для многих традиционных разработчиков, чтобы обернуть голову.

Читайте также:  Ttf2woff gulp не работает

live() это более чистый способ справиться с этим и в большинстве случаев-это правильный путь. Он по существу наблюдает за DOM и перемонтировать вещи, когда элементы внутри него меняются.

.живая функция работает отлично.

Это для динамически добавляемых элементов на сцену.

Jquery .on работает нормально, но у меня были некоторые проблемы с рендерингом, реализующим некоторые из решений выше. Моя проблема с использованием .on это то, что каким-то образом он отображал события иначе, чем .hover метод.

просто fyi для всех, кто также может иметь проблему. Я решил свою проблему, повторно зарегистрировав событие hover для динамически добавляемого элемента:

перерегистрируйте событие наведения, потому что наведение не работает для динамически созданного предметы. поэтому каждый раз, когда я создаю новый / динамический элемент, я снова добавляю код наведения. работает отлично

Я не мог получить live или делегировать работу над div в лайтбоксе (tinybox).

я использовал функции setTimeout successfullly, по следующим простым способом:

также вы можете использовать onclick=»do_something(this)» внутри элемента

Альтернативная и более лаконичная альтернатива (IMHO) — использовать необработанную функцию javascript, которая отвечает на событие on click, а затем передать целевой элемент обратно в jQuery, если хотите. Преимущество этого подхода заключается в том, что вы можете динамически добавлять свой элемент в любом месте, а обработчик click будет «просто работать», и вам не нужно беспокоиться о делегировании управления родительским элементам и т. д.

Шаг 1: обновление динамического html для запуска onclick событие. Обязательно передайте объект «event» в качестве аргумента

Шаг 2: создайте тестовую функцию для ответа на событие click

Шаг 3: учитывая, что вы используете jQuery, я предполагаю, что будет полезно получить ссылку на кнопку источника

Я работаю с таблицами, динамически добавляя к ним новые элементы, и при использовании on () единственный способ заставить его работать для меня-использовать нединамический родитель как:

Это действительно полезно, потому что, чтобы удалить события связаны с on (), вы можете использовать off(), и использовать события один раз, вы можете использовать one ().

вы можете добавить щелчок к динамически созданным элементам. Пример ниже. Использование Когда, чтобы убедиться, что это сделано. В моем примере я хватаю div с классом expand, добавляя диапазон» click to see more», а затем используя этот диапазон, чтобы скрыть/показать исходный div.

если у вас есть динамически добавленная ссылка на какой-либо контейнер или тело:

вы можете взять его необработанный элемент javascript и добавить к нему прослушиватель событий, например клик:

независимо от того, сколько раз вы добавляете этот новый экземпляр ссылки, вы можете использовать его, как если бы вы использовали jquery

используйте «on», поскольку щелчок получает привязку к уже присутствующим элементам.

Источник

в jQuery событие click не работает после добавления класса

на моей странице JSP я добавил несколько ссылок:

он имеет функцию jQuery, зарегистрированную для события click:

теперь у меня есть обработчик кликов jQuery для этих ссылок

для первой ссылки он работает нормально. Он предупреждает

  • id. Но на секунду .
  • , где class=»tabclick» добавлено первым jQuery не работает.

    пробовал $(«a.tabclick»).live(«click», function() , но тогда первое событие щелчка по ссылке также не работало.

    7 ответов

    С class добавляется динамически, вам нужно использовать делегирование событий для регистрации обработчика событий

    вы должны использовать следующее:

    Это прикрепит ваше событие к любым якорям в #gentab элемент, уменьшение объема необходимости проверять все document дерево элементов и повышения эффективности.

    .live() устарела.Если вы хотите использовать для делегированных элементов, используйте .на() со следующим синтаксисом

    этот синтаксис будет работать для делегированных событий

    на основе @Arun P Johny вот как вы это делаете для ввода:

    вот как я получил его в jQuery:

    это войдет в консоль: myButton1. Как сказал @Arun, вам нужно добавить событие динамически, но в моем случае вам не нужно сначала звонить родителю.

    хотя лучше было бы сказать:

    Так как это синтаксис JQuery, хотя оба будут работать.

    на событии готовности документа нет тега с классом tabclick. поэтому при добавлении класса tabclick необходимо динамически связывать событие click. пожалуйста, этот код:

    вот еще одно решение, а также метод bind.

    Я знаю, что это старая тема. но ничего из вышеперечисленного мне не помогло. И после долгих поисков и перепробования всего. Я придумал это.

    удалить нажмите кнопку код в $(документ).готовую деталь и кладем в отдельную секцию. затем поместите код клика в $(function () <. >); код.

    Читайте также:  Как настроить lan кабель от роутера

    Источник

    JQuery на клик не работает после изменения DOM

    Я настроил свой HTML в бритве, как показано ниже:

    Кнопка onclick выглядит так:

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

    Как только это будет сделано, событие onclick работает очень хорошо. Когда публикация завершена, я скрываю кнопку и обновляю DOM, чтобы показать пользователю, что он добавил этого пользователя в список наблюдения.

    Теперь снова выполняем поиск для другого пользователя, который не был добавлен в список наблюдения, и кнопка «Добавить в список наблюдения» с классом «btnSave Watchlist» снова загружается в DOM.

    Но на этот раз он полностью не отвечает . Я проверил, инициируется ли действие в контроллере, но не . Кнопка кажется «замороженной» .

    Есть идеи, что это может быть, ребята?

    Постскриптум Все это делается без обновления страницы вообще. Я не хочу обновлять страницу для конечного пользователя .

    Редактируйте здесь кнопку btnSaveWatchList с классом:

    3 ответа

    Есть идеи, что это может быть, ребята?

    Да, разница между разметкой (в основном простая строка) и объектной моделью документа. Вы присоединяете обработчик событий к определенным DOM-узлам, но при загрузке новой разметки этот узел удаляется, и из предоставленной вами разметки создается новый.

    И слушатель события также ушел со старого узла.

    В настоящее время ваш код мне не совсем понятен, поэтому я не уверен на 100%, что это решит проблему, но вот мое решение:

    Возможно, вы связываете элемент, который вы рендерите, с помощью jquery позже.

    Есть 2 способа решить эту проблему. Самым простым (для меня) является использование привязки стиля родитель-потомок. Это означает, что вы привязываете привязку к родителю, и jQuery проверяет, щелкает ли дочерний элемент по факту. Это на самом деле работает с динамическим контентом (HTML, который был загружен через AJAX или что-то еще)

    Пример:

    Или есть другой путь; заставляя ваш вызов функции переустанавливать привязку каждый раз при рендеринге html (чуть менее эффективно)

    Пример:

    Пожалуйста, обратите внимание на мои комментарии здесь. Я скучаю по большому количеству информации, поэтому я поставил здесь несколько «вопросов».

    Вы должны сначала позвонить setBinding() куда-нибудь (как на document.ready? ), иначе это не сработает.

    Обратите внимание, что вы должны вызывать функцию setBinding() после того, как отрендерите нужную кнопку.

    Где-то за пределами кода, который вы показываете в своем вопросе, вы визуализируете эту кнопку. Является ли это правдой append() или html() , я не знаю, но куда бы вы ни создавали эту кнопку, добавляйте ее после html() : element.html(myhtml).promise().done(setBinding);

    Я предлагаю вам создать функцию с обязательным действием.

    Если ваш документ готов, просто вызовите функцию bindButton. Затем, после каждого звонка, ваша кнопка снова будет связана, потому что вы очищаете содержимое div.

    Источник

    Почему не срабатывает клик по вложенному элементу (jQuery)?

    Очень прошу прощения, что несколько сумбурно задаю вопрос, но я вообще не профи (любитель очень начинающий) в JS, jQuery и всем таком.

    В скрипт test.php в div с с помощью jQuery подгружается вывод другого скрипта (pictures.php) с помощью:

    В скрипте test.php заранее прописан div:
    echo ‘

    Скрипт pictures.php генерит примерно такое:

    Что-то вроде этого:

    В браузере открывается test.php. В зависимости от того, на какую картинку кликнуть, на сервер ajax отправляется id картинки. Если id картинки каким-то образом устраивает/не устраивает, скрипт pictures.php отправляет новые картинки. Все просто. Я для жены (она в дет. саду работает) делаю страничку, чтобы ей удобнее было детей тестировать, как они отличают похожие по произношению слова.

    Ну и параллельно изучаю работу ajax, поэтому вариант отправлять просто формой в этот же скрипт не хотел бы ваять. Все умеют ajax, а я пока нет 🙁

    В скрипте test.php:
    Проблема в том, что по какой-то причине вот этот код:

    не отлавливает нажатия на картинку. В Chrome тишина.

    Также не срабатывает:

    Других картинок на странице test.php нет, поэтому тут уж не перепутаешь. Нет нажатий на img! и все тут.

    При этом срабатывает (в скрипте test.php сделал кнопку с >

    Это отладочное все, простите за сумбур! В общем, делаю вывод, что у меня jQuery не может напрямую обратиться к подгруженным картинкам! Через div с шв=pictures, который изначально есть в скрипте, id картинок ловятся. Можете подсказать, как так? Почему картинки, которые даже в браузере нормально появляются, невозможно отловить напрямую по из id?

    Источник

    Событие Click не работает с динамически генерируемыми элементами

    Я пытался создать новый тег с именем класса test в

    Читайте также:  Ручник не работает назад

    , нажав кнопку. Я также определил событие click, связанное с test . Но событие не работает.

    Может ли кто-нибудь помочь?

    Используйте ‘on’, поскольку щелчок получает привязку к уже присутствующим элементам.

    Связывание click() , которое вы используете, называется «прямой» привязкой, которая привязывает обработчик только к уже существующим элементам. Он не будет привязан к элементам, созданным в будущем. Для этого вам нужно будет создать «делегированное» привязку с помощью on() .

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

    Вышеупомянутое работает для тех, кто использует jQuery версии 1.7+. Если вы используете более старую версию, см. Предыдущий ответ ниже.

    Предыдущий ответ:

    Работал для меня. Пробовал его с помощью jsFiddle.

    Или есть новый способ общения с delegate() :

    Метод .on() позволяет вам делегировать любой желаемый обработчик событий:

    текущие элементы или будущих элементов, добавленных в DOM позднее.

    P.S: Не используйте .live() ! Из jQuery 1.7+ метод .live() устарел.

    Причина:

    Click() — прикрепляет обработчик событий только в том случае, если элемент уже существует в html-коде.

    Он не будет рассматривать новый элемент, который создается динамически (элемент Future) после загрузки страницы.

    Динамические элементы создаются с помощью javascript или jquery (не в html).

    Таким образом, событие click не срабатывает.

    Решение:

    Чтобы преодолеть это, мы должны использовать функцию on().

    функции delegate(), live() и on() имеют преимущества перед элементами DOM.

    on может запускать как существующие элементы, так и будущие элементы.

    on может рассматривать элементы, которые присутствуют на всей странице.

    Функции делегата(), live() устарели (не используйте их).

    Вы должны использовать функцию on, чтобы инициировать событие в динамически созданных (будущих) элементах.

    Удалите код из $(document).ready:

    Для этого вам нужно использовать . live:

    или если вы используете jquery 1.7+, используйте .:

    Попробуйте .live() или .delegate()

    Ваш .test элемент был добавлен после метода .click() , поэтому у него не было привязанного к нему события. Live и Delegate придают этому событию триггер родительским элементам, которые проверяют своих детей, поэтому все, что добавлено впоследствии, все еще работает. Я думаю, что Live проверит весь документ, а делегат может быть передан элементу, поэтому делегирование будет более эффективным.

    Добавить эту функцию в файл js. Он будет работать в каждом браузере

    Лучший способ применить событие к динамически сгенерированному контенту с помощью делегирования.

    поэтому ваш код будет таким же, как сейчас.

    Я нашел два решения в документации jQuery:

    Сначала: используйте делегат на теле или документе

    Ответ.. Прикрепите обработчик к одному или нескольким событиям для всех элементов, которые соответствуют селектору, сейчас или в будущем, на основе определенного набора корневых элементов.
    ссылка: http://api.jquery.com/delegate/

    Второе: поместите свою функцию в «$ (document)», используя «on» и присоедините ее к элементу, который вы хотите вызвать.
    Первым параметром является «обработчик событий», второй: элемент и третий: функция.
    Например:

    Ответ: Обработчики событий привязаны только к выбранным в данный момент элементам; они должны существовать на странице в момент, когда ваш код выполняет вызов .on(). Чтобы убедиться, что элементы присутствуют и могут быть выбраны, выполните привязку событий внутри обработчика документа для элементов, которые находятся в разметке HTML на странице. Если на страницу вводится новый HTML-код, выберите элементы и присоедините обработчики событий после того, как новый HTML будет помещен на страницу. Или используйте делегированные события для присоединения обработчика событий, как описано далее.
    ссылка: https://api.jquery.com/on/

    Проблема заключается в том, что вы пытаетесь связать класс «test» с событием, прежде чем что-либо с классом «test» в DOM . Хотя может показаться, что все это динамично, на самом деле происходит то, что JQuery делает проход через DOM и прокручивает событие click при запуске функции ready() , что происходит до того, как вы создали «Click Me», в событии кнопки.

    Добавив событие «test» Click к обработчику кликов «button», он подключится к нему после того, как правильный элемент существует в DOM .

    Использование live() (как указывали другие) — это еще один способ сделать это, но я также подумал, что было бы неплохо указать на незначительную ошибку в вашем JS-коде. То, что вы написали, было не так, просто нужно было быть правильно охвачено. Понимание того, как работают DOM и JS, — это одна из сложнейших вещей, которые многие традиционные разработчики обворачивают вокруг.

    live() — это более чистый способ справиться с этим, и в большинстве случаев это правильный путь. По сути, он наблюдает за DOM и переустанавливает все, когда элементы внутри него меняются.

    Источник

  • Оцените статью