RawClicked
我有一个旧的tr分配方法为这样的事件:
<tr ondblclick="RawClicked(this) .......
,我想在JavaScript代码中附加这样的事件,并删除在HTML标签<tr .... >
中分配事件处理程序:
var element = document.getElementById("CustomersTable").getElementsByTagName("tr");
AssigningEventHandles(element, "dblclick", RawClicked(this));
function AssigningEventHandles(element, event, handler) {
if (element.addEventListener) {
element.addEventListener(event, handler, false);
}
else if (element.attachEvent) {
element.attachEvent("on"+ event, handler);
}
}
function RawClicked(raw) {
var rawDoubleClicked = raw.id;
alert(rawDoubleClicked);
}
那么在这种情况下,我如何将参数this
传递给函数呢?
-
在您的示例中,
element
是节点的集合,而不是单个元素,因此您不能以这种方式添加事件侦听器。您可以遍历此节点集合,或者使用事件委托并将事件侦听器附加到<table>
。 -
在这行
AssigningEventHandles(element, "dblclick", RawClicked(this));
RawClicked被执行,this
绑定到全局对象。所以作为handler
传递给AssigningEventHandles
的参数是这个函数的结果,它是空的。您应该像这样传递函数:AssigningEventHandles(element, "dblclick", RawClicked);
,然后在RawClicked
中使用this.id
而不是raw.id
。
var element = document.getElementById("CustomersTable").getElementsByTagName('tr');
AssigningEventHandles(element, "dblclick", RawClicked);
function AssigningEventHandles(element, event, handler) {
if( !element.length ){ /* convert to array if it's a single node */
element = [element];
}
for( var i=0; i<element.length; i++){ /* iterate over nodes and attach event listeners */
if (element[i].addEventListener) {
element[i].addEventListener(event, handler, false);
}
else if (element[i].attachEvent) {
element[i].attachEvent("on"+ event, handler);
}
}
}
function RawClicked() {
/* `this` is bound to the clicked element */
var rawDoubleClicked = this.id;
alert(this);
}
http://jsfiddle.net/WU76d/在firefox(使用addEvenListener)中,处理程序似乎在元素的范围内运行,因此只需在RawClicked中使用"this"应按预期工作