onchange事件处理程序触发两次

时间:2016-06-18 09:20:47

标签: javascript jquery datatables

我编写了下面的jQuery函数来调用数据表上的过滤器。但是"改变" jQuery函数似乎似乎只需单击一次就会调用两次,因此,如果我尝试关闭其中一个过滤器,它会立即重新打开。

功能:

$(document).ready(function () {
    var table = $('#example').DataTable({
        rowReorder: {
            selector: 'td:nth-child(2)'
        },
        responsive: true,

        initComplete: function () {
            var filters = $('div[id$=referalFilters]').find('input:checkbox');
            filters.each(function () {
                dict.push({
                    key: $(this).prop('name'),
                    value: $(this).prop('checked')
                });
                $(this).change(function () {
                    var currentName = $(this).prop('name');

                    for (var i = 0; i < dict.length; i++) {
                        if (dict[i].key == currentName) {
                            if (dict[i].value == true) {
                                dict[i].value = false;
                            } else {
                                dict[i].value = true;
                            }
                        }
                    }
                    for (var i = 0; i < dict.length; i++) {
                        if (dict[i].value == true) {
                            $.fn.dataTable.ext.search.push(function (settings, data, dataIndex) {
                                var currentStatus = data[3];
                                var found = false;
                                for (var i = 0; i < dict.length; i++) {
                                    if (currentStatus == String(dict[i].key)) {
                                        if (dict[i].value == true) {
                                            found = true;
                                        }
                                    } 
                                }
                                if (found) {
                                    return true;
                                }
                                return false;
                            })
                        }
                    }
                    table.draw();
                });
            });
            //this.api().columns().every( function () {
            //    var column = this;
            //} );
        }

    });
});

如果有人能让我知道多次触发更改功能,我将不胜感激。

这是jsfiddle:https://jsfiddle.net/a81h11tc/。在Js fiffle中,按钮似乎切换,但过滤不会发生。

1 个答案:

答案 0 :(得分:0)

据我所知,你的问题是dict内未定义的变量initComplete。在var dict = [];之前添加var filters = ...后,它就像一个魅力。 (我的理解是您希望列状态隐藏包含所单击过滤器值的行。如果您想要相反,请相应地修改您的代码。)这是JSFiddle如果改变了代码,它应该按照你想要的方式工作。

提示顺便说一下,请记住要经常检查浏览器的控制台,因为在大多数情况下,您可以看到相应内容的正确错误消息(即代码所说的{ {1}},这基本上是你的代码唯一的问题。)