2013-08-15 4 views
2

Так что я знаю о функции .on() jQuery, чтобы давать обработчики событий динамически добавленного элемента.jQuery .on() "append"

Например, я использовал это так

$(document).on("change",Items,function(){/*Code here*/}); 

Но есть способ, чтобы использовать эту .Ну() функцию (или что-то еще), чтобы вызвать функцию когда объект был прилагаемой в документ ? Я спрашиваю, потому что я использую JQuery плагин называется Избранным, который создает более полей выбора, и она работает с использованием линии

$(selector).chosen(); 

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

Редактировать: Проблема не в том, что я не могу использовать .chosen() после добавления элемента. Потому что я могу! Я просто хочу, чтобы мой код был лучше организован, так как строка $ (селектор) .chosen() была скрыта полностью в нижней части моего кода незаметно.

Мой код:

//Create the dropdown box for the items 
var Items = document.createElement("select"); 
$(Items).attr({"id":"Items"}); 

$(document).on("change",Items, 
    function(){ 
     updateHolder(true); 
     $(InfoBox).trigger("chosen:updated"); 
     setTimeout(
      function(){ 
       $(Items).data('chosen').input_blur(); 
      }, 100 
     ); 
    } 
); 

//Add items from ED.listOfItems to HTML Items dropdown box 
for(var it in ED.listOfItems){ 
    var iKey = ED.listOfItems[it]; 
    var itemOption = document.createElement("option"); 
    if(!Array.isArray(iKey)){ 
     $(itemOption).val(iKey); 
     $(itemOption).html(iKey.split("_")[0]); 
    } 
    else{ 
     $(itemOption).val(iKey[0]); 
     $(itemOption).html(iKey[1]); 

    } 
    $(Items).append(itemOption); 
} 

/*******Set default to spawn*******/ 
/**/ ED.objectType = "Spawn"; /**/ 
/**/ ED.infoType = "";   /**/ 
/**/ $(Items).val("Spawn");  /**/ 
/**********************************/ 


$(MenuBar).append(Items); 

$(Items).chosen({disable_search_threshold: 100}); 
$("#Items_chosen").css({"width":"100px","position":"absolute","left":"5px","top":"20px"}); 

Как вы можете видеть, второй в последней строке выбранной линии, но это только кажется, что в нелогичной место для меня. Я очень OCD с моим кодом: P

+0

как вы добавляете элемент? –

+1

Возможный дубликат [Самый эффективный метод обнаружения/мониторинга изменений DOM?] (Http://stackoverflow.com/questions/2457043/most-efficient-method-of-detecting-monitoring-dom-changes) – Bergi

+0

@Stefan Я просто использовать $ (parentElement) .append (childElement) –

ответ

1

Я только что нашел ответ, который мне нужен по другому вопросу, но он никогда не принимался. Ответ Марио Bellart, Fire OnAppend event for jQuery element when it gets appended to the DOM

Как я адаптировал свой код

//Create the dropdown box for the items 
var Items = document.createElement("select"); 
$(Items).attr({"id":"Items"}); 

$(document).on("append", Items, 
    function(){ 
     $(Items).chosen({disable_search_threshold: 100}); 
     $("#Items_chosen").css({"width":"100px","position":"absolute","left":"5px","top":"20px"}); 
    } 
); 

$(document).on("change",Items, 
    function(){ 
     updateHolder(true); 
     $(InfoBox).trigger("chosen:updated"); 
     setTimeout(
      function(){ 
       $(Items).data('chosen').input_blur(); 
      }, 100 
     ); 
    } 
); 

//Add items from ED.listOfItems to HTML Items dropdown box 
for(var it in ED.listOfItems){ 
    var iKey = ED.listOfItems[it]; 
    var itemOption = document.createElement("option"); 
    if(!Array.isArray(iKey)){ 
     $(itemOption).val(iKey); 
     $(itemOption).html(iKey.split("_")[0]); 
    } 
    else{ 
     $(itemOption).val(iKey[0]); 
     $(itemOption).html(iKey[1]); 

    } 
    $(Items).append(itemOption); 
} 

/*******Set default to spawn*******/ 
/**/ ED.objectType = "Spawn"; /**/ 
/**/ ED.infoType = "";   /**/ 
/**/ $(Items).val("Spawn");  /**/ 
/**********************************/ 

$(MenuBar).append(Items).trigger("append"); 

Я не знал о .trigger() и создания пользовательских событий. Может быть, я должен еще немного почитать.

3

Может быть, есть лучший способ, но я обычно добавляю класс как «to_replace» для вновь создаваемых элементов, а затем использовать:

$(".to_replace").each(function() { 
    $(this).removeClass("to_replace").choosen(); 
}) 

каждый раз, когда я изменил что-нибудь.

+0

Это очень полезно. Не совсем так, как мне хотелось бы это сделать, но мне кажется, что я просто буду придерживаться применения .chosen() в своем коде после добавления его. Хотя этот маленький трюк может спасти меня в будущем! –

1

document не запускает событие change. (Edit ОП делегирование change)

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

+0

Да, но переменная Items является элементом select, а метод jQuery .on() привязывает эту функцию к этому элементу каждый раз, когда он будет изменен. Вот как это работает. Кроме того, MutationObserver выглядит интересным, но просто сделает мой код более беспорядочным, когда это просто чисто эстетически приятный код: P Все еще полезно, хотя, спасибо! –

+0

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

0

У меня возникла проблема добавления класса к элементу, который я создал и добавил, поскольку этот класс имеет переход, css-переходы не работают, если элемент не находится в дереве DOM, все решения, которые я пробовал, «т работа для меня, так что я закончил с этим обходным:

elementParent.append(elementToAdd); 
    setTimeout(() => { 
    $(elementToAdd).addClass("show"); 
    }, 0); 

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