rails 3.1 вызов ajax, кажется, убивает слушателя JavaScript - PullRequest
1 голос
/ 16 декабря 2011

Рельсы 3.1, у меня есть сырая модель Вопрос.На странице показа я перечисляю связанные ответы (@answer, определенный в контроллере)

В области ответов есть ссылка для удаленного вызова, которая работает нормально, используя принятые вложенные атрибуты:

<span class="crud">
  <%= link_to 'Edit/Add Answers', edit_answers_question_path(params[:id]), :"data-remote" => true %>
</span>

Какиезаменяет список @questions формой, позволяющей редактировать / обновлять все ответы.

Вопросы содержат jquery javascript questions.js (версия с заглушкой, которую я не могу получить)

$(document).ready(function() {
  $('[data-behavior="edit_contains"]').click(function(e) {
    var c = 1 
    alert(this);
    return(false)
  });
  $('[data-behavior="edit_numeric"]').click(function(e) {
    var c = 2 
    alert(this);
    return(false)
  })
})  

При первой загрузке страницы показа создаются списки, по крайней мере, я могу отследить их в chrome / safari.Страница показа не имеет элементов с атрибутами поведения данных, они по частям вызываются с помощью ajax.

<%= link_to "Edit Helper","##{builder.object.sequence}","data-behavior" => "edit_contains", :id => "seq_#{builder.object.sequence}"%>

Предполагается открыть отображение: нет div для обновления JavaScript.Если я поставлю точку останова в строке var c, она никогда не будет вызвана.Кажется, что удаленный вызов убивает слушателей.

Нужно ли перезагрузить файл questions.js при удаленном вызове?или что я делаю не так?

Кажется, я делал это раньше, но не могу найти проблему.

Ответы [ 2 ]

1 голос
/ 16 декабря 2011

Если вы заменяете блок HTML (трудно сказать по вашему вопросу), то все прослушиватели событий, прикрепленные непосредственно к заменяемым элементам (что вы делали с вашими обработчиками .click()), будут удалены , Эти обработчики событий были прикреплены к определенным элементам на странице, и если вы заменили эти элементы, то все обработчики событий в этих элементах исчезнут, пока вы не установите новые обработчики событий на новые элементы.

Вы можете обойти это, используя .delegate('click', ...) (до jQuery 1.7) или .on('click', ...) (jQuery 1.7+) на родительском объекте, и пусть события всплывают до родительского объекта, который не заменяется. Это позволит вашим обработчикам событий работать при создании или замене новых объектов.

Так как вы не включили свой HTML, я должен догадаться, но вы можете определить свои обработчики событий, как это в jQuery 1.7 +:

$(document).ready(function() {
  $(document).on('click', '[data-behavior="edit_contains"]', function(e) {
    var c = 1;
    alert(this);
    return(false);
  });
  $(document).on('click', '[data-behavior="edit_numeric"]', function(e) {
    var c = 2; 
    alert(this);
    return(false)
  });
});

В идеале вы должны заменить document общим родительским объектом, который находится ближе к объектам, которые вы заменяете, но не является чем-то, что заменяется самим.

0 голосов
/ 16 декабря 2011

Не смотря на ваш ответ от сервера Rails, но похоже, что он заменяет все элементы новыми элементами, поэтому все прослушиватели событий исчезли.

Посмотрите на jQuery .live () - http://api.jquery.com/live/. Использование этого параметра вместо .click () гарантирует, что прослушиватели событий будут присутствовать на всех соответствующих элементах, включая будущие

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...