将存储在XML中的数据传递给onCellSelect

时间:2014-09-19 16:33:26

标签: javascript jquery xml jqgrid

我正在尝试将存储在XML文件中的数据(URL)传递给onCellSelect,以便我可以用它打开一个新页面。该网站可在www.bcgsc.ca/downloads/bdavis/tempsite3 /.

上查看。

由于我无法找到直接传输此数据的方法(即我无法像使用cellattr函数那样访问rawObject,是吗?),我的方法是在我的数据中提取这些数据cellattr函数并使用它来定义data- *属性(特别是data-rowSpecificURL,fwiw),然后在cellSelect中提取它,但是当我尝试使用getRowData或getLocalRow或getCell提取数据时,它会向我显示属性其中包含的内容正好位于标签下方。

有没有人有任何建议?如果我知道怎么做,我可以在div标签而不是td标签中设置data- *属性,但我不知道该怎么做。或者,如果有人对如何从td标记中提取此属性有任何建议。或者如何直接访问rawObject。

谢谢, 布拉德

1 个答案:

答案 0 :(得分:1)

在单元格或行上使用data_*属性是保存特定于单元格或特定于行的信息的一种方法。有关相应的代码示例,请参阅the answer

在我看来,另一种方式更适合您:使用beforeProcessing来解析原始服务器响应。在beforeProcessing内,您可以完全访问从服务器返回的所有数据。可以通过rowid将具有附加信息的对象准备为地图。因此,稍后可以通过rowid轻松获取特定于行的信息。具有附加信息的对象可以保存以新的方式扩展标准jqGrid参数列表。

例如,让我们将有关该行的输入信息数据扩展为以下

<row id='123'>
    <onHoverText>this is my foo</onHoverText>
    <rowSpecificURL>http://www.google.com</rowSpecificURL>
    <cell><![CDATA[Blood]]></cell>
    <cell class="has_data in_progress"></cell>
    ...
</row>

如果<onHoverText><rowSpecificURL>元素包含自定义行特定信息。我建议像

一样构建对象(地图)
{
    123: {tooltip: "this is my foo", url: "http://www.google.com" }
}

通过rowid保存自定义信息。可以使用

将此类地图myData保存为自定义jqGrid参数myParam
$(this).jqGrid("setGridParam", { myParam: myData });

稍后您可以通过

myParam参数获取信息
var rowSpecificInformation = $(this).jqGrid("getGridParam", "myParam")[rowid];
// rowSpecificInformation.tooltip and rowSpecificInformation.url

例如,您之前提问的演示中的代码可以重写为

$("#list").jqGrid({
    url: "BradDavis2.xml",
    colModel: [
        { name: "c1", width: 360, classes: 'ui-state-default',
            cellattr: function (rowId, val, rawObject, cm, rdata) {
                // get custom row information from custom parameter
                var p = $(this).jqGrid("getGridParam", "myParam"); // this.p.myParam
                // get object with additional row specific information from p[rowId] 
                return p != null && p[rowId] != null && p[rowId].tooltip != null ?
                    ' title="' + p[rowId].tooltip + '"' : '';
        }},
        ...
    ],
    ...
    beforeProcessing: function (data) {
        var rows = $(">rows>row", data), l = rows.length, i, item, myData = {}, $p, id, myInfo;
        for (i = 0; i < l; i++) {
            item = rows[i];
            id = $(item).attr("id"); // get rowid

            // fill custom information from every row to object
            myInfo = {};
            $p = $("onHoverText", item);
            if ($p.length > 0) {
                myInfo.tooltip = $p.text();
            }
            $p = $("rowSpecificURL", item);
            if ($p.length > 0) {
                myInfo.url = $p.text();
            }

            // save the object with custom information in a map by id
            myData[id] = myInfo;
        }
        // save custom information in custom jqGrid parameter
        $(this).jqGrid("setGridParam", { myParam: myData });
    },
    onCellSelect: function(rowid, iCol, cellcontent, e, rawObject) {
        var $self = $(this),
            colModel = $self.jqGrid("getGridParam", "colModel"),
            myData = $self.jqGrid("getGridParam", "myParam"); // this.p.myParam

        if (colModel[iCol].name === "c1" && myData != null && myData[rowid] != null && myData[rowid].url != null) {
            window.open(myData[rowid].url, "_blank");
        }
    }

您将找到相应的演示here。如果单击第一列中的单元格,则将打开包含www.google.com的新浏览器窗口。