Javascript onClick函数执行两次
我试图让JavaScript在单击Javascript onClick函数执行两次,javascript,html,javascript-events,onclick,Javascript,Html,Javascript Events,Onclick,我试图让JavaScript在单击复选框或单击时正确执行。然而,它似乎执行了两次代码;一次用于复选框,一次用于 现在,你可能会说:“为什么不把它放在复选框上,然后完成它呢?”如果是这么简单,我会这么做的。但是,当他们单击或在复选框上单击时,它被请求触发 现在要增加一些复杂性,当触发onClick时,它会将数据以数组形式发送回父级进行处理,直到更新时间到来 子窗口(问题区域) 子窗口HTML——请注意PHP正在生成和字段 echo "<tr id='embroideryData' oncli
复选框或单击
时正确执行。然而,它似乎执行了两次代码;一次用于复选框,一次用于
现在,你可能会说:“为什么不把它放在复选框上,然后完成它呢?”如果是这么简单,我会这么做的。但是,当他们单击
或在复选框上单击时,它被请求触发
现在要增加一些复杂性,当触发onClick
时,它会将数据以数组形式发送回父级进行处理,直到更新时间到来
子窗口(问题区域)
子窗口HTML——请注意PHP正在生成和字段
echo "<tr id='embroideryData' onclick=\"javascript:FnSearch('" . $data['urembroidid'] . "', '".$data['EmbroideryID']."')\">"; // On a <tr> execute the update
if (OrderKeyExists($data['EmbroideryID'])) {
echo "<td id='checkbox'><input type='checkbox' id='embroid".$data['EmbroideryID']."' checked='checked'/></td>";
} else {
echo "<td id='checkbox'><input type='checkbox' id='embroid".$data['EmbroideryID']."'/></td>";
}
echo "</tr>\n";
echo”“;//在服务器上执行更新
如果(OrderKeyExists($data['YID'])){
回声“;
}否则{
回声“;
}
回音“\n”;
我只需要这个代码执行一次。单击
时,代码正常工作,但单击复选框时,代码执行两次。但是,当单击复选框时,它也会将父窗口内的数组弄乱到可能包含false
数据的位置。调试时,它会向FnSearch
发送一个onClick
,就好像复选框在未选中时最初是“选中的”
。因此,它会向父级发送一个“remove
”,但第二次则完全相反。这导致了数据的完整性
所以主要的问题是:如何让复选框
只执行FnSearch
一次
如果有人有任何意见,我们将不胜感激 有很多方法可以解决这个问题
(1)这是我解决同一问题的方式…因为我还需要自定义复选框
您可以使用复选框和未选中框的图像,而不是复选框,并在tr
单击时切换src
此外,您还为所有不起作用的td
提供了相同的id复选框
function toggleRowSelection(row){
if(row.getElementsByTagName('img')[0].src == "checked.jpg")
row.getElementsByTagName('img')[0].src = "unchecked.jpg"
else
row.getElementsByTagName('img')[0].src = "checked.jpg"
}
HTML(大约)
(2)使用获取行中单击的元素,如果是td
则选中/取消选中复选框
如果是复选框
,只需执行您的操作即可
(3)同时检查event.preventDefault()
和event.stopPropagation()
…当你问JS问题时,最好只显示讨论中的HTML,而不是显示生成HTML的PHP。它只是让阅读更容易。当点击复选框时,会触发一个事件。然后,该事件被引导至td,然后再引导至tr元素。将事件移动到复选框(它实际所属的位置)或防止事件冒泡到下一个级别。@jeff那么有没有办法防止复选框触发自己的事件或捕获并使用它?@Twister1002如果从复选框中取消事件,则您的函数将不会执行。至于使用实际事件,请将onclick事件函数放在复选框中。@jeff如果取消了复选框中的onclick,则它仍将从
执行,对吗?是否有办法阻止复选框执行任何操作?请检查第三点<代码>事件。stopPropagation()
用于停止父元素上的单击事件传播。。。。
function toggleRowSelection(row){
if(row.getElementsByTagName('img')[0].src == "checked.jpg")
row.getElementsByTagName('img')[0].src = "unchecked.jpg"
else
row.getElementsByTagName('img')[0].src = "checked.jpg"
}
<tr onclick="toggleRowSelection(this)"><td><img src="checked.jpg"></td></tr>
<tr onclick="toggleRowSelection(this)"><td><img src="checked.jpg"></td></tr>