使用GET从jqGrid中的列值链接到新页面
我创build了一个包含一些字段的jqGrid,比如:
job_id,名字等
我想要做的是,当点击job_id列中的值时,它会将它们redirect到:
job.php?job_id =(他们点击的值)
我开始尝试使用以下作为我的colModel:
{ name:'job_id', index:'job_id', edittype:'select', formatter:'showlink', formatoptions:{baseLinkUrl:'job.php'}, width:50, align:'center' }
但是,结果是redirect到:
job.php?JOB_ID =(ROW_ID)
我做了一些search,并find了这个软件的开源版本的开发人员谁build议使用以下colModel和额外的JS:
{ name:'job_id', index:'job_id', edittype:'select', formatter:'showlink', formatoptions:{baseLinkUrl:'#'}, width:50, align:'center' } loadComplete: function() { var myGrid = $("#home_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; location.href="job.php?id="+text; } e.preventDefault(); }); } }
但是这与IE不兼容。 除此之外,当在jqGrid中显示大量的行时,加载需要很长的时间,比如5秒+ 500行。
我将继续努力,但这是别人做的事吗?
你用我的旧回答代码示例,所以我决定我应该回答你的问题。
我同意评论loadComplete
的代码的性能。 所以,对我的问题+1。 长循环内的构造$("#"+ids[i]+" a", myGrid[0])
可以工作得很慢。 如果用户使用以下内容,可以很容易地解决这个问题
var getColumnIndexByName = function (columnName) { var cm = $(this).jqGrid("getGridParam", "colModel"), l = cm.length, i; for (i = 0; i < l; i++) { if (cm[i].name === columnName) { return i; // return the index } } return -1; }; var myGrid = $("#list"); myGrid.jqGrid({ ... loadComplete: function () { var i = getColumnIndexByName.call(this, 'Subcategory'); // nth-child need 1-based index so we use (i+1) below $("tbody>tr.jqgrow>td:nth-child(" + (i+1) + ")>a", this).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(); }); } });
您可以看到演示的改进版本与原始演示完全一样。 为了显示1000行上的方法的性能,我创build了一个演示 。 我们可以看到这个新方法很快就可以工作。
现在回到你的主要问题。 如果您编写自定义的格式化程序和非格式化 程序 ,而不是使用预定义的格式化程序showlink,则会获得最佳性能。 代码可以是关于如下:
formatter: function (cellvalue, options, rowObject) { return "<a href=\"job.php?job_id=" + rowObject.job_id + "\">" + cellvalue + "</a>"; }, unformat: function (cellvalue, options, cellobject) { return cellobject.job_id; }
确切的代码取决于你使用的datatype
,不pipe你是否使用loadonce:true
或者不是你使用的jsonReader
。 它可以是,例如,你的情况rowObject
是数组,你必须使用相应的数据字段(如rowObject[4]
)的数组索引,而不是rowObject.job_id
。
更新 :我认为最好的实现方式将是onCellSelect或beforeSelectRow的使用,而不是绑定点击事件的列中的每个元素。 我build议阅读以下答案的细节: 这一个 , 另一个和更多的旧答案 。