一、问题和原因
我们在做前后端数据交互时,往往需要在前端js写入动态的dom对象,例如下面代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="../../../scripts/common/jquery-1.8.2.min.js" type="text/javascript"></script>
</head>
<body>
<div id="main_dom"></div>
</body>
<script>
$(function(){
var testNum = "javascript";
var html = '<a οnclick="Test(' + testNum +')">'
+ '测试传参</a>';
$('#main_dom').append(html);
})
function Test(num){
console.log(num)
}
</script>
</html>
这里我们可以发现其中dom对象带有一个点击事件并传递了一个叫"javascript"的参数,此时我们触发点击事件打印一下这个参数会发现:
这是因为浏览器将"javascript"这个参数解析成了一个变量,而不是直接传递这个字符串,所以报错未定义。
二、解决方法
方法一:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="../../../scripts/common/jquery-1.8.2.min.js" type="text/javascript"></script>
</head>
<body>
<div id="main_dom"></div>
</body>
<script>
$(function(){
var testNum = "javascript";
var html = '<a οnclick="Test(\'' + testNum +'\')">'
+ '测试传参</a>';
$('#main_dom').append(html);
})
function Test(num){
console.log(num)
}
</script>
</html>
使用转义符 \ ,给变量添加引号,将变量转化为字符串。
方法二:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="../../../scripts/common/jquery-1.8.2.min.js" type="text/javascript"></script>
</head>
<body>
<div id="main_dom"></div>
</body>
<script>
$(function(){
var testNum = "javascript";
//注意:此行代码使用返单引号
var html = `<a οnclick="Test('${testNum}')">`
+ '测试传参</a>';
$('#main_dom').append(html);
})
function Test(num){
console.log(num)
}
</script>
</html>
使用es6新增的字符串语法${},配合反单引号拼接起来