我在<td>
和<tr>
元素的表格中都有一个onclick事件。我需要在用户点击特定列(<td>
)时,<tr>
事件不会被触发,只会触发<td>
。
怎么做?
示例:
HTML:
<tr onclick='trclick();'>
<td>Column 1</td>
<td>Column 2</td>
<td onclick='tdclick();'>Column 3</td>
</tr>
JS:
function trclick(){console.log('tr clicked')};
function tdclick(){console.log('td clicked')};
当用户点击&#39;第3列&#39;时,会触发这两个事件,但我只想触发tdclick()
。
答案 0 :(得分:7)
你需要做的是在点击一个孩子时停止传播父事件,在jQuery中很容易完成,但天真的你需要做更多的工作:
function trclick(){
console.log('tr clicked')
};
function tdclick(e){
if (!e) var e = window.event; // Get the window event
e.cancelBubble = true; // IE Stop propagation
if (e.stopPropagation) e.stopPropagation(); // Other Broswers
console.log('td clicked');
};
注意,对于Firefox,您需要传递event
参数:
<td onclick='tdclick(event)'>Column 3</td>
答案 1 :(得分:4)
您需要停止事件的传播。
要访问事件对象,您需要将其用作函数tdclick
function trclick(){console.log('tr clicked')};
function tdclick(event){
console.log('td clicked');
event.stopPropagation()
};
&#13;
<table><tbody>
<tr onclick='trclick();'>
<td>Column 1</td>
<td>Column 2</td>
<td onclick='tdclick(event);'>Column 3</td>
</tr>
</tbody></table>
&#13;
答案 2 :(得分:1)
使用&#34;事件&#34;调用所有javascript事件第一个参数中的对象。这个对象有一个&#34; stopPropagation&#34;方法,用于阻止在更高层次的DOM节点上触发相同事件的侦听器。
有一个例子就像你在MDN的例子:https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model/Examples#Example_5:_Event_Propagation
在您的示例中,您可以停止传播&#34; tdclick&#34;:
function tdclick(e){
e.stopPropagation();
console.log('td clicked')
};
&#13;
答案 3 :(得分:1)
您可以在函数输入中使用el并将变量传递给它,无论您想调用它的哪个位置。
<!DOCTYPE html>
<html>
<head>
<script type='text/javascript'>
function colorChanger(el){
el.style.backgroundColor = '#007d00';
}
</script>
</head>
<body>
<table>
<tr onclick="colorChanger(this);">
<td onclick="colorChanger(this);">click me</td>
</tr>
</table>
</body>
</html>
答案 4 :(得分:0)
我喜欢这种方法:
<td style='cursor: pointer;' tdclick(event);'></td>
然后是JS
<script>
tdclick(){
//do something...
}
</script>