2013-02-12 2 views
4

Исходя из ответа здесь https://stackoverflow.com/a/1207393/1786228 и теперь довольно старый JQuery плагин (http://www.erichynds.com/jquery/jquery-create-event/)Правильный метод вызова .each на динамически создаваемые элементы?

Что такое правильное событие для on поймать, когда создаются новые элементы? Например, у меня есть поля ввода, в которых я устанавливаю typeahead/autocomplete. Я делаю это с:

$(.input_box).each(function() { 
    // set stuff here 
    // setup options etc 
    // apply autocomplete plugin to element (this is a jQuery plugin) 
    var ac = $(this).autocomplete(acOptions); 
}); 

У меня есть кнопка, позволяющая добавить в форму несколько одинаковых полей ввода. Как я могу назвать эту функцию .each только для нового поля ввода? Если я снова использую $(.input_box).each..., в исходных боксах добавлен плагин второй раз.

В основном я хочу сделать ниже, но нет привязки к «созданию».

$(document).on("create", "input_box", function(e) { 
    // set stuff here 
    // setup options etc 
    // apply autocomplete plugin to element (this is a jQuery plugin) 
    var ac = $(this).autocomplete(acOptions); 
}); 

Есть ли такое событие? Если нет, каков наилучший способ достижения этого?

+0

Лично я бы не пойти на livequery плагин в вашем case.You может прийти в DOMNodeInserted, предложенном в спецификации DOM Level 2, но поскольку это было устарело в спецификации DOM Level 3, вы также не должны полагаться на его использование. Можно ли создать рабочую скрипту своего кода? – darshanags

ответ

2

Как упоминалось выше: вы можете использовать события мутации. Но эти события имеют некоторые ограничения: нет поддержки IE до версии 9, и есть некоторые проблемы с производительностью с этими событиями. В вашем случае вы должны будете прослушать DOMNodeInserted. Возможный пример:

document.addEventListener("DOMNodeInserted", function(event){ 
    var target = event.srcElement || event.target; 
    if (target && target.tagName.toLowerCase() == 'input') { 
     // do what you want to do here.... 
    } 
}); 

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

function init() { 
    $('.input_box').not('.initialized').each(function() { 
     var ac = $(this).addClass('initialized').autocomplete(acOptions); 
    }); 
} 
+0

Спасибо, что делает работу красиво. Другой вариант, о котором я думал сразу после публикации, - проверить, присутствует ли атрибут плагина (ac, который я прикрепляю к атрибуту данных). Я предпочитаю это, так как код намного чище. – cynod

+0

Еще одна точка для других читателей: если вы клонируете элементы, к которым применяется указанный выше метод, новые элементы будут включать в себя «инициализированный» класс. Итак, после того, как вы клонируете их, обязательно вызовите .removeClass ('initialized') перед вызовом init(). – cynod

Смежные вопросы