【问题标题】:Why this onClick function is not being created properly using Javascript?为什么没有使用 Javascript 正确创建这个 onClick 函数?
【发布时间】: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函数()的东西吗?然后无需解析:&lt;td class="datacell"&gt;&lt;?php echo $user["name"]; ?&gt;&lt;/td&gt; - 现在它只是一个字符串,可以用 $row.find(".datacell").text() 读取,无需 HTML 和解析
  • 可能。然后只需添加修剪:$row.find(".datacell").text().trim()

标签: javascript jquery datatables


【解决方案1】:

因此,在阅读完 cmets 后,我会将我的发现作为答案发布

  1. 在隐藏单元格中添加用户名,以确保任何引号或特殊字符不会干扰数据的传递。
    &lt;td class="datacell"&gt;&lt;?php echo $user["name"]; ?&gt;&lt;/td&gt;
  2. 给单元格一个类
  3. 添加按钮,给它一个类
  4. 将此代码添加到页面,其中tableID是表或tbody的id

$("#tableID").on("click",".edit-admin",function(e) { 
  const $row = $(this).closest("tr"); 
  const data = $row.find(".datacell").text().trim(); // in case the PHP addes spaces
  edit_admin_request(this,data);
});

【讨论】:

  • 知道为什么我不能访问隐藏的列吗?我像这样隐藏它们:{"targets": [6, 7, 8], "visible": false }
  • 我没有使用过数据表
猜你喜欢
  • 2019-06-28
  • 1970-01-01
  • 2016-09-23
  • 2020-01-06
  • 2016-10-28
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 2017-12-30
相关资源
最近更新 更多