Javascript TR作为链路,其TD作为其他链路
出于一些非常奇怪的原因,tr的window.location.href战胜了td的window.location.href。如果我将它们替换为警报,它们将按正确的顺序显示:td然后tr,单击右侧的td 您需要防止click事件冒泡到。使用以下命令:Javascript TR作为链路,其TD作为其他链路,javascript,Javascript,出于一些非常奇怪的原因,tr的window.location.href战胜了td的window.location.href。如果我将它们替换为警报,它们将按正确的顺序显示:td然后tr,单击右侧的td 您需要防止click事件冒泡到。使用以下命令: onclick="changeLocation(event, 'user?user=Bobo', true);" 你也可以为活动做同样的事情 并声明函数: function changeLocation(e, newURL, noBubble) {
onclick="changeLocation(event, 'user?user=Bobo', true);"
你也可以为活动做同样的事情
并声明函数:
function changeLocation(e, newURL, noBubble) {
if (noBubble) {
e.stopPropagation();
}
console.log("Would be navigating to: " + newURL);
//window.location.href = newURL;
}
在实际代码中,您显然会删除console.log行,并取消注释更改URL的实际部分
演示:
这允许它,所以如果你点击那个特定的,它会赢。如果您单击其中的任何其他位置,它将获胜,因为没有其他与它冲突的事件。问题是单击会在dom树中冒泡。因此,第一次调用td的onclick,然后click事件传播到tr并执行该事件 要停止传播,请使用:
<td onclick="window.location.href='user?user=Bobo'; event.stopPropagation();">
背景中发生了什么:
文件结构:
文件
祖父母
父母亲
要素
父母2
...
事件:用户单击元素
结果:
将执行元素的所有单击侦听器*
事件开始冒泡
将执行父级的所有单击侦听器*
将执行父级的所有单击侦听器*
将执行文档的所有单击侦听器*
*侦听器获取事件对象,并可以通过调用以下命令取消冒泡:
event.stopPropagation:不让事件传播到父级,而是执行当前级别上的所有侦听器。
event.stopImmediatePropagation:不允许事件传播到父级,也不会在同一级别上调用其他侦听器
可以检查单击事件对象以了解信息的每个图层:
当前正在处理的事件event.currentTarget
最初单击的元素event.target
希望这会有所帮助,因为Javascript读取最后一个给予location对象的href属性。
它必须首先执行td onclick,然后执行tr onclick。由于页面尚未加载,它指向您设置的最后一个href属性。td onclick首先被触发,但tr onclick会覆盖window.location.href 移动到另一个页面不会阻止调用其他javascript
window.location.href='http://www.google.com';
window.location.href='http://www.bing.com';
正如你的提醒所显示的那样,tr不会最终获胜吗?这真的很有趣。谢谢
window.location.href='http://www.google.com';
window.location.href='http://www.bing.com';