Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript onClick函数执行两次_Javascript_Html_Javascript Events_Onclick - Fatal编程技术网

Javascript onClick函数执行两次

Javascript onClick函数执行两次,javascript,html,javascript-events,onclick,Javascript,Html,Javascript Events,Onclick,我试图让JavaScript在单击复选框或单击时正确执行。然而,它似乎执行了两次代码;一次用于复选框,一次用于 现在,你可能会说:“为什么不把它放在复选框上,然后完成它呢?”如果是这么简单,我会这么做的。但是,当他们单击或在复选框上单击时,它被请求触发 现在要增加一些复杂性,当触发onClick时,它会将数据以数组形式发送回父级进行处理,直到更新时间到来 子窗口(问题区域) 子窗口HTML——请注意PHP正在生成和字段 echo "<tr id='embroideryData' oncli

我试图让JavaScript在单击
复选框或单击
时正确执行。然而,它似乎执行了两次代码;一次用于
复选框,一次用于

现在,你可能会说:“为什么不把它放在复选框上,然后完成它呢?”如果是这么简单,我会这么做的。但是,当他们单击
或在
复选框上单击
时,它被请求触发

现在要增加一些复杂性,当触发
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>