Передайте идентификатор изображения в Modal с данными AJAX / JSON [dубликат]

У меня есть немного кода, где я перебираю все поля выбора на странице и привязываю к нему событие .hover, чтобы сделать немного сплетения с их шириной на mouse on/off.

] Это происходит на странице и работает нормально.

Проблема заключается в том, что любые ящики выбора, добавляемые через Ajax или DOM после начального цикла, не будут связаны с событием.

Я нашел этот плагин (jQuery Live Query Plugin), но прежде чем добавить еще 5 к моим страницам с плагином, я хочу узнать, знает ли кто-нибудь, как это сделать, либо с помощью jQuery напрямую, либо с помощью другого параметра. [ ! d3]

1679
задан 2 December 2016 в 14:27

17 ответов

Любой родитель, который существует в момент привязки события, и если ваша страница динамически создавала элементы с помощью кнопки имени класса, вы привязывали бы событие к родительскому, который уже существует

$(document).ready(function(){
  //Particular Parent chield click
  $(".buttons").on("click","button",function(){
    alert("Clicked");
  });  
  
  //Dynamic event bind on button class  
  $(document).on("click",".button",function(){
    alert("Dymamic Clicked");
  });
  $("input").addClass("button");  
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class="buttons">
  <input type="button" value="1">
  <button>2</button>
  <input type="text">
  <button>3</button>  
  <input type="button" value="5">  
  </div>
<button>6</button>

7
ответ дан 15 August 2018 в 16:13

Это чистое решение для JavaScript без каких-либо библиотек или плагинов:

document.addEventListener('click', function (e) {
    if (hasClass(e.target, 'bu')) {
        // .bu clicked
        // Do your thing
    } else if (hasClass(e.target, 'test')) {
        // .test clicked
        // Do your other thing
    }
}, false);

, где hasClass -

function hasClass(elem, className) {
    return elem.className.split(' ').indexOf(className) > -1;
}

Live demo

Credit идет к Дейву и Симе Видасу

Используя более современные JS, hasClass можно реализовать как:

function hasClass(elem, className) {
    return elem.classList.contains(className);
}
159
ответ дан 15 August 2018 в 16:13
  • 1
    [D0] stackoverflow.com/questions/9106329/&hellip – zloctb 6 January 2016 в 18:57
  • 2
    Вы можете использовать Element.classList вместо разделения – Eugen Konkov 9 August 2016 в 13:07
  • 3
    @EugenKonkov Element.classList не поддерживается в старых браузерах. Например, IE & lt; 9. – Ram Patra 9 August 2016 в 13:59
  • 4
    Хорошая статья о том, как сделать все, используя скрипт для ванили, вместо jQuery - toddmotto.com/… – Ram Patra 29 June 2017 в 12:25
  • 5
    как насчет пузыри? Что, если событие click произошло на дочернем элементе, который вас интересует? – Andreas Trantidis 6 July 2017 в 16:06

Я искал решение, позволяющее работать $.bind и $.unbind без проблем в динамически добавленных элементах.

Так как on () делает трюк для присоединения событий, чтобы создать поддельный unbind на тех, к которым я пришел:

const sendAction = function(e){ ... }
// bind the click
$('body').on('click', 'button.send', sendAction );

// unbind the click
$('body').on('click', 'button.send', function(){} );
0
ответ дан 15 August 2018 в 16:13
[F1]
-1
ответ дан 15 August 2018 в 16:13
  • 1
    Хотя этот фрагмент кода может решить проблему, он не объясняет, почему и как он отвечает на вопрос. Пожалуйста, включите объяснение для своего кода, так как это действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода. – Palec 30 September 2017 в 14:07

Используйте метод .on() jQuery http://api.jquery.com/on/, чтобы присоединить обработчики событий к текущему элементу.

Также удаляется метод версии 1.9 .live().

3
ответ дан 15 August 2018 в 16:13

Вот почему динамически созданные элементы не реагируют на клики & nbsp;:

var body = $("body");
var btns = $("button");
var btnB = $("<button>B</button>");
// `<button>B</button>` is not yet in the document.
// Thus, `$("button")` gives `[<button>A</button>]`.
// Only `<button>A</button>` gets a click listener.
btns.on("click", function () {
  console.log(this);
});
// Too late for `<button>B</button>`...
body.append(btnB);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button>A</button>

В качестве обходного пути вам необходимо прослушать все клики и проверить source element & nbsp;:

var body = $("body");
var btns = $("button");
var btnB = $("<button>B</button>");
// `<button>B</button>` is not yet in the document.
// Thus, `$("button")` gives `[<button>A</button>]`.
// Only `<button>A</button>` gets a click listener.
btns.on("click", function () {
  console.log(this);
});
// Too late for `<button>B</button>`...
body.append(btnB);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button>A</button>

Это называется «Event Delegation». Хорошая новость, это встроенная функция в jQuery: -)

var body = $("body");
var btns = $("button");
var btnB = $("<button>B</button>");
// `<button>B</button>` is not yet in the document.
// Thus, `$("button")` gives `[<button>A</button>]`.
// Only `<button>A</button>` gets a click listener.
btns.on("click", function () {
  console.log(this);
});
// Too late for `<button>B</button>`...
body.append(btnB);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button>A</button>

7
ответ дан 15 August 2018 в 16:13

Я предпочитаю использовать селектор, и я применяю его в документе.

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

] Например:

