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

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

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

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

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

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

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

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

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

EDIT:
я думаю, что важно отметить, это:
Я не создаю модальное окно сам, я использую liferay. Он имеет встроенный JavaScript framework AUI(YUI) это создает это модальное окно. Я могу просто создать эту кнопку закрытия внутри него в его представлении.

EDIT 2:
Значение атрибута класса div модального окна:"aui-компонент aui-панель aui-диалог aui-виджет-позиционируется"

6 ответов


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

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

для редактирования:

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

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

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

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

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

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

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

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

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

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

если кнопка находится где-то глубоко в родителе, но имеет фиксированную глубину от родителя, используйте 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

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

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

далее, Если у вас есть входы в tds, вы можете углубиться в выбор как

$("tblUsers tr td input")

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


обновление:

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

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

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


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

Если у вас есть кнопка (#closeButton) внутри этого IFRAME, и вы хотите выбрать элементы DOM родительского окна iframe, просто добавьте второй аргумент 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;
});