javascript - 每列都有一个信息面板的 jqgrid 使网格显示滚动

标签 javascript jquery html css jqgrid

我们正在使用 jquery 网格,网格的最后一列应该有链接。单击链接会出现一个新面板,其中提供更多信息。

所以我们使用了一个格式化程序,它生成了一个hidden divlink。问题是对于最后一行,信息面板使网格具有滚动条。

正确 enter image description here

不正确 enter image description here

我在 http://jsfiddle.net/9a3uaL5h/ 做了一个非常简单的测试.如您所见,单击 click me 将使网格滚动。

格式化程序如下:

function panelFormatter(cellvalue, options, rowObject) {
  return '<div id="sample" style="zindex:1000; height: 200px; display:none;position:absolute; 
          background-color:red" > More Info </div>
          <a onclick=$("#sample").show()>click me</a> ';
}

如何解决面板显示在没有滚动条的网格上?

最佳答案

我不确定您的真实代码看起来如何,但 jsfiddle 演示并不好。无论如何你的主要问题:<div>你用来显示附加信息的有 <td>元素作为父元素。这是你的问题的主要原因。您应该在显示之前将 div 附加到主体,以防止在网格上剪裁。

另外我会推荐你​​

  • 使用free jqGrid 4.13.4 而不是旧的 jqGrid 4.6
  • 不要修复id="sample"在 div 中防止 id 重复错误
  • 使用beforeSelectRow回调而不是 onclick属性。 beforeSelectRow回调将在 click 内部调用处理程序绑定(bind)到 grid ( <table> )。它会因为 event bubbling 而被调用. tagret事件对象的属性为我们提供了关于被点击元素的完整信息。

修改后的demo大概是下面的内容

function panelFormatter(cellvalue, options, rowObject) {
    return '<div name="sample" style="z-index:2000; height: 200px; display:none;position:absolute; background-color:red"> More Info </div> <a>click me</a>';
}

...
$("#grid").jqGrid({
    ...
    beforeSelectRow: function (rowid, e) {
        var $td = $(e.target).closest("tr.jqgrow>td"),
            colName = $td.length < 0 ?
                null :
                $(this).jqGrid("getGridParam").colModel[$td[0].cellIndex].name;
        if (colName === "status" && e.target.tagName.toLowerCase() === "a") {
            // <a> in the "status" column is clicked
            $td.find("div[name=sample]")
                .appendTo("body")
                .position({
                    of: $td,
                    at: "left bottom",
                    my: "left bottom+" + $td.height()
                })
                .show();
        }
    }
});

参见 http://jsfiddle.net/OlegKi/9a3uaL5h/1/

更新:可以像回调一样使用 jQuery 事件。例如,可以使用事件 jqGridBeforeSelectRow而不是 beforeSelectRow打回来。代码将是

$("#grid").bind("jqGridBeforeSelectRow", function (event, rowid, e) {
    var $td = $(e.target).closest("tr.jqgrow>td"),
        colName = $td.length < 0 ?
        null :
    $(this).jqGrid("getGridParam").colModel[$td[0].cellIndex].name;
    if (colName === "status" && e.target.tagName.toLowerCase() === "a") {
        // <a> in the "status" column is clicked
        $td.find("div[name=sample]")
            .appendTo("body")
            .position({
            of: $td,
            at: "left bottom",
            my: "left bottom+" + $td.height()
        })
            .show();
    }
});

参见 http://jsfiddle.net/9a3uaL5h/2/ .顺便说一下,可以使用 jQuery.bind (或更好的 jQuery.on ) 之前 从空 <table id="grid"></table> 创建网格.参见 http://jsfiddle.net/9a3uaL5h/3/

关于javascript - 每列都有一个信息面板的 jqgrid 使网格显示滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40191854/

相关文章:

javascript - Localstorage 作为 Javascript 函数属性值

jquery - 防止 onClick 事件多次发生 (jQuery)

jquery - 检查元素或html标签是否存在

javascript - 在 Firefox 中输入选择焦点的外观

html - 如何减小Ionic2中文本输入的大小并在右侧对齐标签

javascript - jQuery slider 无法正常工作

javascript - 将 2 个 javascript 对象连接在一起的正确方法是什么?

javascript - 如何获取动态生成的复选框值

javascript - Bootstrap 切换 V 形

javascript - 访问过的链接在 IE11 中没有改变颜色