我有一个包含jobs
列表的rails应用。根据{{1}}的状态,该作业将有某些按钮。为了使我的应用感觉更像本机应用程序,当其中一个作业的状态发生变化时,我使用javascript添加新的html按钮而不刷新页面。新添加的html按钮有一个类与javascript事件绑定。但每当我点击该按钮时,应该触发的事件永远不会消失。以下是一些例子:
正在刷新页面时创建的正常工作按钮
job
使用javascript添加的按钮
<div id="user_completed<%= i %>">
<% if !is_runner?(@user) && job.status == 'assigned' %>
<div class="row job-buttons" id="user_completed_button_row<%= i %>">
<div class="small-6 columns">
<div class="button small success radius user_completed_button" data-job-id="<%= i %>">job completed</div>
</div>
</div>
<% end %>
</div>
这两个按钮应该是等效的。当作业在刷新页面时处于“完成”状态时创建第一个按钮,并且当作业处于“完成”状态并且页面未刷新时创建第二个按钮。这两个按钮应该具有完全相同的HTML。
现在,当单击第一个按钮时,javascript事件会顺利关闭,但是当单击第二个按钮时,javascript事件根本不会触发。我一直在检查chrome开发人员工具,他们似乎有完全相同的HTML。
这是我试图触发的事件。
var user_completed = '<div class="row job-buttons" id="user_completed_button_row' + id + '">' +
'<div class="small-6 columns">' +
'<div class="button small success radius user_completed_button" data-job-id="' + id + '">job completed</div>' +
'</div>' +
'</div>';
var user_completed_div = "#user_completed" + id;
$(user_completed_div).html(user_completed);
旁注:我正在使用javascript插件推送器以及turbolinks。我不知道这是否有所作为,只是想提到它。
答案 0 :(得分:1)
要处理动态创建的DOM对象的事件,您应该使用jQuery on
方法。像这样的东西
$('.user_completed_button').on('click', function(event) { ... })
此处有更多文档:http://api.jquery.com/on/
答案 1 :(得分:1)
似乎您可能在元素位于页面之前绑定了单击处理程序,并且jQuery将仅在绑定发生时绑定到列表中的元素。
要确保您可以获取动态创建的元素,请将侦听器添加到父对象并按照建议使用on
(如果您有较旧的jQuery,则使用delegate
)
$('#user_completed_holder_or_whatnot').on('click', '.user_completed_button', function(e) {
var id = $(this).data('job-id');
var url = "/jobs/" + id;
$.ajax({
type: "PUT",
url: url,
data: {job: {status: "completed"}},
async: false,
});
});
这表示对于持有者的任何点击('#user_completed_holder_or_whatnot'),如果点击的目标与第二个参数('。user_completed_button')传递的选择器匹配,则运行handle方法。
编辑:您也可以在动态创建元素后重新绑定,但这会增加潜在的性能开销或使您的代码变得混乱。
答案 2 :(得分:0)
将监听器绑定到document
,以便稍后添加该按钮:
$(document).on('click', '.user_completed_button', function(e) {
var id = $(this).data('job-id');
var url = "/jobs/" + id;
$.ajax({
type: "PUT",
url: url,
data: {job: {status: "completed"}},
async: false,
});
});
这相当于jQuery的弃用/删除live
函数。