如何将 javascript 对象传递给使用 onclick 等方式指定的 JavaScript 函数
How to pass an javascript object to a javascript function specified using, for example, onclick
我一直在寻找一些时间来解决以下问题:我在javascript函数中有一个定义数据表的对象。我想将此表的一行传递给使用表单元格(td 元素(的 onclick 处理程序定义的函数,以便它可以打开一个弹出窗口,其中包含该元素的额外信息。
我找到了很多解决方案,但主要涉及从php准备然后传递给javascript的字符串。我的情况在需要上述功能的级别不涉及 php。
经过一些实验,我想出了以下内容。
将对象传递给内联 HTML 函数需要 2x 字符串化。第一个将创建 json 字符串,第二个将转义所有双引号,并在开头和结尾添加双引号。然后,接收函数只需要 JSON.parse(( 以这种方式传递的 json 字符串。
// JSON format for json_txt is:
// { "column 1" : ["c1 data 1", "c1 data 2", ...],
// "column 2" : ["c2 data 1", "c2 data 2", ...],
// ...
// }
function createTable(json_txt, el_id)
{
var el = document.getElementById(el_id);
var o = JSON.parse(json_txt);
var s = '<table>';
var num = numTableRows(o); // just returns number of rows
for (var r=0; r<num; r++)
{
s += '<tr class="tbl_data">';
for (var col in o)
{
if (col === 'a special column name here')
{
var js = {};
for (var c in o) js[c] = o[c][r];
s += "<td onclick='onTrackShowInfo(this," + JSON.stringify(JSON.stringify(js))+" )'>";
}
else
s += '<td>';
s += o[col][r];
s += '</td>';
}
s += '</tr>';
}
s += '</table>';
el.innerHTML = s;
}
....
function onTrackShowInfo(el, json_row)
{
var o = JSON.parse(json_row);
// ok, we have the row from element 'el' at this point
}
我在这里发布它的一个原因是帮助那些可能也在寻找类似东西的人,并询问是否有人看到任何问题,或者已经为这个特定问题提出了更好的解决方案。
编辑:添加了 createTable(( 函数的一个非常简化的版本,以显示更多运行此代码的上下文。
正如@charlietfl所建议的,你应该摆脱在属性中使用JavaScript的习惯,并使用事件委托来解决这个问题:
function createTable(json_txt, el_id) {
var el = document.getElementById(el_id);
var o = JSON.parse(json_txt);
var s = '<table>';
var num = numTableRows(o); // just returns number of rows
var tableData = [];
for (var r=0; r < num; r++) {
var rowData = {};
s += '<tr class="tbl_data">';
for (var col in o) {
var curVal = o[col][r];
rowData[col] = curVal;
s += "<td data-row='" + r + "'>" + curVal + "</td>";
}
s += '</tr>';
tableData.push(rowData);
}
s += '</table>';
el.innerHTML = s;
el.addEventListener("click", function(e) {
var targ = e.target,
rowNum,
data;
if(targ && targ.nodeName == "TD") {
rowNum = targ.getAttribute("data-row");
data = tableData[rowNum];
if (data) {
onTrackShowVal(this, data);
}
}
});
}
(就像不是,如果你使用的是jQuery,最后一部分可以像这样完成,如果需要,可以更改"td"
字符串以提供更具体的选择器(:
$(el).on("click", "td", function () {
var rowNum = $(this).data("row"),
data = tableData[rowNum];
if (data) {
onTrackShowInfo(this, data);
}
});
看看这个编辑:
var js = {};
for (var c in o) js[c] = o[c][r];
s += "<td onclick='onTrackShowInfo(this, "+c+" )'>";
...
function onTrackShowInfo(el, json_row_index)
{
var o = js[json_row_index];
// ok, we have the row from element 'el' at this point
}
相关文章:
- 为什么这在IE中的工作方式与在Firefox中不同
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- Windows8应用程序(html&Javascript):从图片库(除了文件选择器)显示图像的另一种方式
- 如何在执行此特定onclick事件时执行JavaScript函数
- 在localhost Dev Box上测试JSONP请求的最佳方式
- Setting default onclick behavior for <img> tag in gene
- 使用javascript存储变量的最安全方式
- Javascript全局onclick监听器
- 在 Javascript OnClick 中传递多个值,以特定方式使用这些值
- 如何将 javascript 对象传递给使用 onclick 等方式指定的 JavaScript 函数
- 单击一行时重定向到操作的正确方式(onclick)Yii2
- 使用 jQuery 以编程方式添加 OnClick 失败
- javascript onclick事件在internet explorer中以编程方式调用时未冒泡<=8.
- 在javascript中以编程方式向输入字段添加onclick事件不起作用
- 以编程方式调用onclick和onchange不能按预期工作
- 以编程方式调用onclick属性
- 正确的方式onClick绑定在按钮
- 为什么图像在JavaScript onClick事件中以不正确的方式显示
- HTML/Javascript元素调用onclick函数的正确方式
- 未选中时调用onClick,以编程方式设置