如果您使用的是jQuery ,答案 1 是可以的。如果您使用支持querySelectorAll
.
第二个也有一个缺点:它将事件侦听器分配给所有<td>
s,这是一种非常繁重的方法。您第一次尝试仅将事件处理程序放在 上<tr>
实际上更轻量级(顺便说一下,这称为事件委托)但也有一点缺点:您必须过滤掉正确的元素。
因此,如果您想坚持跨浏览器“香草 javaScript ”,您可能需要尝试以下操作:
首先将this
andevent
作为函数调用的参数:onclick="OpenAdPreview(event, this)"
,然后将函数更改OpenAdPreview
为:
function OpenAdPreview(event, that){
var e = event || window.event,
elm = e.target || e.srcElement,
allTDs = that.getElementsByTagName('td');
while (elm.nodeName.toLowerCase() !== 'td' && elm !== that) {
elm = elm.parentNode; // get the right element if it's not the td already
}
if (elm !== allTDs[1] && elm !== that) { // this filters out your second td
... here goes your code
}
}
that
提供<tr>
您可以查找所有td
s 的位置getElementsByTagName
,然后过滤掉。
另一种(更好的)方法是将类名分配给td
您不想单击的类名并按其过滤:<td class="dont-touch-me"></td>
然后在您的代码中:
if ((' ' + elm.className + ' ').indexOf('dont-touch-me') < 0) { ...
这样你就不会让你的代码依赖于你的布局。然后总是保存以更改 HTML 标记的类名,并且您的代码仍然按预期工作。
顺便说一句:内联事件不是一个好方法。尝试坚持使用传统的事件处理程序分配,例如.addEventListener
,.attachEvent
或jQuery.on()
事件处理。这样您也不必为this
,that
和event
.
添加了一个 JSFiddle:http: //jsfiddle.net/5zxun/4/