HighDots Forums  

"this" in benutzerdefinierten Event-Handlern

Javascript (German) Programmiersprache JavaScript. (de.comp.lang.javascript)


Discuss "this" in benutzerdefinierten Event-Handlern in the Javascript (German) forum.



Reply
 
Thread Tools Display Modes
  #1  
Old   
Andreas Eibach
 
Posts: n/a

Default "this" in benutzerdefinierten Event-Handlern - 11-08-2007 , 04:25 PM






Hi.

Gegeben sei eine komplett nach DOM-Richtlinien erzeugte Tabelle
(createElement(), appendChild() usw).
Statt den Handler wie in Standard-HTML ins Tag zu schreiben: <td
id="blabla" onmouseover="tuWas(this)"> wird dieser assigned:

tdObj = document.createElement ("TD");
....
tdObj.onmouseover = function () { tuWas( ??? ) }

"this" an der Stelle ??? wäre Unfug, da es sich auf ein ganz anderes
Element beziehen würde!
Sollte ich gar
tdObj.onmouseover = function (this) { [x] tuWas( ??? ) }
schreiben?

Das [x] steht nicht von ungefähr, da ich den Parameter "this" ja noch in
eine Variable schreiben muss, da "this" _in_ der { } bereits wieder eine
Referenz auf ein anderes Objekt darstellen würde!

Bin nicht so der Fan von trial-and-error, und wollte das vorher genau
durchdenken.
Theoretisch sollte es möglich sein, so etwas wie diesen Pseudocode zu
implementieren:
<__________>
obj.onmouseover = function (this) { (assign this = param #1 to local
var); call tuWas (local var))

-Andreas


Reply With Quote
  #2  
Old   
Thomas 'PointedEars' Lahn
 
Posts: n/a

Default Re: "this" in benutzerdefinierten Event-Handlern - 11-08-2007 , 06:01 PM






Andreas Eibach wrote:
Quote:
Gegeben sei eine komplett nach DOM-Richtlinien erzeugte Tabelle
(createElement(), appendChild() usw).
Statt den Handler wie in Standard-HTML ins Tag zu schreiben: <td
id="blabla" onmouseover="tuWas(this)"> wird dieser assigned:

tdObj = document.createElement ("TD");
^
Die Argumentliste sollte vom Methodenbezeichner nicht durch Whitespace
getrennt sein, um sie von anderen Sprachelementen unterscheiden zu können.

Quote:
...
tdObj.onmouseover = function () { tuWas( ??? ) }
Sollte mit "DOM" einer der Webstandards W3C-DOM Level 1+ gemeint sein, so
ist diese Anweisung eben gerade nicht den "DOM-Richtlinien" entsprechend,
sondern proprietär ("DOM Level 0"). Korrekt wäre:

tdObj.addEventListener("mouseover", function() { ... }, false);

Quote:
"this" an der Stelle ??? wäre Unfug, da es sich auf ein ganz anderes
Element beziehen würde!
Unfug ist hingegen diese Behauptung. Jener Event-Listener wird vom
Event-Handler als Callback aufgerufen und daher ist `this' eine Referenz
auf das das Ereignis behandelnde Objekt. (Dies gilt jedoch nicht für alle
Event-Handler, etwa nicht für IXMLHTTPRequest:nreadystatechange.)

Sichergehen, dass `this' eben jene Referenz ist, kann man nur, wenn man
EventTarget::addEventListener() aus W3C DOM Level 2+ Events verwendet.

