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文件?或者我做错了什么?
我以前似乎已经这样做了,但我找不到问题。
答案 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()将确保事件侦听器将出现在所有匹配元素上,包括将来的