2014-09-03 5 views
0

У меня есть сценарий jQuery, который помогает мне отмечать строки в таблице. Также у меня есть функция AJAX, которая позволяет загружать дополнительные данные в эту таблицу. Моя идея - вызвать функцию Picker каждый раз после того, как AJAX использовал, чтобы эти данные также были помечены. Он работает, но очень нестабилен - я могу отметить некоторые блоки загруженных данных и не могу отметить другие. И я не могу поймать, где я ошибаюсь.Функция вызова после загрузки AJAX

<script> 
var Picker = function() { // This is marker script 
     $(".query, .schedule_query_table_highlight").click(function(){ 
     if ($(this).attr("class") == "schedule_query_table_highlight") { 
      $(this) 

.removeClass("schedule_query_table_highlight"); 
      $(this).addClass("query"); 
     } 
     else { 
     $(this).removeClass("query"); 
     $(this).addClass("schedule_query_table_highlight"); 
     } 
     }); 
}; 

$(document).ready(function(){ 
    Picker(); 
    $("#more").click(function(){ 
    $(".more_space").load("inquery_ajax.php?date=" + curr_year + "-" + curr_month + "-" + curr_date, function(){ 
      Picker(); 
     });   
     $(".more_space").addClass("loaded" + days); 
     $(".more_space").removeClass("more_space"); 
     $(".loaded" + days).after("<x class=more_space></x>"); 
     $("#more").insertBefore(".more_space"); 
    }); 
}); 
</script> 

UPD: FIDDLE

+1

'$ (" # more "). InsertBefore (". More_space ")' добавляет к странице несколько элементов с одинаковым идентификатором 'id', что является плохой идеей. Кроме того,' $ («# more»). не работает для динамически создаваемых элементов. – Regent

+0

Возможно, вы создадите [скрипку] (http://jsfiddle.net), воспроизводящую вашу проблему, чтобы можно было исправить все ошибки. – Regent

+1

Вы должны использовать делегирование делегирования с 'on()' вместо 'click()'. http://api.jquery.com/on/ И как сказал @Regent, у вас не может быть дублированного идентификатора, иначе у вас будут проблемы. –

ответ

1

Не знаю, что является неустойчивым, но я предполагаю, что нестабильные здесь означает, что новое содержание не получает подсвечивается. Поскольку содержание является динамическим, используйте обязательный документ событие

$ (документ) .он ("щелчок", функция() {

Пример кода ".schedule_query_table_highlight запроса.":

var Picker = function() { // This is marker script 
     $(document).on("click",".query .schedule_query_table_highlight",function(){ 
     if ($(this).attr("class") == "schedule_query_table_highlight") { 
      $(this) 

.removeClass("schedule_query_table_highlight"); 
      $(this).addClass("query"); 
     } 
     else { 
     $(this).removeClass("query"); 
     $(this).addClass("schedule_query_table_highlight"); 
     } 
     }); 
}; 
+0

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

+0

Спасибо, сейчас работает! Удивительно. Но также я добавил функцию Picker еще на одно место, так что окончательный код выглядит следующим образом:. '$ (документ) .ready (функция() { \t Picker(); \t $ ("# больше") нажмите . (функция() { \t \t \t \t $ ("more_space ") нагрузка (" inquery_ajax.php даты =?" + curr_year + "-" + curr_month + "-" + curr_date, функция() { \t \t \t Выбор(); \t \t}); \t \t \t \t \t \t Picker(); ' Похоже, что это не самый чистый код, но он работает. Есть ли способы его оптимизации? – Bullwinkle

+0

@Regent, пожалуйста, проверьте [Fiddle полный код] (http://jsfiddle.net/t7z8a4xp/2/) – Bullwinkle

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