【问题标题】:jqGrid - Insert custom HTML into celljqGrid - 将自定义 HTML 插入单元格
【发布时间】:2013-09-14 20:30:36
【问题描述】:

我正在尝试将普通的旧 html 表转换为 jqGrid。旧表有一列包含使用无序列表和列表项构造的标签。

Here is an example (jsfiddle) 之前的表和之后的 jqGrid。

在本例中,我使用custom formatter,它使用jQuery Templates 构造DOM 元素,然后格式化程序从生成的DOM 元素中返回$.html()。

function getTagCellContents(cellvalue) {
    var domitems=$("#jqgrid-tag-list-item").tmpl({tags: callvalue});
    return domitems.html();
}

我遇到的问题是生成的 html 中包含的空格会导致行太高。这也会导致单元格上出现尴尬的“标题”属性。

jqGrid 是否提供 API 用于将 DOM 对象直接插入到单元格中,而不是通过从自定义格式化程序返回文本?将自定义 html 放入 jqGrid 单元格的最佳做法是什么?

【问题讨论】:

    标签: jquery jqgrid cell jquery-templates


    【解决方案1】:

    我觉得你的问题很有趣,所以我为这个问题 +1。

    使用自定义格式化程序的主要理解问题是:它要求您的回调函数返回HTML 片段作为字符串。它的好处是性能好,在大型网格上可以看到大部分。如果您使用 DOM 元素并使用 domitems.html() 之类的构造,则性能不会那么好。

    所以首先我建议你使用 jQuery 模板的$.template 函数。它允许您在不使用 DOM 的情况下使用字符串。 The answer 例如描述了修改代码的主要思想。

    为了解决您的主要问题,我建议从字符串中删除\n 和withespaces。我不是 RegEx 专业人士,所以我建议以下快速而肮脏的解决方案:

    // Create and cache a named template function
    $("#jqgrid-tag-list-item").template("cellContents");
    var tmpl = $.template("cellContents"); // template function
    
    function getTagCellContents(a) {
        var strings = tmpl($, {data: {tags: a}}); // array of strings
        return strings.join('')
                   .replace(/\n+/g,'')
                   .replace(/\s+/g,' ')
                   .replace(/> </g,'><');
    }
    

    修改后你的 jsfiddle 演示为the following

    【讨论】:

    • Oleg,是否可以向 jqGrid API 添加一个新方法,该方法实际上将 DOM 或 jQuery 对象附加到单元格?我知道使用 HTML 更快,但有时 DOM 没有等效的 HTML。例如,我想插入一个带有自定义 eventListener 的按钮。我做不到&lt;button onclick='doSomething()'&gt;Click Me&lt;/button&gt;,因为我的doSomething() 是一个私有函数,HTML 无法访问。谢谢!
    • @LeiZhao: 每设置一个separate onclick 事件句柄,浏览器使用的内存都会增加。 click 支持事件冒泡:如果&lt;button&gt; 上不存在事件句柄,则click 可以由&lt;button&gt; 的父级和父级的父级处理,依此类推。查看the answerthis onethis one,它提供了beforeSelectRowonCellSelect 的用法示例。如果您仍有未解决的问题,您可以提出新问题。
    • 奥列格,感谢您的建议。但是,在许多情况下,我仍然需要实际插入/访问/操作 DOM。点击事件只是一个例子。有时它不止于此。例如,当用户单击 jqGrid 外部的按钮、附加自定义工具提示小部件、播放 jQuery UI 效果等时,我需要插入原生 &lt;select&gt; 标记并使用 selectmenu() 将其替换为 jQuery UI 小部件像那样。现在我设法通过父tridtd的位置(类似于grid.find("tr#rowId td:nth-of-type(3)"))选择td,但是
    • 但它的可读性不是很好,如果列的顺序发生变化,我需要查找并更新所有这些数字。
    • @LeiZhao:你可以在loadComplete里面操作DOM,但是你应该明白,如果你改变页面上的one元素,页面上的所有 元素可能需要重新计算。它被命名为reflow。因此,如果您在包含 y 元素的页面上修改 x 元素,则操作的复杂性是 xy* 而不仅仅是 x 。您可以在详细描述问题的地方提出新问题,我可以尝试帮助您。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多