$(document).on("click", $(selector), function() {
    // Your code here
});
15
ответ дан 15 August 2018 в 16:13
  • 1
    селектор не должен быть заключен в $, поэтому правильным форматом будет $ (document) .on («click & quot;», «селектор», function () {// здесь ваш код}); – autopilot 9 April 2018 в 07:21
  • 2
    Также бессмысленно обертывать объект jQuery вокруг переменной selector, когда он должен содержать строку или элемент Element, которые вы можете просто передать непосредственно этому аргументу в on() – Rory McCrossan 20 June 2018 в 17:57

вы можете использовать

$('.buttons').on('click', 'button', function(){
    // your magic goes here
});

или

$('.buttons').delegate('button', 'click', function() {
    // your magic goes here
});

, эти два метода эквивалентны, но имеют другой порядок параметров.

см .: jQuery Событие делегата

9
ответ дан 15 August 2018 в 16:13
  • 1
    delegate() теперь устарел. Не используйте его. – Rory McCrossan 20 June 2018 в 17:58

Вы можете присоединить событие к элементу при динамическом создании с помощью jQuery(html, attributes).

Начиная с jQuery 1.8, любой метод экземпляра jQuery (метод jQuery.fn) может использоваться как свойство объекта передан во второй параметр:

function handleDynamicElementEvent(event) {
  console.log(event.type, this.value)
}
// create and attach event to dynamic element
jQuery("<select>", {
    html: $.map(Array(3), function(_, index) {
      return new Option(index, index)
    }),
    on: {
      change: handleDynamicElementEvent
    }
  })
  .appendTo("body");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">
</script>

10
ответ дан 15 August 2018 в 16:13

Это делается путем делегирования событий. Событие будет привязываться к элементу-оболочке, но будет делегировано элементу селекторного класса. Вот как это работает.

$('.wrapper-class').on("click", '.selector-class', function() {
    // Your code here
});

Примечание:

Элемент-оболочка-оболочка может быть любым ex. документа, тела или вашей обертки. Обертка должна уже существовать.

0
ответ дан 15 August 2018 в 16:13

Обратите внимание на класс «MAIN», в который помещается элемент, например

<div class="container">
     <ul class="select">
         <li> First</li>
         <li>Second</li>
    </ul>
</div>

В приведенном выше сценарии объект MAIN, который будет наблюдать jQuery, является «контейнером».

Тогда вы в основном будете иметь имена элементов в контейнере, такие как ul, li и select:

$(document).ready(function(e) {
    $('.container').on( 'click',".select", function(e) {
        alert("CLICKED");
    });
 });
58
ответ дан 15 August 2018 в 16:13
  • 1
    Это сообщение действительно помогло мне понять проблему, с которой я загружаю ту же форму и получаю 1,2,4,8,16 .... Вместо использования .live () я просто использовал .bind () в моем обратном вызове .load (). Задача решена. Благодаря! – Thomas McCabe 24 August 2011 в 14:24
  • 2
    жить устарело – gorgi93 13 June 2013 в 14:55
  • 3
    Yeap, и они не говорят (document.body), его говорит предок, который может быть почти что угодно – MadeInDreams 23 January 2016 в 20:29
  • 4
    Ваш код содержит 1 ошибку: myElement.append('body'); должен быть myElement.appendTo('body');. С другой стороны, если нет необходимости в дальнейшем использовании переменной myElement, это проще и короче: $('body').append($('<button/>', { text: 'Go to Google!' }).bind( 'click', goToGoogle)); – ddlab 11 May 2017 в 22:58

Более гибкое решение для создания элементов и связывания событий (source)

// creating a dynamic element (container div)
var $div = $("<div>", {id: 'myid1', class: 'myclass'});

//creating a dynamic button
 var $btn = $("<button>", { type: 'button', text: 'Click me', class: 'btn' });

// binding the event
 $btn.click(function () { //for mouseover--> $btn.on('mouseover', function () {
    console.log('clicked');
 });

// append dynamic button to the dynamic container
$div.append($btn);

// add the dynamically created element(s) to a static element
$("#box").append($div);

Примечание. Это создаст экземпляр обработчика события для каждого элемента (может повлиять на производительность при использовании в цикле)

1
ответ дан 15 August 2018 в 16:13

Попробуйте это -

$(document).on( 'click', '.click-activity', function () { ... });
5
ответ дан 15 August 2018 в 16:13

Я предпочитаю, чтобы прослушиватели событий были развернуты модульной функцией, а не сценарием прослушивателя событий уровня document. Итак, мне нравится ниже. Обратите внимание: вы не можете переписывать элемент с тем же самым прослушивателем событий, поэтому не беспокойтесь о прикреплении слушателя более одного раза - только один палец.

var iterations = 4;
var button;
var body = document.querySelector("body");

for (var i = 0; i < iterations; i++) {
    button = document.createElement("button");
    button.classList.add("my-button");
    button.appendChild(document.createTextNode(i));
    button.addEventListener("click", myButtonWasClicked);
    body.appendChild(button);
}

function myButtonWasClicked(e) {
    console.log(e.target); //access to this specific button
}

0
ответ дан 15 August 2018 в 16:13

Связывает событие с родителем, который уже существует:

$(document).on("click", "selector", function() {
    // Your code here
});
1
ответ дан 15 August 2018 в 16:13

В документации jQuery.fn.on есть хорошее объяснение.

Короче:

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

Таким образом, в следующем примере #dataTable tbody tr должен существовать до генерации кода.

$("#dataTable tbody tr").on("click", function(event){
    console.log($(this).text());
});

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

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

$("#dataTable tbody").on("click", "tr", function(event){
    console.log($(this).text());
});

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

Подход с делегированными событиями (второй пример кода) прикрепляет обработчик события только к одному элементу , tbody, и событию нужно только выровнять один уровень (от нажатого tr до tbody).

Делегированные события Делегированные события не работают для jQuery.fn.on .

300
ответ дан 15 August 2018 в 16:13
  • 1
    это был бы более приемлемый ответ, потому что быстрее было бы делегировать из конкретной таблицы, а не полностью из документа (область поиска была бы намного меньше) – msanjay 9 May 2014 в 23:14
  • 2
    @msanjay: Хотя предпочтение от поиска ближе к элементам является предпочтительным, разница в поиске / скорости на практике очень незначительна. Вам нужно будет щелкнуть 50 000 раз в секунду, чтобы заметить что-нибудь :) – Gone Coding 12 November 2014 в 16:06
  • 3
    Можно ли применить этот подход к обработке флажков в строке, изменив tr на соответствующий селектор, например 'input[type=checkbox]', и это будет автоматически обрабатываться для вновь вставленных строк? – JoeBrockhaus 25 November 2014 в 21:26

Попробуйте использовать .live() вместо .bind(); .live() свяжет .hover с вашим флажком после выполнения запроса Ajax.

37
ответ дан 15 August 2018 в 16:13
  • 1
    Метод live() устарел в версии 1.7 в пользу on и удален в версии 1.9. – chridam 17 June 2014 в 17:30

Другие вопросы по тегам:

Похожие вопросы: