数据表我在分页后无法调用onclick事件?

时间:2011-12-28 21:24:55

标签: javascript jquery datatables

我正在使用http://datatables.net/

他们主页上的演示表几乎与我正在使用的完全相同(特别是分页),除了每行都有一个要点击的区域:

<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;
};

3 个答案:

答案 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
        });
    }
});