Javascript "this" - Referenz für das onclick-Ereignis nicht funktioniert
Ich versuche, eine Funktion aufzurufen, mit der "onclick" - Ereignis so:
<td id="A1" onclick="move()" class="white"></td>
<td id="A2" onclick="move()" class="painted bp"></td>
<td id="A3" onclick="move()" class="white"></td>
In der Funktion selber, ich beziehe mich auf "das":
function move(e){
var myId = this.id;
alert("myId");
}
Wenn ich bei der ganzen Sache, der Alarm sagt 'undefined'. Wenn ich versuche alert(this)
bekomme ich [object window].
Ich arbeite mit IE9, btw.
Dank
- Dies ist, wie es funktioniert,
this
wird ersetzt durchwindow
wenn nichts anderes zur Verfügung gestellt. Was erwarten Sie? - Zur info, die Funktion, wo
this
bezieht sich auf das element innerhalb der Anführungszeichen. Im Grundeonclick="move()"
ist die gleiche wie.onclick = function( event ) { move(); }
, wo, wie Sie erwarten, dass es sich zu Verhalten wie.onclick = move;
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beim Aufruf einer Funktion aus einem Ereignis-handler, seinen
this
ist nicht festgelegt durch den hf (obwohl Sie können passthis
von der hf pro Xdazz Antwort, oder setzen Siethis
pro Kyle ' s Antwort). Ein weiterer Ansatz besteht darin, die sender-element aus dem event-Objekt mit dem event verbunden:Dir auch passieren muss das Ereignis explizit:
Beachten Sie, dass wenn die Zelle in der Tabelle hat verschachtelte Elemente, die Sie werden die "sender" - damit greifen Sie das gewünschte element (das ist die Zelle in der Tabelle), müssen Sie die traverse nach oben. Dies zu vermeiden Kopfschmerzen finden Sie unter so fügen Sie dem Handler-code durch.
Live-test-Fall.
Sagte, eine bessere Praxis wäre, zu binden, das click-Ereignis per code anstelle von inline - mischen Sie nicht HTML mit JavaScript. Um dies zu erreichen, haben solche-code:
Mit dem obigen code erstellt haben, können Sie entfernen Sie die inline -
onclick=
- Aufrufe aus HTML und halten Sie Ihre ursprüngliche Funktion - diethis
wird an der angeklickten Tabellenzelle.Aktualisiert fiddle.
e.target
unde.srcElement
sind nicht unbedingt das element, das den handler. Sie stellen die am tiefsten verschachtelte element erhalten, dass die Veranstaltung. (ich würde davon ausgehen das<td>
Elemente haben einige Inhalte.)<td>
Elemente nie untergeordneten Elemente, es wird funktionieren.<td>
s onclick-Ereignis automatisch?img
wird zuerst aufgerufen. Dann ist die Veranstaltung "Blasen" durch seine Vorfahren und ruft alleonclick
Veranstaltungen findet er den Weg entlang. Also der handler auf die<td>
auch aufgerufen werden. Aber es gibt Möglichkeiten, zu stoppen, die sprudelt an der<img>
wenn nötig.<td>
.this
ist diewindow
Objekt in Ihrem code.Könnte passieren
this
als parameter.dann:
Nun
this
beziehen sich auf dietd
element in Ihremmove
Funktion.event
als die zweite arg zu.call()
. So auch alte IE erhalten das event-Objekt in der Funktion genauso wie eine normale Prozedur.event
. Ich war versucht, eine Lösung war super einfach.Versuchen mit dem Ereignis-Ziel statt, um die dom-element, das Sie suchen:
Unable to get value of the property 'target': object is null or undefined
Dies ist IE9e.target
ist nicht unbedingt das gleiche wie das element, OP ausgerichtet ist.oCell.onclick = move(this);
stattoCell.onclick = move;
ich habe ein "Nicht implementiert" FehleroCell.onclick = move;
ist der richtige Weg, und Sie habenthis
einfach gut in der Funktion.