2012-01-05 38 views
2

На моей странице у меня есть динамически сгенерированный список переключателей (созданных с помощью AJAX). Список переключателей динамически генерируется, потому что он изменяется в зависимости от предыдущего выбора формы. Вот пример динамически генерируемый список переключателей (это отображается в Firefox DOM-просмотрщик надстройки, но не в «View Page Source»):jQuery не добавляется к динамически созданным элементам

<li> 
<input name="giftcard_value" type="radio" id="25" value="25" /> 
<label for="25">$25</label> 
<a class="radio-select" href="#">Select</a><a class="radio-deselect" href="#">Cancel</a> 
</li> 

<li> 
<input name="giftcard_value" type="radio" id="50" value="50" /> 
<label for="50">$50</label> 
<a class="radio-select" href="#">Select</a><a class="radio-deselect" href="#">Cancel</a> 
</li> 

У меня также есть другой скрипт JQuery, который я использую «щелкать» радиокнопками косвенно через ссылки/изображения. В приведенном выше коде фактический переключатель (внутри тега ввода) скрыт от пользователя. Пользователь нажимает на переключатель, нажимая на ссылку «Выбор», которая имеет класс «радио-выбор» (на самом деле это изображение). Сценарий jQuery обнаруживает, когда на ссылку/изображение нажимается «$ («. Radio-select »). Нажмите«, а затем запускает функцию, которая «нажимает/проверяет» фактический переключатель. Вот скрипт JQuery:

$(".radio-select").click(
      function(event) { 
       event.preventDefault(); 
       var $boxes = $(this).parent().parent().children(); 
       $boxes.removeClass("selected"); 
       $(this).parent().addClass("selected"); 
       $(this).parent().find("[type=radio]").click().attr("checked","checked"); 
      } 
     ); 

Моя проблема заключается в том, что скрипт JQuery не работает с динамически генерируемых радиокнопок. Он работает, если я жестко закодирую радиокнопки в html (видимый через «источник страницы просмотра» в браузере), но не если они генерируются динамически. Похоже, что jQuery не может обнаружить «.click» в ссылке/изображении и, таким образом, никогда не нажимает на фактический переключатель. Любая идея, в чем проблема? Любая помощь приветствуется!

+0

Это дубликат - http://stackoverflow.com/questions/203198/jquery-event-binding-on-dynamically-created-elements – mrtsherman

ответ

3
$(".radio-select").live("click", function(event){   
        event.preventDefault(); 
        var $boxes = $(this).parent().parent().children(); 
        $boxes.removeClass("selected"); 
        $(this).parent().addClass("selected"); 
        $(this).parent().find("[type=radio]").click().attr("checked","checked"); 
       } 
      ); 
7

проверка delegate и on способ.

Пример

$("table").delegate("td", "click", function() { 
    $(this).toggleClass("chosen"); 
}); 

http://api.jquery.com/delegate/

из JQuery страницы,

По JQuery 1.7, .delegate() был заменен методом .on(). Для более ранних версий, однако, остается наиболее эффективным средством для делегирования событий использования

http://api.jquery.com/on/

пример

$("p").on("click", function(){ 
alert($(this).text()); 
}); 
+0

Если вы находитесь в JQuery 1.4.2+ вы не должны также используйте live. Вместо этого используйте делегат. Делегат также является хорошим выбором для jQuery 1.7+ http://api.jquery.com/delegate/ – mrtsherman

+1

Не используйте 'live()', используйте ['on()'] (http: //api.jquery. ком/на /). Если вы не используете версию jQuery, которая меньше 1.7, затем используйте ['delegate()'] (http://api.jquery.com/delegate/). –

+0

Спасибо! Я наткнулся на несколько ссылок на метод live()/delegate(), но я новичок в jQuery, поэтому я не совсем понимаю, как его использовать. Не могли бы вы объяснить немного более подробно (нужно ли это поместить в jQuery, который динамически генерирует переключатели или jQuery, который выбирает радиокнопки? – Stone

1

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

+0

Спасибо за объяснение. Теперь все ясно. – Stone

1

Если вы используете jQuery 1.3.2 и выше, вам нужно использовать jQuery live. Так что ваши привязки станут:

$(".radio-select").live('click',function(event) { 

      event.preventDefault(); 
      var $boxes = $(this).parent().parent().children(); 
      $boxes.removeClass("selected"); 
      $(this).parent().addClass("selected"); 
      $(this).parent().find("[type=radio]").click().attr("checked","checked"); 

     } 
    ); 

Если вы используете JQuery ниже 1.3.2, используйте livequery плагин.