jQuery выберите динамически созданный элемент html

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

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

<div class="aui-dialog">
     html here... 
     <button id="closeButton">Close</button>
</div>

сразу после <body>.

Я могу связать событие нажатия кнопки закрытия без проблем с помощью jQuery live:

$("#closeButton").live("click", function() { 
    alert("asdf"); // it calls
    $("body").find(".aui-dialog").remove();
});

Моя проблема в том, что я не могу выбрать динамически созданный modal window div по его имени класса. Чтобы я мог вызвать метод jQuery.remove(), чтобы сделать близкое действие. Теперь я знаю, что я должен иметь дело с динамическими элементами по-другому.

Каким образом?

РЕДАКТИРОВАТЬ:
Я считаю важным отметить это:
Я не создаю модальное окно самостоятельно, я использую портал liferay. Он имеет встроенную структуру javascript AUI (YUI), которая создает это модальное окно. Я могу просто создать эту закрытую кнопку внутри этого в своем представлении.

EDIT 2:
Значение атрибута класса div модального окна: "aui-component aui-panel aui-dialog aui-widget-position"

Ответ 1

Создайте ссылку, когда вы создаете модальное окно:

var modalWindow = $('<div class="aui-dialog">html here... <button id="closeButton">Close</button></div>');
// later...
modalWindow.remove();

К вашему редактированию:

Получите окно через parent jQuery, когда кнопка находится внутри модального окна:

$('#closeButton').on('click',function() {
    $(this).parent().remove();
    return false;
});

Ответ 2

Поскольку jquery будет считывать текущее состояние DOM при загрузке страницы:

jQuery( document ).ready(function( $ ) {

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

Одним простым решением является прослушивание кликов по документу и фильтрация с типом класса или элемента, который вы хотите использовать для выполнения кода. Таким образом, jquery найдет новые элементы, созданные в документе, после загрузки страницы.

$(document).on("click", '#closeButton', function(){
$(".aui-dialog").remove();
});

Ответ 3

Вы могли бы сделать несколько вещей, но сначала, если вы используете jQuery 1.7, лучше используйте .on(). он заменил .live() который устарел.

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

$('#closeButton').on('click',function() {
    $(this).parent().remove();
    return false;
});

если кнопка находится где-то глубоко в родительском, но имеет фиксированную глубину от родителя, используйте parent parents() который получает всех предков элемента, а затем фильтрует его до определенной глубины. если закрытие было 2 уровня глубоким, индекс :eq() бы равен 1.

$('#closeButton').on('click',function() {
    //where N is zero-indexed integer, meaning first item of the set starts with 0
    $(this).parents(':eq(N)').remove(); 
    return false;
});

другим способом является добавление обработчика при создании модаля

var modal = $('modalHTML');

$('#closeButton',modal).on('click',function(){
    //modal still refers to the whole modal html in this scope
    modal.remove();
});

//show modal

Ответ 4

Многие пользователи придут на эту страницу, когда они захотят выбрать какой-то элемент, сгенерированный во время выполнения JQuery, и это провалилось, как и я.
Решение просто подходит к корню (родительскому) вашего произвольно сгенерированного элемента, а затем получает внутренний выбор jQuery TAG. Например, вы генерируете много TD пользователей в таблице во время выполнения, элемент, имеющий список ваших пользователей, представляет собой таблицу с идентификаторами tblUsers, тогда вы можете выполнять итерацию по генерируемым TR или TD следующим образом:

$("#tblUsers tr").each(function(i){
    alert('td' + i);
});   

если у вас есть входы в tds, вы можете вдаваться в

$("tblUsers tr td input")

Другим случаем может быть случайно сгенерированный диалог или всплывающее окно, тогда вы должны подойти к его корневому (родительскому) и следующему же выбору с помощью TAG, как указано выше.

Ответ 5

ОБНОВЛЕНО:

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

$(".aui-dialog").live('click', function() {
    $(this).remove();
    return false;
});)

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

Ответ 6

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

Если у вас есть кнопка (#closeButton) внутри этого IFRAME, и вы хотите выбрать window.parent.document элементы iframe parent, просто добавьте второй аргумент window.parent.document для вашего селектора:

// This functions is inside generated IFRAME
$("#closeButton").on("click", function() {        
       // body - is your main page body tag
       /* Will alert all html with your dynamically 
          generated html with iframe and etc. */
       alert($('body', window.parent.document).html()); 
       return false;
});