我正在使用showlink格式化程序将列作为链接​​。当我单击它时,有没有一种方法可以调用javascript函数。

现在这是我的代码

$("#list").jqGrid(

{
     url: '..',
    datatype: 'json', //We specify that the datatype we will be using will be JSON
    colNames:['ID', 'User Name'],
                colModel :[
     {name:'id',index:'id', width:110, sorttype:"string", formatter: 'showlink', formatoptions:{baseLinkUrl:'index.cfm'}},

...

我不想使用baselinkUrl。相反,我可以在单击URL时调用Javascript函数吗?另外,当我使用“showlink”格式化程序时,我的表单数据似乎没有发布到下一个屏幕。

最佳答案

您可以通过不同的方式来执行此操作。第一个是使用如下形式的formatter:'showlink':

formatoptions: {
    baseLinkUrl: 'javascript:',
    showAction: "MyBase.GetAndShowUserData(jQuery('#list'),'",
    addParam: "');"
}

(有关详细信息,请参见我的old answer)。它将产生<a>链接,其中包含
href="javascript:MyBase.GetAndShowUserData(jQuery('#userlist'),'?id=rowId');"

其中rowId将是相应网格行的ID。在自定义全局函数MyBase.GetAndShowUserData中,您应该从第二个参数中删除"?id="前缀。这样您就可以访问网格,并且知道所选的ID。

另一种方法是编写自己的custom formatter而不是formatter:'showlink'的用法。

我认为这两种方法的主要缺点是使用了全局函数。此外,我更喜欢遵循unobtrusive JavaScript的概念。因此,我可以在trirand论坛上从my answer建议您其他方式。这个想法是使用预定义的格式化程序showlink和'#'作为href属性的值,并使用绑定(bind)到click函数内部链接的loadComplete事件:
colModel: [
    { name: 'Subcategory', formatter:'showlink',formatoptions:{baseLinkUrl:'#'}
...
loadComplete: function() {
    var myGrid = $("#list");
    var ids = myGrid.getDataIDs();
    for (var i = 0, idCount = ids.length; i < idCount; i++) {
        $("#"+ids[i]+" a",myGrid[0]).click(function(e) {
            var hash=e.currentTarget.hash;// string like "#?id=0"
            if (hash.substring(0,5) === '#?id=') {
                var id = hash.substring(5,hash.length);
                var text = this.textContent || this.innerText;
                alert("clicked the row with id='"+id+"'. Link contain '"+text+"'");
                location.href="http://en.wikipedia.org/wiki/"+text;
            }
            e.preventDefault();
        });
    }
}

观看现场演示here。在演示中,如果您单击表中的“Physics”之类的文本,则会打开URL http://en.wikipedia.org/wiki/Physics,它将动态生成。我包括了一个额外的警报,以显示如何另外解码有关行ID的信息。

更新:another answer中查看loadComplete的改进代码(从性能方面)。

10-07 21:41