在JQGrid表中,其中一个单元格中有一个链接,单击时,它应该执行一个javascript。
{name : 'localAccountNo' , jsonmap : 'localAccountNo', label : 'Customer <br>Number', width:50, frozen:true, formatter : localAccountNumberCellFormatter}
JQGrid localAccountNumber单元格格式代码
function localAccountNumberCellFormatter(cellvalue, options, rowObject)
{
return '<a onclick="selectCustomer('+ rowObject +')">'+ cellvalue +'</a>';
}
选择客户javascript代码
function selectCustomer(rowOfCustomer) {
console.log(rowOfCustomer);
}
单击JQGrid单元格中的链接失败,并出现语法错误。
未捕获的SyntaxError:意外的标识符
但是,当您通过转义对象时将rowObject传递给selectCustomer方法作为字符串,如下面的代码所示,它可以工作。但它只传递对象的字符串表示,而不是实际的对象。
function localAccountNumberCellFormatter(cellvalue, options, rowObject)
{
return '<a onclick="selectCustomer(\''+ rowObject +'\')">'+ cellvalue +'</a>';
}
rowObject传递给selectCustomer方法
答案 0 :(得分:1)
自定义格式化程序应该是正确的HTML片段。因此,您必须将rowObject
编码为字符串(例如,使用JSON.stringify
)并转义自定义格式化程序内部字符串的引号。方法selectCustomer
必须先将字符串参数转换回对象(使用JSON.parse
)才能使用rowObject
。
有更好的替代方法,您可以在大多数情况下使用它们。 onclick
句柄将以<a>
的DOM开头,this
和event
初始化为Click事件的Event对象。因此,您可以使用
function localAccountNumberCellFormatter(cellvalue, options, rowObject) {
return '<a onclick="selectCustomer.call(this)">'+ cellvalue +'</a>';
}
从父行获取rowid
并使用rowid调用getRowData
以从其他列获取数据。你将得到完全相同的rowObject
,但在大多数情况下几乎相同:
function selectCustomer (event) {
var $tr = $(this).closest(".jqgrow"), rowid = $tr.attr("id"),
$grid = $tr.closest(".ui-jqgrid-btable"),
item = $grid.jqGrid("getRowData", rowid);
alert("item.lastName=" + item.lastName);
}
您可以使用
return '<a onclick="return selectCustomer.call(this, event);">'+ cellvalue +'</a>';
并从false
返回selectCustomer
以防止事件冒泡。转发event
对象后,您可以使用event.target
内的selectCustomer
代替this
。
顺便说一句,如果您确实需要使用与该行关联的rowObject
,那么最好将其保存为行(data-somevalue
)元素的<tr>
属性。请参阅the old answer,其中显示了如何使用rowattr
执行此操作。您可以在$tr.data
的上述代码中使用selectCustomer
来访问该对象。
如果您提醒事件冒泡,那么很明显,不需要在列中的每个onclick
元素上设置<a>
属性。除此之外,您可以将<span>
放在CSS类中,这使得文本看起来像链接,因此用户可以理解可以单击文本。可以在click
元素上注册仅一个 <table>
处理程序,由于事件冒泡而将调用该处理程序。顺便说一句,jqGrid已经有click
个处理程序。您可以使用beforeSelectRow
或onCellSelect
,这将在click
处理程序内部调用。回调的第二个参数(e
)是事件,您可以使用e.target
来访问点击的<span>
。您可以在the answer,this one或其他一些内容中找到有关该方法的更多详细信息。
答案 1 :(得分:0)
您可以使用JSON.stringify
传递对象
return '<a onclick="selectCustomer('+ JSON.stringify(rowObject) +')">'+ cellvalue +'</a>';
答案 2 :(得分:0)
如果您不必支持IE,则可以使用模板字符串:
function localAccountNumberCellFormatter(cellvalue, options, rowObject) {
return `<a onclick="selectCustomer(${rowObject})">${cellvalue}</a>`;
}