社区项目发现的问题五 html的事件传参带对象

1、应用场景

这种 html事件传参带对象 ,一般都是请求后台数据的时候,需要在页面中添加 重复元素,并为每一个绑定一个事件,每一个事件又需要用到返回的 JSON值 作为参数。

这是菜鸟在这次的项目中遇到的情况:
在这里插入图片描述
菜鸟解决是解决了,而且处理得比较好,但是就是感觉想知道如何 html事件传参带对象 ,菜鸟解决的方式就是只传一个 数字 参数imei( 因为不管传对象或者是字符串,html都无法直接解析,即使使用了模板字符串 ` ),而且菜鸟接下来请求后台,也只和这个数字有关。代码如下:

{
	"data": "sos_flag",
	"sClass": "text-c",
	"render": function (data, type, row) {  //对数据进行处理,并返回(type\row都可以打印看看)
		return data == 0 ? `<td class="td - status"><span class="label radius">暂无紧急情况</span><br/><span class="b2" οnclick="cancel3(event,${row.imei})">SOS历史记录</span></td>` : `<td class="td - status"><span class="label label - success radius b1" οnclick="cancel2(event,${row.imei},this)">SOS</span><br/><span class="b2" οnclick="cancel3(event,${row.imei})">SOS历史记录</span></td>`;
	},
},

2、错误解决办法

菜鸟的想法是,居然参数不能传进去,那么我就先用缓存保存起来,直接当成值在 cancel3函数 里面用不就行了?

但是事情并没有想象中简单,因为这个是 重复添加元素 ,那么每一次添加缓存都会被覆盖,所以最后缓存的就是最后一次添加的数据的缓存。代码如下:

{
	"data": "sos_flag",
	"sClass": "text-c",
	"render": function (data, type, row) {  //对数据进行处理,并返回(type\row都可以打印看看)
		localStorage.setItem("row", row);
		return data == 0 ? `<td class="td - status"><span class="label radius">暂无紧急情况</span><br/><span class="b2" οnclick="cancel3(event)">SOS历史记录</span></td>` : `<td class="td - status"><span class="label label - success radius b1" οnclick="cancel2(event,${row.imei},this)">SOS</span><br/><span class="b2" οnclick="cancel3(event)">SOS历史记录</span></td>`;)
	},
},

或者使用多个缓存去把每一次的都保存起来,但是那样又要判断你点击的是哪一个,不得不说就把一个问题搞得非常的复杂了。

3.1、模板字符串 传递 复杂对象

接下来就看看,如果直接使用 模板字符串 传递的到底是个什么东西?

{
	"data": "sos_flag",
	"sClass": "text-c",
	"render": function (data, type, row) {  //对数据进行处理,并返回(type\row都可以打印看看)
		console.log(row);
		console.log(`fafjalfjkljafl${row}daffafaf`);
		return data == 0 ? `<td class="td - status"><span class="label radius">暂无紧急情况</span><br/><span class="b2" οnclick="cancel3(event,${row})">SOS历史记录</span></td>` : `<td class="td - status"><span class="label label - success radius b1" οnclick="cancel2(event,${row.imei},this)">SOS</span><br/><span class="b2" οnclick="cancel3(event,${row})">SOS历史记录</span></td>`;
	},
},

运行结果:
html:
在这里插入图片描述
控制台:
在这里插入图片描述
由此可以发现 模板字符串 面对多个键值对的对象是不管用的,会返回一个莫名其妙的 [Object Object]。

补充知识点:

在这里插入图片描述
注意:

这里可以看出不能在 3.4 中使用 tostring,而是使用 JSON.stringify

3.2 模板字符串 传递 简单对象

那么试试简单一点的对象呢 ( 只有一个键值对 ) ?

{
	"data": "sos_flag",
	"sClass": "text-c",
	"render": function (data, type, row) {  //对数据进行处理,并返回(type\row都可以打印看看)
		console.log(row.name);
		console.log(`fafjalfjkljafl${row.name}daffafaf`);
		return data == 0 ? `<td class="td - status"><span class="label radius">暂无紧急情况</span><br/><span class="b2" οnclick="cancel3(event,${row.name})">SOS历史记录</span></td>` : `<td class="td - status"><span class="label label - success radius b1" οnclick="cancel2(event,${row.imei},this)">SOS</span><br/><span class="b2" οnclick="cancel3(event,${row.name})">SOS历史记录</span></td>`;
	},
},

运行结果:
html:
在这里插入图片描述
控制台:
在这里插入图片描述
发现虽然可以解析,但是运行,就会发现报错:
在这里插入图片描述

3.3 解决传递简单对象

上面说明,你虽然知道传进的是字符串作为参数,但是浏览器不知道,所以就把这个当成变量了,解决办法如下(就是在字符串外面加上一个单引号 --> 这个取决于你的 onclick 用的什么引号):

{
	"data": "sos_flag",
	"sClass": "text-c",
	"render": function (data, type, row) {  //对数据进行处理,并返回(type\row都可以打印看看)
		console.log(row.name);
		console.log(`fafjalfjkljafl${row.name}daffafaf`);
		return data == 0 ? `<td class="td - status"><span class="label radius">暂无紧急情况</span><br/><span class="b2" οnclick="cancel3(event,'${row.name}')">SOS历史记录</span></td>` : `<td class="td - status"><span class="label label - success radius b1" οnclick="cancel2(event,${row.imei},this)">SOS</span><br/><span class="b2" οnclick="cancel3(event,'${row.name}')">SOS历史记录</span></td>`;
	},
},

3.4 解决传递复杂对象

那么回归最难的,复杂的对象怎么传值呢?

有了解决传递简单的字符串的提醒,我们可以尝试这种方式,先把对象转换成字符串,然后由3.1的补充知识可知,不能使用tostring,那就只能使用JSON.stringify,所以代码可以变成:

{
	"data": "sos_flag",
	"sClass": "text-c",
	"render": function (data, type, row) {  //对数据进行处理,并返回(type\row都可以打印看看)
		console.log(row);
		console.log(`fafjalfjkljafl${JSON.stringify(row)}daffafaf`);
		return data == 0 ? `<td class="td - status"><span class="label radius">暂无紧急情况</span><br/><span class="b2" οnclick="cancel3(event,'${JSON.stringify(row)}')">SOS历史记录</span></td>` : `<td class="td - status"><span class="label label - success radius b1" οnclick="cancel2(event,${row.imei},this)">SOS</span><br/><span class="b2" οnclick="cancel3(event,'${JSON.stringify(row)}')">SOS历史记录</span></td>`;
	},
},

运行结果:
html:
在这里插入图片描述
控制台:
在这里插入图片描述
但是这样依旧不行,因为html中的onclick的引号是双引号,和json冲突了,所以会报错一个莫名其妙的错误:
在这里插入图片描述
大致就是少了符号,一般是逗号、引号

那么就试试把onclick的引号换成单引号,试试:

{
	"data": "sos_flag",
	"sClass": "text-c",
	"render": function (data, type, row) {  //对数据进行处理,并返回(type\row都可以打印看看)
		console.log(row);
		console.log(`fafjalfjkljafl${JSON.stringify(row)}daffafaf`);
		return data == 0 ? `<td class="td - status"><span class="label radius">暂无紧急情况</span><br/><span class="b2" οnclick='cancel3(event,${JSON.stringify(row)})'>SOS历史记录</span></td>` : `<td class="td - status"><span class="label label - success radius b1" οnclick="cancel2(event,${row.imei},this)">SOS</span><br/><span class="b2" οnclick='cancel3(event,${JSON.stringify(row)})'>SOS历史记录</span></td>`;
	},
},

然后直接成功!

注意:

这里onclick什么引号主要看你的json是什么引号;后面的对象可以不需要用引号括起来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PBitW

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值