Quote:
Sollte ich gar
tdObj.onmouseover = function (this) { [x] tuWas( ??? ) }
schreiben?
Nein, denn `this' ist ein reserviertes Wort und kann daher niemals der
Bezeichner eines Methodenarguments sein.

Quote:
Das [x] steht nicht von ungefähr, da ich den Parameter "this" ja noch in
eine Variable schreiben muss, da "this" _in_ der { } bereits wieder eine
Referenz auf ein anderes Objekt darstellen würde!
Falsch.

Quote:
Bin nicht so der Fan von trial-and-error, und wollte das vorher genau
durchdenken.
Ein einfacher Test hätte Dir bereits gezeigt, dass Deine wilden Vermutungen
-- keinesfalls genau durchdachte Überlegungen -- falsch sind. Z.B.:

document.body.onmouseover = function()
{
window.alert(this.tagName);
};

Bzw. standardkonform:

document.body.addEventListener(
"mouseover",
function()
{
window.alert(this.tagName);
},
false);

Quote:
Theoretisch sollte es möglich sein, so etwas wie diesen Pseudocode zu
implementieren:
__________
obj.onmouseover = function (this) { (assign this = param #1 to local
var); call tuWas (local var))
Theoretisch kann ich mir auch ein Loch ins Knie schlagen, einen Kaktus
reinsetzen, den mit Essig giessen und hoffen, dass er wächst.

BTW: Deine Fragezeichen-Taste prellt. Bitte abstellen.


kopfschüttelnd,

PointedEars
--
Es ist ein ohne Sinn und Verstand ausgeschnittener Teil von invalidem
HTML mit in MSIE funktionierendem JScript (allerdings fehlen hier zum
Funktionieren erforderliche Teile), erzeugt von Micros~1 AffrontPage.
(Dietmar Meier in <aq8afp$7cc0b$1 (AT) ID-3767 (DOT) news.dfncis.de>)


Reply With Quote
  #3  
Old   
Andreas Eibach
 
Posts: n/a

Default Re: "this" in benutzerdefinierten Event-Handlern - 11-09-2007 , 03:06 AM




"Thomas 'PointedEars' Lahn" <PointedEars (AT) web (DOT) de> wrote:
Quote:
tdObj = document.createElement ("TD");
^
Die Argumentliste sollte vom Methodenbezeichner nicht durch Whitespace
getrennt sein, um sie von anderen Sprachelementen unterscheiden zu
können.
Uii. Du bist ja ein ganz Genauer. ;-] Sowas kann einfach auch
reingerutscht sein. Wie in diesem Fall.

Quote:
tdObj.onmouseover = function () { tuWas( ??? ) }

Sollte mit "DOM" einer der Webstandards W3C-DOM Level 1+ gemeint sein,
so
ist diese Anweisung eben gerade nicht den "DOM-Richtlinien"
entsprechend,
sondern proprietär ("DOM Level 0"). Korrekt wäre:
snip
Sichergehen, dass `this' eben jene Referenz ist, kann man nur, wenn
man
EventTarget::addEventListener() aus W3C DOM Level 2+ Events verwendet.
Yup. _Sofern es der Browser kann_.
Leider muss meine Applikation jedoch auch noch auf IE6 laufen. :-(
Und da sollte "DOM" bedeuten: "so weit nach Standard wie irgend
möglich".

Quote:
Theoretisch kann ich mir auch ein Loch ins Knie schlagen, einen Kaktus
reinsetzen, den mit Essig giessen und hoffen, dass er wächst.
Jep. Hoffentlich ein Stück weit in deine riesengroße Klappe rein, dann
ist sie immer noch groß genug, würde ich sagen.

Quote:
kopfschüttelnd,
ebenso (bei soviel Überheblichkeit)
Ich sehe ja dass du Ahnung hast; nur dieses Überhebliche, Lautstarke
wertet die wieder ab - schon mal daran gedacht?

-Andreas, dem das "Dankeschön!" hiermit vergangen ist



Reply With Quote
  #4  
Old   
Thomas 'PointedEars' Lahn
 
Posts: n/a

Default Re: "this" in benutzerdefinierten Event-Handlern - 11-09-2007 , 03:12 AM



Andreas Eibach wrote:
Quote:
"Thomas 'PointedEars' Lahn" <PointedEars (AT) web (DOT) de> wrote:
tdObj = document.createElement ("TD");
^
Die Argumentliste sollte vom Methodenbezeichner nicht durch
Whitespace getrennt sein, um sie von anderen Sprachelementen
unterscheiden zu können.

Uii. Du bist ja ein ganz Genauer. ;-] Sowas kann einfach auch
reingerutscht sein. Wie in diesem Fall.
Angenommen das wäre wahr, wäre Usenet dennoch kein 1:1-Kommunikationsmedium.

