在 jqGrid 中使用带有自定义格式化程序和 cellEdit 的图像会导致 JavaScript 错误 - 解决方案

发布于 2024-11-11 16:52:46 字数 867 浏览 3 评论 0原文

当我将 jqGrid 与可编辑单元格(选项中的 cellEdit: true )和基于单元格值返回图像的自定义格式化程序一起使用时,我的 Web 应用程序遇到了问题。

当单击单元格时,该单元格不在图像本身上,单元格编辑就像一个魅力。但是,当单击图像本身时,您会遇到 JavaScript 错误,声称无法找到parentNode。

我没有深入研究这个问题,但我想这与 jqGrid 如何使用自定义格式化程序应用图像,或者它如何尝试获取父节点有关。

无论如何,通过在图像本身上指定一个 onclick 事件来调用其父节点并单击它,可以避免错误。

例如,可以避免此错误的简单自定义格式化程序是:

function booleanFormatter(cellvalue, options, rowObject){
    if (cellvalue == true){
        return '<img src="checked.png" onclick="this.parentNode.click();"/>';
    }
    else if (cellvalue == false){
        return '<img src="notchecked.png" onclick="this.parentNode.click();"/>';
    }
    else {
        return '';
    }
}

使用格式化程序的 colmodel 的摘录可以是:

colmodel: [ { name: 'CheckableCell', index: 'CheckableCell', editable: true, formatter: booleanFormatter}]

I had a problem in my web application when using jqGrid with editable cells (cellEdit: true in options) and a custom formatter that returned an image based on the cell's value.

When clicking in a cell, that is not on the image itself, cell editing works like a charm. However, when clicking on the image itself you encounter a JavaScript-error claiming that parentNode could not be found.

I have not delved far into the problem, but I guess it has something to do with how jqGrid applies the image using the custom formatter, or how it tries to get the parentNode.

Anyway, by specifying an onclick-event on the image itself that calls its parentNode and clicks it the error is avoided.

For example, an easy custom formatter that circumvents this error is:

function booleanFormatter(cellvalue, options, rowObject){
    if (cellvalue == true){
        return '<img src="checked.png" onclick="this.parentNode.click();"/>';
    }
    else if (cellvalue == false){
        return '<img src="notchecked.png" onclick="this.parentNode.click();"/>';
    }
    else {
        return '';
    }
}

An excerpt of a colmodel that utilizes the formatter could be:

colmodel: [ { name: 'CheckableCell', index: 'CheckableCell', editable: true, formatter: booleanFormatter}]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

枯叶蝶 2024-11-18 16:52:46

是的,或者您可以通过更不显眼的、类似 jQuery 的方式实现相同的结果。首先,按如下方式更改格式化程序函数:

function booleanFormatter(cellvalue, options, rowObject){
    if (cellvalue == true){
        return '<img src="checked.png" class="imgclickable"/>';
    }
    else if (cellvalue == false){
        return '<img src="notchecked.png" class="imgclickable"/>';
    }
    else {
        return '';
    }
}

接下来,将其添加到网格本身的属性列表中(将函数附加到网格的 gridComplete 事件):

gridComplete: function() {
    jQuery('.imgclickable').click(function() {
        this.parentNode.click();
    });
}

Yes, or you could accomplish the same result in a more unobtrusive, jQuery-like way. First, change the formatter function as follows:

function booleanFormatter(cellvalue, options, rowObject){
    if (cellvalue == true){
        return '<img src="checked.png" class="imgclickable"/>';
    }
    else if (cellvalue == false){
        return '<img src="notchecked.png" class="imgclickable"/>';
    }
    else {
        return '';
    }
}

Next, add this to the properties list of the grid itself (attaches a function to the gridComplete event of the grid):

gridComplete: function() {
    jQuery('.imgclickable').click(function() {
        this.parentNode.click();
    });
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文