Javascript dom 解析问题排查
Javascript dom parsing troubleshoot
我从字符串创建按钮并将其添加到 DOM。
这是 javascript 代码:
var se = "<button class='btn btn-xs btn-default btn-quick' title='Save Row' onclick=\"jQuery('#jqgrid').saveRow('" + cl + "','" + null + "','" + '../UpdateStatus' + "','" + {'name':"content1"} + "','" + null + "','" + null + "','" + null + "');\"><i class='fa fa-save'></i></button>";
下面是按钮如何附加到 DOM:
jQuery("#jqgrid").jqGrid('setRowData', ids[0], { act: se });
jqgrid - 是一些 html 元素的 id
。
正如您在按钮内部看到的那样,我有 onClick
属性调用名为 saveRow
的函数。
这里是被调用函数的签名:
saveRow: function (rowid, successfunc, url, extraparam, aftersavefunc, errorfunc, afterrestorefunc) {}
我传递给 saveRow
函数的参数之一是 json:
{'name':"content1"}
页面加载后按钮在 DOM 树中的外观:
(抱歉文字太小)
如你所见DOM转换了这个参数(红框):
{'name':"content1"}
对此:
'[Object object]'
知道为什么 JSON 参数转换为这个 [Object object]
吗?
更新:
这里是 DOM 的样子:
如果我用这种态度:
se = "<button class='btn btn-xs btn-default btn-quick' title='Save Row' onclick=\"jQuery('#jqgrid').saveRow('" + cl + "','" + null + "','" + '../UpdateStatus' + "','" + JSON.stringify({ foo: 'bar' }) + "','" + null + "','" + null + "','" + null + "');\"><i class='fa fa-save'></i></button>";
更新2:
这里是 DOM 的样子:
如果我用这种态度:
se="<button class='btn btn-xs btn-default btn-quick' title='Save Row' onclick='jQuery('#jqgrid').saveRow('" + cl + "','" + null + "','" + '../UpdateStatus' + "','" + JSON.stringify({ foo: 'bar' }) + "','" + null + "','" + null + "','" + null + "');'><i class='fa fa-save'></i></button>";
单击按钮后出现此错误:
那是因为当您尝试将 JSON 添加为 html 时,它会调用函数 toString()
,其中 return [Object object]
就像本例中那样。
var obj = {foo: 'bar'};
console.log(obj.toString());
By default, the toString() method is inherited by every object descended from Object. If this method is not overridden in a custom object, toString() returns "[object type]", where type is the object type.
如果你想使用你的 JSON 首先使用 JSON.stringify
将其转换为字符串
The JSON.stringify() method converts a JavaScript value to a JSON string
像这样:
var obj = {foo: 'bar'};
var a = "<a onclick='doSome(" + JSON.stringify(obj) + ")'>Do Something</a>";
document.body.innerHTML += a;
function doSome(obj) {
console.log(obj.foo);
}
更新 2
var cl = 198;
var se = "<button class='btn btn-xs btn-default btn-quick' title='Save Row' onclick='jQuery(\"#jqgrid\").saveRow(\"" + cl + "\", " + null + "," + "\"../UpdateStatus\"," + JSON.stringify({ foo: 'bar' }) + ")'><i class='fa fa-save'></i></button>";
document.body.innerHTML += se;
jQuery.fn.saveRow = function() {
console.log(arguments);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
我从字符串创建按钮并将其添加到 DOM。
这是 javascript 代码:
var se = "<button class='btn btn-xs btn-default btn-quick' title='Save Row' onclick=\"jQuery('#jqgrid').saveRow('" + cl + "','" + null + "','" + '../UpdateStatus' + "','" + {'name':"content1"} + "','" + null + "','" + null + "','" + null + "');\"><i class='fa fa-save'></i></button>";
下面是按钮如何附加到 DOM:
jQuery("#jqgrid").jqGrid('setRowData', ids[0], { act: se });
jqgrid - 是一些 html 元素的 id
。
正如您在按钮内部看到的那样,我有 onClick
属性调用名为 saveRow
的函数。
这里是被调用函数的签名:
saveRow: function (rowid, successfunc, url, extraparam, aftersavefunc, errorfunc, afterrestorefunc) {}
我传递给 saveRow
函数的参数之一是 json:
{'name':"content1"}
页面加载后按钮在 DOM 树中的外观:
如你所见DOM转换了这个参数(红框):
{'name':"content1"}
对此:
'[Object object]'
知道为什么 JSON 参数转换为这个 [Object object]
吗?
更新:
这里是 DOM 的样子:
如果我用这种态度:
se = "<button class='btn btn-xs btn-default btn-quick' title='Save Row' onclick=\"jQuery('#jqgrid').saveRow('" + cl + "','" + null + "','" + '../UpdateStatus' + "','" + JSON.stringify({ foo: 'bar' }) + "','" + null + "','" + null + "','" + null + "');\"><i class='fa fa-save'></i></button>";
更新2:
这里是 DOM 的样子:
如果我用这种态度:
se="<button class='btn btn-xs btn-default btn-quick' title='Save Row' onclick='jQuery('#jqgrid').saveRow('" + cl + "','" + null + "','" + '../UpdateStatus' + "','" + JSON.stringify({ foo: 'bar' }) + "','" + null + "','" + null + "','" + null + "');'><i class='fa fa-save'></i></button>";
单击按钮后出现此错误:
那是因为当您尝试将 JSON 添加为 html 时,它会调用函数 toString()
,其中 return [Object object]
就像本例中那样。
var obj = {foo: 'bar'};
console.log(obj.toString());
By default, the toString() method is inherited by every object descended from Object. If this method is not overridden in a custom object, toString() returns "[object type]", where type is the object type.
如果你想使用你的 JSON 首先使用 JSON.stringify
The JSON.stringify() method converts a JavaScript value to a JSON string
像这样:
var obj = {foo: 'bar'};
var a = "<a onclick='doSome(" + JSON.stringify(obj) + ")'>Do Something</a>";
document.body.innerHTML += a;
function doSome(obj) {
console.log(obj.foo);
}
更新 2
var cl = 198;
var se = "<button class='btn btn-xs btn-default btn-quick' title='Save Row' onclick='jQuery(\"#jqgrid\").saveRow(\"" + cl + "\", " + null + "," + "\"../UpdateStatus\"," + JSON.stringify({ foo: 'bar' }) + ")'><i class='fa fa-save'></i></button>";
document.body.innerHTML += se;
jQuery.fn.saveRow = function() {
console.log(arguments);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>