他们主页上的演示表几乎与我正在使用的完全相同(特别是分页),除了每行都有一个要点击的区域:
<a href="#" class="show-post"><%= Post.title %></a>
此链接打开一个jquery UI模式对话框,显示一些ajax请求的信息。
第1部分(已解决),见下文第2部分
我正在尝试运行一个在第一页上正常工作的onclick事件,但是一旦我转到第2页(或任何其他人),它就会停止工作。我检查了源代码以确保它在所有代码中都没有做任何有趣的事情(所有行,甚至是分页隐藏的行)
有什么想法吗?
$(function() {
$('#dialog').dialog({
autoOpen: false,
resizable: false,
maxHeight: 600,
width: 650,
modal: true,
beforeClose: function close() {
$('#dialog').html('');
}
});
$('.show-post').click(function() {
clickLink(this);
return false;
});
});
感谢那些回答我问题的人!我解决了这个问题。
第2部分
我的下一个“问题”ID就像开始工作一样......我正在使用左右箭头键让他们“扫描”到下一行或上一行,并显示信息。这与关闭它然后必须单击下一个相反。
当你到达第一页的底部或第二页的顶部时,我想这样做,分别隐藏下一个/上一个将自动加载该页面,转到顶部(或底部),然后打开另一页上该行的对话框。
继承我的点击功能(我知道它可能没有最好的结构......我对jquery很新)
$(document).ready(function() {
oTable = $('#posts').dataTable({
"bJQueryUI": true,
"iDisplayLength": 400,
"bAutoWidth": false,
"sPaginationType": "full_numbers",
"aLengthMenu": [[-1, 400, 100, 50], ["All", 400, 100, 50]]
});
$(this).keydown(function(e) {
var id = $("#dialog").attr("data-id");
currentPost = $("#posts tr[data-id=" + id + "]");
if (e.keyCode == 39 && $('#dialog').html() != "") {
/* Remove current background */
$(currentPost).blur()
$(currentPost).removeClass("current");
$(currentPost).find("td.sorting_1").removeClass("current");
var next = currentPost.next().find(".show-post");
clickLink(next);
} else if (e.keyCode == 37 && $('#dialog').html() != "") {
/* Remove current background */
$(currentPost).removeClass("current");
$(currentPost).find("td.sorting_1").removeClass("current");
var prev = currentPost.prev().find(".show-post");
clickLink(prev)
}
});
});
继承了实际的点击功能
function clickLink(src) {
var post = $(src);
var id = $(post).parent().parent().attr('data-id');
/* Set background for current line */
$(post).parent().parent().find("td.sorting_1").addClass("current");
$(post).parent().parent().addClass("current");
$('#dialog').attr("data-id", id);
$('#dialog').load('/show-post/' + id, function() {
$.ajax({
type: "POST",
url: "/checkstatus/" + id,
dataType: "html",
error: function(data){
$("#dialog").fadeOut("fast", function() {
$("#dialog").html("<img src='/img/invalid.jpg' alt='invalid' style='margin: 40px auto; display: block;'>").fadeIn("slow");
});
}
});
/* Set Visited */
$(post).parent().parent().removeClass("visited").addClass("visited");
$('#dialog').dialog({
title: post.html(),
beforeClose: function close() {
$(post).parent().parent().find("td.sorting_1").removeClass("current");
$(post).parent().parent().removeClass("current");
},
buttons: {
"Email 1": function() {
$.ajax({
type: "POST",
url: "/get-email/" + id + "/" + "1",
dataType: "html",
success: function(data) {
window.location.href = data + "&subject=" + post.html();
}
});
},
}
});
$('#dialog').dialog('open');
});
return false;
};
答案 0 :(得分:25)
您提供的链接上的示例似乎是添加/删除DOM元素,这意味着后续页面上的元素可能不在页面加载的DOM中。您是否尝试过使用事件委托?
$(<root element>).delegate('.show-post', 'click', function() {
clickLink(this);
return false;
});
<root element>
可以是document
,但应设置为始终位于DOM中的祖先元素。
.delegate()
:
为所有匹配的元素附加处理程序到一个或多个事件 选择器,现在或将来,基于一组特定的根 元件。
来源:http://api.jquery.com/delegate
<强>更新强>
请注意,.delegate()
现在是.on()
的别名,所以如果您使用的是jQuery 1.7+,我只需要从一开始就使用.on()
。除交换选择器和事件之外几乎相同的语法:$(<root element>).on('click', '.show-post', function() { ... });
来源:感谢Greg Pettit,优秀评论
答案 1 :(得分:4)
以下代码正常运作。当您点击分页按钮&#39; drawCallback&#39; class在表加载后调用一些函数。
$("#YourTableID").dataTable({ bJQueryUI: false, bFilter: false, bSearchable: false, bInfo: false, bAutoWidth: false, bDestroy: true, "oLanguage": { "sEmptyTable": "No Records Found" }, "sPaginationType": "full_numbers", "bLengthChange": false, "iDisplayLength": 5, aaData: arrv, aoColumns: [{ sTitle: "Select", orderable: false, className: 'select-checkbox', targets: 0 }, { sTitle: "Course name" }, { sTitle: "Level" }, { sTitle: "Study Mode" }, { sTitle: "Entry Year" }, { sTitle: "Point of Entry" }, { sTitle: "Awarding qualification" }], drawCallback: function () { //Some function... }, select: { style: 'os', background: 'color:gray', selector: 'td:first-child' }, order: [[1, 'asc']], });
答案 2 :(得分:3)
正如@scrappedcola在评论中指出的那样,您的点击处理程序在分页后会丢失。您可以实现的DataTables有一个drawCallback
函数,它将在“重新绘制”表格后触发(因此drawCallback)。这是一个例子:
$('#someId').DataTable({
lengthMenu: [ 25, 50, 100, 200 ],
order: [[ 0, 'asc' ]],
processing: true,
serverSide: true,
stateSave: true,
responsive: true,
bDestroy: true,
columns: [
{ data: 'id', name: 'id' },
{ data: 'name', name: 'name' },
],
drawCallback: function() {
var api = this.api();
api.$('#someBtnId').click(function() {
// do some click handler stuff
});
}
});