1

我有一个jqGrid表,其中包含我用 CSS 和prettyCheckable自定义的多选复选框。

要自定义我的表的所有复选框,我设置.prettyCheckable()如下:

jQuery(document).ready(function($){
    $("input[type=checkbox]").change(function() {
        $(this).triggerHandler("click");
    }).prettyCheckable();
}); 

但这不起作用。只有第一个复选框具有样式。

jqGrid

所以我尝试将函数.prettyCheckable()插入到loadCompletejqGrid,并按照Oleg #here的建议,通过为<a>.

这是我的 jqGrid 设置:

$(document).ready(function() {
     $('#searchForm').ajaxForm(function() {
        var _data = $('#searchForm').serialize();
        $('#ResultsTable').jqGrid().setGridParam({
            url: '${searchUrl}' + _data,
            loadComplete: function () {
                $(this).find("input.cbox").prettyCheckable();
            }
        }).trigger("reloadGrid")
        return true;
    });
    jsonTable('ResultsTable', 'ResultsPager', '${searchUrl}', 'searchForm',
        {id: 'code'},
        ['Code', 'Description', 'CF'],
        [{name: 'code', index: 'code', width: 55},
        {name: 'description', index: 'description', width: 90},
        {name: 'CF', index: 'CF', width: 80},
        function(id) {
            var selRows = $(this).jqGrid('getGridParam', 'selarrrow');
            $('#edit').toggle(selRows.length == 1);
            $('#delete').toggle(selRows.length > 0);
            $('#editForm #code').val(selRows);
            $('#deleteForm #code').val(selRows);
            //$("#jqg_" + $.jgrid.jqID(this.id + "_" + id)).next("a").toggleClass('checked');
        },
        function(aSel, selected) {
            $('#edit').toggle(false);
            $('#delete').toggle(selected);
            if (selected) {
                $('#editForm #code').val(selRows);
                $('#deleteForm #code').val(selRows);
            }
        },
        true
    )      
});

但也用这个不起作用,我该如何解决这个问题?

我在这里创建了一个小演示:jsfiddle.net/LStvX/1
任何帮助表示赞赏,谢谢!

4

1 回答 1

2

首先,我发现 jqGrid 中其他插件的集成很有趣。我之前没用过prettyCheckable。在对工作方式进行相同分析后,prettyCheckable我创建了演示这种集成示例的演示。结果如下图所示

在此处输入图像描述

要理解代码,应该理解prettyCheckable使用多选复选框转换单元格的原始 HTML 片段

在此处输入图像描述

在更复杂的结构中

在此处输入图像描述

我发现总是创建增加列高度的prettyCheckable空元素并不好。<label>所以我添加了<label>隐藏所有元素的代码。

下一个问题是prettyCheckable使用<a>带有可选类的元素"checked"作为 chechboxes 并通知prettyCheckable每个change事件的原始复选框(初始化后隐藏),但 jqGrid 等待click行或复选框上的事件并且对change事件没有反应。

我现在跳过一些不太有趣的技术细节。您在下面找到的演示代码中最重要的部分

$("#list").jqGrid({
    ...
    multiselect: true,
    multiselectWidth: 28,
    onSelectAll: function (aRowids, status) {
        var i, l = aRowids.length, $a,
            selector = "#jqg_" + $.jgrid.jqID(this.id) + "_";

        for (i = 0; i < l; i++) {
            $a = $(selector + $.jgrid.jqID(aRowids[i])).next("a");
            if (status) {
                $a.addClass("checked");
            } else {
                $a.removeClass("checked");
            }
        }
    },
    beforeSelectRow: function (rowid, e) {
        if (e.target.nodeName.toUpperCase() === "A" &&
                $(e.target).prev("input").hasClass("cbox")) {
            $(e.target).prev("input").click();
        }
        return true;
    },
    onSelectRow: function (rowid, state) {
        var $a = $("#jqg_" + $.jgrid.jqID(this.id + "_" + rowid)).next("a");
        if (state) {
            $a.addClass("checked");
        } else {
            $a.removeClass("checked");
        }
    },
    loadComplete: function () {
        var $checkboxes = $(this).find("input.cbox");
        $checkboxes.prettyCheckable();
        $checkboxes.siblings("label").hide();
    }
});
$("#cb_" + $.jgrid.jqID($grid[0].id)).change(function() {
    $(this).triggerHandler("click");
}).prettyCheckable();
$("#cb_" + $.jgrid.jqID($grid[0].id)).siblings("label").hide();

我使用了额外的 CSS 设置(见答案)来增加列标题的高度

th.ui-th-column div {
    white-space: normal !important;
    height: auto !important;
}
于 2013-06-19T15:26:33.543 回答