Quote:
tdObj.onmouseover = function () { tuWas( ??? ) }
^
Sollte mit "DOM" einer der Webstandards W3C-DOM Level 1+ gemeint sein,
so ist diese Anweisung eben gerade nicht den "DOM-Richtlinien"
entsprechend, sondern proprietär ("DOM Level 0"). Korrekt wäre:
snip
Sichergehen, dass `this' eben jene Referenz ist, kann man nur, wenn man
EventTarget::addEventListener() aus W3C DOM Level 2+ Events verwendet.

Yup. _Sofern es der Browser kann_. Leider muss meine Applikation jedoch
auch noch auf IE6 laufen. :-( Und da sollte "DOM" bedeuten: "so weit nach
Standard wie irgend möglich".
ACK. Jedoch wird auch im MSHTML-DOM wird jener Event-Listener als Callback
aufgerufen, ob man es nun proprietär mit `.onmouseover' oder proprietär mit
`.attachEvent("onmouseover" ...)' macht.

Quote:
[...]
kopfschüttelnd,

ebenso (bei soviel Überheblichkeit) Ich sehe ja dass du Ahnung hast; nur
dieses Überhebliche, Lautstarke wertet die wieder ab - schon mal daran
gedacht?

-Andreas, dem das "Dankeschön!" hiermit vergangen ist
Geh weg, und vergiss dabei nicht, Deinen kammquotenden, zeichensatzlosen OjE
mitzunehmen.


PointedEars, Score adjusted
--
Es ist ein ohne Sinn und Verstand ausgeschnittener Teil von invalidem
HTML mit in MSIE funktionierendem JScript (allerdings fehlen hier zum
Funktionieren erforderliche Teile), erzeugt von Micros~1 AffrontPage.
(Dietmar Meier in <aq8afp$7cc0b$1 (AT) ID-3767 (DOT) news.dfncis.de>)


Reply With Quote
  #5  
Old   
Andreas Eibach
 
Posts: n/a

Default Re: "this" in benutzerdefinierten Event-Handlern - 11-09-2007 , 04:18 AM




"Thomas 'PointedEars' Lahn" <PointedEars (AT) web (DOT) de> wrote:
Quote:
Yup. _Sofern es der Browser kann_. Leider muss meine Applikation
jedoch
auch noch auf IE6 laufen. :-( Und da sollte "DOM" bedeuten: "so weit
nach
Standard wie irgend möglich".

ACK. Jedoch wird auch im MSHTML-DOM wird jener Event-Listener als
Callback
aufgerufen, ob man es nun proprietär mit `.onmouseover' oder
proprietär mit
`.attachEvent("onmouseover" ...)' macht.
Hoppla!
Jetzt sagst du zu attachEvent() _ebenfalls_ "proprietär"!

Doof gefragt...Was wäre denn dann "nicht proprietär"? :-)

-Andreas



Reply With Quote
  #6  
Old   
Andreas Eibach
 
Posts: n/a

Default Re: "this" in benutzerdefinierten Event-Handlern - 11-09-2007 , 04:22 AM




"Thomas 'PointedEars' Lahn" <PointedEars (AT) web (DOT) de> wrote:
Quote:
Yup. _Sofern es der Browser kann_. Leider muss meine Applikation
jedoch auch noch auf IE6 laufen. :-( Und da sollte "DOM" bedeuten:
"so weit nach Standard wie irgend möglich".

ACK. Jedoch wird auch im MSHTML-DOM wird jener Event-Listener als
Callback aufgerufen, ob man es nun proprietär mit `.onmouseover' oder
proprietär mit `.attachEvent("onmouseover" ...)' macht.
Hoppla!
Jetzt sagst du zu attachEvent() ja _ebenfalls_ "proprietär"!

Doof gefragt...Was wäre denn dann "nicht proprietär"? :-)

-Andreas



Reply With Quote
  #7  
Old   
Thomas 'PointedEars' Lahn
 
Posts: n/a

Default Re: "this" in benutzerdefinierten Event-Handlern - 11-09-2007 , 04:31 AM



Andreas Eibach wrote:
Quote:
"Thomas 'PointedEars' Lahn" <PointedEars (AT) web (DOT) de> wrote:
Yup. _Sofern es der Browser kann_. Leider muss meine Applikation
jedoch
auch noch auf IE6 laufen. :-( Und da sollte "DOM" bedeuten: "so weit
nach
Standard wie irgend möglich".
ACK. Jedoch wird auch im MSHTML-DOM wird jener Event-Listener als
Callback
aufgerufen, ob man es nun proprietär mit `.onmouseover' oder
proprietär mit
`.attachEvent("onmouseover" ...)' macht.

Hoppla!
Jetzt sagst du zu attachEvent() _ebenfalls_ "proprietär"!
Gut beobachtet. attachEvent() -- nicht zu velwechsern mit
addEventListener() -- ist eine Methode des MSHTML-DOMs.

Quote:
Doof gefragt...Was wäre denn dann "nicht proprietär"? :-)
Standardkonform ist eine Implementation von EventTarget::addEventListener(),
wie ich schon erwähnte.

Man könnte jedoch tetrapilotomisch argumentieren, dass selbst
standardisierte Schnittstellen immer einen Ansatzpunkt in der
DOM-Implementation brauchen, der notwendigerweise implementationsspezifisch
und somit proprietär ist. Insofern ist vollständig standardkonformes
DOM-Scripting gar nicht möglich; dies hat jedoch keine praktische Relevanz
und wird daher i.d.R. zu Recht vernachlässigt. Praktisch relevant ist hier
das Verhalten des UAs in Relation zur Spezifikation.


Bitte lies und beherzige <http://oe-faq.de/>; die Aufmachung Deiner Artikel
(diesmal absichtlich nicht korrigiert) ist eine Zumutung für Deine Leser.


PointedEars
--
Quote:
Ich habe mir bereits mehrere Mausverfolger aus dem Netz heruntergeladen.
Bei uns laufen genug Katzen rum, da muß ich mir keinen Mausverfolger
runterladen...
(Georg Maaß in dcljs <b7mnk1$2iafr$2 (AT) ID-3551 (DOT) news.dfncis.de>)


Reply With Quote
  #8  
Old   
Ralf Beutler
 
Posts: n/a

Default Re: "this" in benutzerdefinierten Event-Handlern - 11-09-2007 , 04:44 AM



Andreas Eibach schrieb:
Quote:
tdObj = document.createElement ("TD");
...
tdObj.onmouseover = function () { tuWas( ??? ) }

"this" an der Stelle ??? wäre Unfug, da es sich auf ein ganz anderes
Element beziehen würde!
auf was soll es sich denn beziehen?

Quote:
obj.onmouseover = function (this) { (assign this = param #1 to local
var); call tuWas (local var))
Du willst also dem Eventhandler (der zugewiesen Funktion) zum Zeitpunkt
des Aufrufs noch eine Variable bekannt machen, die obj nicht kennt.
Ich frage mich, warum du da this in der Funktion verwenden willst.

Ist denn die Funktion tuWas eine Methode des Objektes welches du mit
this referenzierst? Oder ist es eine Methode des window Objektes?

Hier mal was zum Probieren:

var me = this;
obj.onmouseover = function(event){
tuWas (event, me);
}

function tuWas(evt, o){
alert(evt.type);
alert(o.theProperty);
}

Wenn der Eventhandler eine Methode eines Objektes[*] ist, dann könnte
ich dir noch einen eleganteren Weg vorschlagen.

---------------
[*] Damit meine ich so ein Konstrukt:

/** Funktionsobjekt */
MyClass = function(){
this.prop = {color:"blue"};
};

/** Methode, die HTMLElemente erzeugt und Eventhandler registiert */
MyClass.prototype.render = function(){
// create o
// ..
registerNodeListener(o,
"mouseover",
this.handleMouseOver.bind(this)
);

};

MyClass.prototype.handleMouseOver = function(event){
// hier soll this auf auf mein Objekt zeigen und nicht auf die Node.
};

br | rb
--
Sie freuten sich riesig, wenn eine Maschine nach sechs Stunden etwas
fertig brachte, wozu jeder Mensch auf der Straße für 2 Cent fähig
gewesen wäre. Anschließend ließen sie sich Bananen- und Sushi-Pizza
kommen und schliefen vor der Tastatur ein. [aus T.P., Heiße Hüpfer]


Reply With Quote
  #9  
Old   
J. Strübig
 
Posts: n/a

Default Re: "this" in benutzerdefinierten Event-Handlern - 11-09-2007 , 04:46 AM



Andreas Eibach schrieb:
Quote:
tdObj = document.createElement ("TD");
...
tdObj.onmouseover = function () { tuWas( ??? ) }

"this" an der Stelle ??? wäre Unfug, da es sich auf ein ganz anderes
Element beziehen würde!
Was meinst du mit ganz anderes Element?
this ist == tdObj

Quote:
Sollte ich gar
tdObj.onmouseover = function (this) { [x] tuWas( ??? ) }
schreiben?
Auf keinen Fall, der erste Parameter einer Eventfunktion ist das
Eventobjekt, zumindest in manchen Browsern.

Struppi.


Reply With Quote
  #10  
Old   
Andreas Eibach
 
Posts: n/a

Default Re: "this" in benutzerdefinierten Event-Handlern - 11-09-2007 , 08:23 AM




"Thomas 'PointedEars' Lahn" <PointedEars (AT) web (DOT) de> wrote:
Quote:
Jetzt sagst du zu attachEvent() _ebenfalls_ "proprietär"!

Gut beobachtet. attachEvent() -- nicht zu velwechsern mit
addEventListener() -- ist eine Methode des MSHTML-DOMs.

Doof gefragt...Was wäre denn dann "nicht proprietär"? :-)

Standardkonform ist eine Implementation von
EventTarget::addEventListener(),
wie ich schon erwähnte.
Jo. War ne Verwechslung: ...Event() mit ...EventListener(). Richtig
erkannt.

Quote:
Man könnte jedoch tetrapilotomisch argumentieren, dass selbst
standardisierte Schnittstellen immer einen Ansatzpunkt in der
DOM-Implementation brauchen, der notwendigerweise
implementationsspezifisch
und somit proprietär ist. Insofern ist vollständig standardkonformes
DOM-Scripting gar nicht möglich;
Davon ging ich auch nicht aus...

Quote:
dies hat jedoch keine praktische Relevanz
und wird daher i.d.R. zu Recht vernachlässigt.
Darf ich?
s/zu Recht/gezwungenermaßen/ :-((
Yes. Weil jeder Browser seinen Stiefel zelebriert.
Naja noch ist nicht alle Hoffnung begraben; zumindest im Layoutbereich
keimt eine auf, welche mit lediglich drei Buchstaben und einer Zahl
beschrieben ist:
CSS3.
Doch was nützen die besten Standards, wenn sie browserseitig nur
rudimentär unterstützt werden!

-Andreas



Reply With Quote
Reply




Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off



Powered by vBulletin Version 3.5.4
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.