rails 3.1 ajax调用似乎杀死了javascript监听器

时间:2011-12-16 01:02:59

标签: jquery ajax ruby-on-rails-3.1

Rails 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中跟踪它们。 show页面没有包含数据行为属性的元素,它们位于使用ajax调用的部分中。

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

应该打开一个display:none div来做一些JavaScript更新。如果我将断点放在var c行,它永远不会被调用。似乎远程呼叫会杀死听众。

我是否必须在远程调用上重新加载questions.js文件?或者我做错了什么?

我以前似乎已经这样做了,但我找不到问题。

2 个答案:

答案 0 :(得分:1)

如果您要替换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,但不是替换它的本身。

答案 1 :(得分:0)

不看Rails服务器的响应,但看起来它正在用新元素替换所有元素,因此这就是所有事件监听器都消失的原因。

看看jQuery .live() - http://api.jquery.com/live/。使用它而不是.click()将确保事件侦听器将出现在所有匹配元素上,包括将来的