【发布时间】:2020-08-12 13:23:25
【问题描述】:
我在调用 JS 函数时创建了新按钮,但我认为我在作为参数传递的 onclick 事件处理程序中对对象进行字符串化的方式有问题:
...
var edit_button = '<button type="button" id="buttons" onclick="edit_admin_request(this,\'' + JSON.stringify(edit_admin_object) + '\')" name="edit_admin">Edit</button>';
var rowNode = myTable.row(window.rowindex).data([edit_button]).draw();
...
创建此按钮时,当我尝试单击它时,它根本不会调用edit_admin_request(this_,data_) 函数。
如果我尝试传递一个简单的字符串而不是字符串化对象 onclick="edit_admin_request(this,\'' + ["a string inside if an array"] + '\')" ,这可行,我可以调用 edit_admin_request(this_,data_) 函数。
我不明白为什么会这样?!
更新: 这是我显示按钮的行(注意:我使用的是动态表,所以这一行在 foreach 循环内):
<td>
<div id="edit_button_row" class="edit_button_row">
<button type="button" class="edit_admin" id="buttons" onclick='edit_admin_request(this,<?php echo json_encode($user); ?>)' name="edit_admin">Edit</button>
</div>
</td>
【问题讨论】:
-
由于 JSON 中的双引号干扰了 HTML 属性中的双引号,它很可能被破坏。这就是为什么内联事件处理程序是一个坏主意的部分原因。我强烈建议您更改逻辑以使用不显眼的事件处理程序。研究
addEventListener()方法。 -
您正在使用某种框架。它是什么并显示更多代码。 minimal reproducible example 会很棒
-
$("#tableID").on("click",".edit-admin",function(e) { const $row = $(this).closest("tr"); const data = JSON.parse($row.find(".datacell").text()) })假设您必须在某处为每一行保存一些数据 -
那么用户名是你唯一需要传递给edit_admin函数()的东西吗?然后无需解析:
<td class="datacell"><?php echo $user["name"]; ?></td>- 现在它只是一个字符串,可以用$row.find(".datacell").text()读取,无需 HTML 和解析 -
可能。然后只需添加修剪:
$row.find(".datacell").text().trim()
标签: javascript jquery datatables