最近在做项目时,遇到了在js中拼接html代码,并且传递对象,挣扎了很久,记录我的爬坑之旅。
框架:ko(knockout.js)
背景:我要在外列表的行数据上添加一个下拉事件,效果如图(点击标题弹出一个下拉框:dropdown)
由于用到的是ko框架,在pageGrid上实现这个效果有点棘手,在尝试过多种方案后,最后采用的是在js中拼接html代码来实现。代码实现如下:
{
headerText: "标题",
rowText: function (item) {
var html = [];
html.push("<li class='dropdown '> <a href='#' data-toggle='dropdown'>");
if (item.jjcdmc == '特急') {
html.push("<span class='tjicon'></span> <span style='font-size: 16px;'>" + item.rwmc + "</span>");
} else if (item.jjcdmc == '加急') {
html.push("<span class='jjicon'></span> <span style='font-size: 16px;'>" + item.rwmc + "</span>");
} else {
html.push("<span class='ybicon'></span> <span style='font-size: 16px;'>" + item.rwmc + "</span>");
}
if (item.rwzqList.length >= 1) {
var keys = {};
keys["rwbh"] = item.rwbh;
keys["ztdm"] = item.rwztdm;
for (var key in item.rwzqList) {
keys["rwzqbh"] = item.rwzqList[key].rwzqbh;
html.push("</a><div class='dropdown-menu dropdown-alerts userinfo-list' style='width: auto;'>");
html.push("<div class='tr'><a class='a' style='font-size: 16px;' href='javascript:void(0);' οnclick='new (require(\"taskSupervise/taskPublish/publish\"))().show(" + JSON.stringify(keys).replace(/\'/g, '"') + ")'><span>" + item.rwzqList[key].rwzqmc + "</span></a></div>"); //传递json对象
//html.push('<div class="tr"><a class="a" style="font-size: 16px;" href="javascript:void(0);" οnclick="new (require(\'taskSupervise/taskPublish/publish\'))().show(' + JSON.stringify(keys).replace(/\"/g, "'") + ')"><span>' + item.rwzqList[key].rwzqmc + '</span></a></div>');//传递json对象
// html.push('<div class="tr"><a class="a" style="font-size: 16px;" href="javascript:void(0);" οnclick="new (require(\'taskSupervise/taskPublish/publish\'))().show(\' ' + keys.rwbh + '\')"><span>' + item.rwzqList[key].rwzqmc + '</span></a></div>');
html.push("</div>");
html.push("</li>");
}
}
return html.join("");
},
isOperate: true,
key: "rwbh,rwztdm,rwzqbh",
callback: function (key, lzRow) {
var keys = key.split(',');
if (lzRow.Value().rwzqList.length < 1) {
key = {
rwbh: keys[0],
ztdm: keys[1],
rwzqbh: lzRow.Value().rwzqList.length == 0 ? "" : lzRow.Value().rwzqList[0].rwzqbh,
}
new Publish().show(key).then(function (p) {
if (p) {
that.search();
}
});
} else {
return;
}
},
width: '100px',
place: 'left',
isHide: true,
hidCount: 15,
},
标题这一列的代码块,在rowText中对其进行拼接,整体是个li
标签,写法就和html没区别,需要注意的是在拼接完成返回时要加上 html.join("");
否则会出现莫名的","
拼接完成后,在传参这块就遇到坑点了,寻常的data-bind
绑定显然是不生效的,遂我就使用了onclick
事件,在请求方法的时候是获取不到的,需要使用require导入依赖包。举个例子:require(\'taskSupervise/taskPublish/publish\')
使用转义符号来转义引号
对于参数传递也是如此,遇到的坑点大多都是格式要求不对引起的:
1.参数是int类型的可以直接传;
2.参数是字符串类型的,需要使用转义符号“\”
转义:\' ' + keys.rwbh + '\'
3.参数是对象类型的不能直接传递,需要转换成字符串形式进行传递:
步骤:
- 现将对象序列化成字符串:
JSON.stringify(json)
- 将双引号转义成单引号:
replace(/"/g,"'")
- 将括号中的单引号除掉
- 方法中获到的就是json对象
控制台打印结果展示