【问题标题】:Make JqGrid Column Chooser Pop-Up Draggable使 JqGrid 列选择器弹出可拖动
【发布时间】:2016-02-26 09:39:02
【问题描述】:

我正在尝试使 jqgrid 列选择器弹出窗口可拖动到屏幕的任何位置。

因此我尝试将jquery.jqgrid.js 更改为:

columnChooser: function (opts) {
    var self = this;
    if ($("#colchooser_" + $.jgrid.jqID(self[0].p.id)).length) { return; }
    var selector = $('<div id="colchooser_' + self[0].p.id + '" style="position:relative;overflow:hidden"><div><select multiple="multiple"></select></div></div>');
    var select = $('select', selector);

    function insert(perm, i, v) {
        if (i >= 0) {
            var a = perm.slice();
            var b = a.splice(i, Math.max(perm.length - i, i));
            if (i > perm.length) { i = perm.length; }
            a[i] = v;
            return a.concat(b);
        }
    }
    opts = $.extend({
        "width": 'auto',
        "height": 260,
        "classname": null,
        "done": function (perm) { if (perm) { self.jqGrid("remapColumns", perm, true); } },
        /* msel is either the name of a ui widget class that
        extends a multiselect, or a function that supports
        creating a multiselect object (with no argument,
        or when passed an object), and destroying it (when
        passed the string "destroy"). */
        "msel": "multiselect",
        /* "msel_opts" : {}, */

        /* dlog is either the name of a ui widget class that 
        behaves in a dialog-like way, or a function, that
        supports creating a dialog (when passed dlog_opts)
        or destroying a dialog (when passed the string
        "destroy")
        */
        "dlog": "dialog",
        "dialog_opts": {
            "minWidth": 550
        },
        "draggable": function (IsDraggable) {
            if (IsDraggable) {
                this.draggable();
            }

        },

       ....
       ....
       ....
       ....
       ....
}

我的代码位于上述函数的最后一个属性draggable。 即我创建了一个如下所示的可拖动属性:

"draggable": function (IsDraggable) {
    if (IsDraggable) {
        this.draggable();
}

但是我的列选择器的弹出窗口无法拖动。

我在这里感到震惊。 我想将jqgrid 中的列选择器移动到屏幕的任意位置。

【问题讨论】:

    标签: javascript jquery jquery-ui jqgrid


    【解决方案1】:

    首先,您永远不应该修改jquery.jqgrid.jsjquery.jqgrid.src.js 的代码。取而代之的是,您始终可以使用$.jgrid.extend(...);替换 jqGrid 方法columnChooser,例如,新的实现。以my old answer 为例。

    我认为您的问题的根源是缺少您必须包含的 JavaScript 或 CSS 文件。重要的是要了解columnChooser 使用多选插件ui.multiselect.jsui.multiselect.css,这是作为jQuery UI 小部件实现的。因此,还必须包括jquery-ui.min.js 而不仅仅是jquery-ui.min.css。请参阅 the demo 作为您应该包含的 CSS 和 JS 文件的示例或 more simple demo,为 the answer 创建。

    【讨论】:

    • 是的。我接受。我在一个项目中,我试图在 jqgrid 中实现该功能。此尝试成功后,我将扩展 jqgrid 列选择器。当然,我已经包含了你提到的所有文件。
    • @Vikash:例如尝试the demo。对话框可以通过拖放移动,可见列可以在左窗格内重新排序,也可以通过从左窗格拖动到右侧窗格来隐藏。演示中还缺少哪些其他拖放功能?您可以打开代码并查看演示中包含的所有文件。
    • 非常感谢。我得到了解决方案。
    • @Vikash:不客气!你的问题的根源是什么?顺便说一句,如果问题解决了,请不要忘记"accept" 答案。
    • 我回答了这个问题。非常感谢。
    【解决方案2】:

    我得到了解决方案。问题是什么,我已经修复了 CSS 中的 topleft 属性并将其标记为 !important。因此,当我拖动弹出窗口时,顶部和左侧位置会更改值(我们可以通过浏览器的控制台窗口看到),但由于我设置了!important,它永远不会移动。

    现在我通过不将topleft 属性设置为!important 解决了这个问题。

    一个错误:

    .ui-dialog{
        top: 10px !important;
        left 10px !important;
     }
    

    以上是错误的。我们不应该设置topleft

    更正为:

     .ui-dialog{
        top: 10px;
        left 10px;
     }
    

    【讨论】:

    • 您添加了哪些确切的 CSS 规则? top: 10px !important left 10px !important 不是 CSS 规则,您应该添加类名。此外,您应该添加有关您使用的 jqGrid 和 fork 版本的信息(free jqGridGuriddo jqGrid JS 或版本 其他一些 CSS。我想问题的根源你应该提到 which CSS* set top 你需要用 !important 覆盖它。
    • 如果您更改答案的文本,请写简短的评论。您现在写道,应该从.ui-dialog{ top: 10px !important; left 10px !important; } 中删除!important;,但我不知道no jqGrid CSS 中的设置,既不是来自免费的jqGrid,也不是来自Guriddo jqGrud JS CSS。即使是旧的 jqGrid 版本也没有该设置。您能否告知其他读者哪些 CSS 设置错误,这是您问题的根源?是某个 jqGrid 版本/fork 的错误还是您的自定义 CSS 设置的错误?
    猜你喜欢
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多