javascript - 通过html传递对象变量

标签 javascript html dom

我试图通过 HTML 传递一个对象,但得到的是

Uncaught SyntaxError: Unexpected end of input

错误。我仍在学习 JavaScript DOM,非常感谢任何帮助。

data = getdata(); //retreive my data
var mtable = document.createElement("table"); //create table element via javascript
mtable.innerHTML += "<tr><th>Name</th><th>Modify</th></tr>";
for (i = 0; i < data.length; i++) {
    var ins = createEle("tr");
    ins.innerHTML = "<td>" + data[i]['name'] + "</td>";
    ins.innerHTML += "<td><button id=" + data[i]['tid'] + " onclick=make_modifytourney2(this.id," + data[i] + ")>Modify</button></td></tr>";
    mtable.appendChild(ins);
}

然后我将 mtable 附加到文档中。 data[i] 是我想通过此代码传递的数组对象,但它不起作用。我知道我可以使用 tid 再次检索此数据,但我不想这样做,因为数据已经存在。

编辑:我的createEle

function createEle(ele, css) {
var nn = document.createElement(ele);
nn.setAttribute("class", css);
return nn;
}

一个简单的助手 编辑 2 我的数组数据将是这样的

  data=[(4) [{…}, {…}, {…}, {…}]
  0
  :
  {name: "T1", tid: 1, fdate: "2018-07-11", tdate: "2018-07-26", category: "mens", …}
  1
  :
  {name: "T2", tid: 2, fdate: "2018-07-20", tdate: "2018-07-26", category: "womens", …}
  2
  :
  {name: "nart", tid: 3, fdate: "0001-01-01", tdate: "0001-01-01", category: "1", …}
  3
  :
  {name: "xyz", tid: 4, fdate: "0001-01-01", tdate: "0222-02-01", category: "23", …}]

最佳答案

单击您生成的“修改”按钮时发生错误。

主要是因为您在 onclick 属性中声明了这条指令:

make_modifytourney2(this.id," + data[i] + ")

生成以下 HTML 代码:

<button id="undefined" onclick="make_modifytourney2(this.id,[object" object])>Modify</button>

现在您的 onclick 属性中有一些经过剪辑的 JavaScript 代码。

我不知道这是不是打字错误,但无论如何,如果你想摆脱那个错误,你需要:

  • 使用转义双引号封装onclick属性指令
  • 使用带空格的单引号来封装函数调用的参数

您的代码将是:

ins.innerHTML += "<td><button id=" + data[i]['tid'] + " onclick=\"make_modifytourney2(this.id,'" + data[i] + "')\">Modify</button></td></tr>";

function getdata() { 
  return [{name : "John"}, {name : "Jack"}];
}

function createEle(ele, css) {
  var nn = document.createElement(ele);
  nn.setAttribute("class", css);
  return nn;
}

function make_modifytourney2(param1, param2) {
  console.log(`Clicked Modify with params : ${param1}, ${param2}`);
}

var data = getdata(); //retreive my data
var mtable = document.createElement("table"); //create table element via javascript
mtable.innerHTML += "<tr><th>Name</th><th>Modify</th></tr>";
for (i = 0; i < data.length; i++) {
  var ins = createEle("tr");
  ins.innerHTML = "<td>" + data[i]['name'] + "</td>"
  ins.innerHTML += "<td><button id=" + data[i]['tid'] + " onclick=\"make_modifytourney2(this.id,'" + data[i] + "')\">Modify</button></td></tr>";
  mtable.appendChild(ins);
}
document.body.appendChild(mtable);

现在,由于您生成元素的方式,这有点困惑。它宁愿建议您将 DOM 元素用作 JavaScript 对象并使用事件监听器。

这是它的样子:

function getdata() {
  // dummy object with a tid and a name field 
  return [{
    tid: '1',
    name: "John"
  }, {
    tid: '2',
    name: "Jack"
  }];
}

function createEle(ele, css) {
  var nn = document.createElement(ele);
  nn.setAttribute("class", css);
  return nn;
}

// function that creates a TD element with a child 
function createTd(child) {
  var td = document.createElement("td");
  td.appendChild(child);
  return td;
}

// function that creates a modify button based on your data object 
function createModifyButton(data) {
  var button = document.createElement("button");
  button.id = data.tid;
  button.addEventListener("click", function() {
    // use whatever parameter you need from the data object : 
    make_modifytourney2(data.tid, data.name);
  });
  button.appendChild(document.createTextNode("Modify"));
  return button;
}

function make_modifytourney2(param1, param2) {
  console.log(`Clicked Modify with params : ${param1}, ${param2}`);
}

// local variables 
var data, mtable, i, ins, row1, row2;

data = getdata(); //retreive my data
mtable = document.createElement("table"); //create table element via javascript
mtable.innerHTML += "<tr><th>Name</th><th>Modify</th></tr>";
for (i = 0; i < data.length; i++) {
  ins = createEle("tr");
  // creating tds and appending them : 
  row1 = createTd(document.createTextNode(data[i]['name']));
  ins.appendChild(row1);
  row2 = createTd(createModifyButton(data[i]));
  ins.appendChild(row2);

  mtable.appendChild(ins);
}
document.body.appendChild(mtable);

关于javascript - 通过html传递对象变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51615761/

相关文章:

javascript - JavaScript 中的二进制到字符串

javascript - 宾果游戏,程序结束时添加提示

javascript - 如何仅将序列号添加到特定表格的第一列

java - 使用 JQuery 解析 JSON 有困难

javascript - 在 Node.js glob 结果中加入数组循环

javascript - jQuery 滑动侧边栏面板插件中的问题

javascript - 悬停在菜单栏上时链接消失

javascript - 表单对象中的换行符

javascript - 如何在 JavaScript 中将单独的元素添加到列表中?

javascript - 将当前时间添加到我页面上的特定部分