HighDots Forums  

Diese Art der click() methode geht im IE, aber nicht im FF

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


Discuss Diese Art der click() methode geht im IE, aber nicht im FF in the Javascript (German) forum.



Reply
 
Thread Tools Display Modes
  #1  
Old   
Thomas Steinbach
 
Posts: n/a

Default Diese Art der click() methode geht im IE, aber nicht im FF - 07-03-2009 , 12:44 AM






Hallo,

folgender Codschnipsel funktioniert bei mir im IE gut

---snip---
siehe <a class="cl" href="#" onclick="javascript:helo.click(); return
false;">IndirectClick</a>
lalala gaaanz viel Text
<a id="helo" class="cl" href="#" title="this link"
onclick="javascript:myfunc('foo','bar'); return false;">DirectClick</a>
---snap---

aber Firebug in FF meint das "

Error: helo is not defined
Source File: http://localhost/test.htm#/event/[cryptischer_string]
Line: 3

helo nicht definiert sei.

Was laeuft hier nicht "richtig" und wie bekomme ich das auch
im FF zum laufen?


Thomas

Reply With Quote
  #2  
Old   
Christian Kirsch
 
Posts: n/a

Default Re: Diese Art der click() methode geht im IE, aber nicht im FF - 07-03-2009 , 03:56 AM






Thomas Steinbach schrieb:
Quote:
Hallo,

folgender Codschnipsel funktioniert bei mir im IE gut

---snip---
siehe <a class="cl" href="#" onclick="javascript:helo.click(); return
false;">IndirectClick</a
lalala gaaanz viel Text
a id="helo" class="cl" href="#" title="this link"
onclick="javascript:myfunc('foo','bar'); return false;">DirectClick</a
---snap---

aber Firebug in FF meint das "

Error: helo is not defined
Source File: http://localhost/test.htm#/event/[cryptischer_string]
Line: 3

helo nicht definiert sei.

Was laeuft hier nicht "richtig" und wie bekomme ich das auch
im FF zum laufen?
Du möchtest also - was Dir offenbar zu viel war, zu erklären - folgendes
erreichen:

Wenn jemand auf einen Link klickt, soll der Onclick-Eventhandler eines
anderen Links ausgelöst werden?

Mal angenommen, das beschreibe Deine Intentionen.

Dann könnte Dein Beispiel m.E. nur funktionieren, wenn "helo" eine
globale JS-Variable wäre. Die sehe ich aber nicht (was vielleicht daran
liegt, dass Du kein komplettes Beispiel, sondern nur nicht-lauffähige
Auszüge lieferst).

Außerdem müsste click() eine an einem Anchor definierte Methode sein,
was möglicherweise nicht so ist:
http://www.meb.uni-bonn.de/java/methods.html#click_method

Und dann gibt es da wohl noch Browser-Feinheiten:

http://www.experts-exchange.com/Programming/Languages/Scripting/JavaScript/Q_21300994.html

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

Default Re: Diese Art der click() methode geht im IE, aber nicht im FF - 07-03-2009 , 05:27 AM



Christian Kirsch wrote:
Quote:
Thomas Steinbach schrieb:
folgender Codschnipsel funktioniert bei mir im IE gut

---snip---
siehe <a class="cl" href="#" onclick="javascript:helo.click(); return
false;">IndirectClick</a
lalala gaaanz viel Text
a id="helo" class="cl" href="#" title="this link"
onclick="javascript:myfunc('foo','bar'); return false;">DirectClick</a
Dass das sowohl von der Syntax als auch der Usability her völliger Müll ist,
und wie es besser geht, ergibt sich nach kurzem Nachdenken und ein wenig
Recherche (inkl. FAQ) von selbst. Hint: Was machen Nutzer ohne JavaScript?

Quote:
---snap---

aber Firebug in FF meint das "

Error: helo is not defined
Source File: http://localhost/test.htm#/event/[cryptischer_string]
Line: 3

helo nicht definiert sei.

Was laeuft hier nicht "richtig" und wie bekomme ich das auch
im FF zum laufen?

[...]
Dann könnte Dein Beispiel m.E. nur funktionieren, wenn "helo" eine
globale JS-Variable wäre. Die sehe ich aber nicht (was vielleicht daran
liegt, dass Du kein komplettes Beispiel, sondern nur nicht-lauffähige
Auszüge lieferst).
Es gibt hier ein Element mit ID "helo".

Uraltes und immer wieder auftretendes Problem: IEs MSHTML erzeugt für
Elemente mit id-Attribut und/oder name-Attribut Eigenschaften eines
Host-Objekts in der Scope Chain mit dem Attributwert als Name. Andere
Laufzeitumgebungen (z.B. Firefox's Gecko) tun das nicht.

Uralte und immer wieder genannte Lösung: Elemente über
document.getElementById(...) und document.getElementsByName(...)
referenzieren. Dabei aber beachten, dass diese in MSHTML zusätzlich kapott
implementiert sind: gEBI() liefert auch Elemente mit nur einem
name-Attribut (jedoch immer nur das erste) und gEsBN() liefert auch Elemente
mit nur einem id-Attribut. Also das Markup nötigenfalls geeignet anpassen.

Diese Eigenart von MSHTML sollte wohl den Zugriff auf Elementobjekte
vereinfachen, führt jedoch in der Praxis immer wieder nur zu Problemen.
Zusätzlich zu den genannten Problemen mit standardkonformen Methodenaufrufen
darf es keine Zuweisungen an noch nicht-existierende Eigenschaften des
Globalen Objekts geben, welche denselben Namen wie eine ID oder ein
Elementname haben; in diesem Beispiel führte also

helo = "foo";

zu einem Laufzeitfehler,

var helo = "foo";

jedoch nicht (einmal wird der Name über die Scope Chain aufgelöst bis hin zu
dem genanntem unbekannten Host-Objekt, einmal nicht.)


PointedEars
--
var bugRiddenCrashPronePieceOfJunk = (
navigator.userAgent.indexOf('MSIE 5') != -1
&& navigator.userAgent.indexOf('Mac') != -1
) // Plone, register_function.js:16

Reply With Quote
  #4  
Old   
Gregor Kofler
 
Posts: n/a

Default Re: Diese Art der click() methode geht im IE, aber nicht im FF - 07-03-2009 , 06:06 AM



Thomas Steinbach meinte:
Quote:
Hallo,

folgender Codschnipsel funktioniert bei mir im IE gut

---snip---
siehe <a class="cl" href="#" onclick="javascript:helo.click(); return
false;">IndirectClick</a
lalala gaaanz viel Text
a id="helo" class="cl" href="#" title="this link"
onclick="javascript:myfunc('foo','bar'); return false;">DirectClick</a
---snap---

aber Firebug in FF meint das "

Error: helo is not defined
Source File: http://localhost/test.htm#/event/[cryptischer_string]
Line: 3

helo nicht definiert sei.

Was laeuft hier nicht "richtig" und wie bekomme ich das auch
im FF zum laufen?
Durch richtiges skripten?

Wurde schon zillionenmal durchgekaut: Der IE legt für Elemente mit einer
id oder einem name Attribut eine globale Variable die eine Referenz auf
dieses Element enthält an. Andere Browser idR nicht.

d.h. dein <a id="helo"> erzeugt eine globale Variable im IE. Deshalb
wird auch im anderen Inline-Listener eine helo-Objekt gefunden (im
lokalen Scope kein "helo" -> Suche -> "helo" im globalen Scope wird
verwendet).

Richtig macht man es, indem man eine korrekte Identifizierung des
Elementes macht. In deinem Fall z.B. per document.gEBI()

Gregor

Die "javascript:..." labels in den inline-Listenern sind übrigens
überflüssig.


--
http://www.gregorkofler.com
http://web.gregorkofler.com - vxJS, a JS lib in progress

Reply With Quote
  #5  
Old   
Christian Kirsch
 
Posts: n/a

Default Re: Diese Art der click() methode geht im IE, aber nicht im FF - 07-03-2009 , 06:15 AM



Thomas 'PointedEars' Lahn schrieb:

Quote:
Uraltes und immer wieder auftretendes Problem: IEs MSHTML erzeugt für
Elemente mit id-Attribut und/oder name-Attribut Eigenschaften eines
Host-Objekts in der Scope Chain mit dem Attributwert als Name. Andere
Laufzeitumgebungen (z.B. Firefox's Gecko) tun das nicht.

Wieder was gelernt - wer immer nur mit FF rumspielt, lebt wohl auf einer
Art Insel der Seligen. Danke auch für das (hier nicht zitierte Beispiel)
mit der globalen Variablen im eigenen Script. Dass man sich im IE auf so
subtile Weise in den Fuß schießen kann, war mir auch neu.

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

Default Re: Diese Art der click() methode geht im IE, aber nicht im FF - 07-03-2009 , 07:58 AM



Gregor Kofler wrote:
Quote:
Wurde schon zillionenmal durchgekaut: Der IE legt für Elemente mit einer
id oder einem name Attribut eine globale Variable die eine Referenz auf
dieses Element enthält an. Andere Browser idR nicht.

d.h. dein <a id="helo"> erzeugt eine globale Variable im IE.
Ähem, nein. Wie Du bereits wissen solltest¹:

Erzeugt wird (in _MSHTML_) eine (nicht änderbare) Eigenschaft eines
(Host-)Objekts in der Kette der Gültigkeitsbereiche (scope chain). Diese
Kette wird für die Namensauflösung verwendet. (Bei der Eigenschaft könnte
es sich jedoch auch um eine nicht änderbare host-definierte Eigenschaft des
Globalen Objekts handeln; AFAICS unmöglich, das herauszufinden.)

Der Zugriff auf diese Eigenschaft sieht ungefähr so aus²:

Schritt 1: Namensauflösung ("Scope Chain and Identifier Resolution")

---> helo
Quote:
'-> Variablenobjekt des Attributwertkontextes:
hat keine Eigenschaft mit diesem Namen, weiter --.
,- - - - - - - - - - - - - - - - - - - - - - - - - --'
'-> weitere Objekte in der Scope Chain, z.B. form- und
document-Objekte: haben keine Eigenschaft mit diesem Namen,
jeweils weiter --.
,- - - - - - - - - --'
'-> unbekanntes Host-Objekt:
hat eine Eigenschaft mit diesem Namen
Quote:
v
<--- Referenztupel (Host-Objekt, "helo")

Alternative: hat die Eigenschaft nicht, weiter --.
,------------------------------------------------------'
'-> Globales Objekt:
hat eine Eigenschaft mit diesem Namen
(z.B. eine globale Variable)
Quote:
v
<--- (global, "helo")

Alternative: hat eine solche Eigenschaft nicht
Quote:
v
<--- (null, "helo")


Schritt 2: Eigenschaftswert auslesen ("GetValue")

---> (Host-Objekt, "helo")
Quote:
v
1. Überprüfen, ob Eingabe eine Referenz ist;
wenn nein
Quote:
v
<------ Eingabe

sonst (hier): weiter

2.+3. Basisobjekt der Referenz (erstes Element des Tupels ermitteln);
wenn null: Abbruch, ReferenceError-Exception werfen

sonst (hier): weiter

4. [[Get]]-Methode des Basisobjekts aufrufen, um
den Wert der Eigenschaft über ihren Namen (hier: "helo")
zu ermitteln
Quote:
v
<------ Eigenschaftswert := Rückgabewert von [[Get]]

Im Unterschied dazu ist eine globale Variable immer eine Eigenschaft
des Globalen Objekts (am Ende dieser Kette), welche i.d.R. geändert,
aber niemals gelöscht werden kann.


Deine Schlussfolgerungen aus Deiner Erklärung sind aber richtig
(Merke: ex falso quodlibet ;-)).


PointedEars, besser mal weiter für die morgige Logik-Prüfung lernend
(kein Scherz!)
___________
¹ Die Erfahrung zeigt: Übersimplifizierung schadet letztendlich eher.
² Vgl. [en] ECMAScript Language Specification, Edition 3 Final,
Abschnitt 10, vor allem Unterabschnitte 10.4 "Scope Chain and
Identifer Resolution", und 8.7.1 "GetValue (V)".
--
Der erfahrene IE-Fahrer weiß, daß man Slalom am besten im ersten Gang fährt,
weil schnelles Lenkradumreißen bei IE zum Lenkradabreißen führt. Wer
sportlich fahren will, muß Netscape fahren und hin und wieder auch mal
anschieben. ;-) --Georg Maaß, dcljs, <amuqrl$91i3q$1 (AT) ID-3551 (DOT) news.dfncis.de>

Reply With Quote
  #7  
Old   
Thomas Steinbach
 
Posts: n/a

Default Re: Diese Art der click() methode geht im IE, aber nicht im FF - 07-03-2009 , 03:42 PM



Hallo Thomas,

Quote:
[...]
[...]
Dass das sowohl von der Syntax als auch der Usability her völliger Müll
ist,
und wie es besser geht, ergibt sich nach kurzem Nachdenken und ein wenig
Recherche (inkl. FAQ) von selbst. Hint: Was machen Nutzer ohne
JavaScript?
Also mir ist es trotz Nachdenken und FAQ nicht klar.
Was ist denn hier einen "nichtmuellige" Usability?
Was waere denn die "nichtmuellige" Syntax?

Kannst du das an einem (eventuell diesem) Beispiel mal konkret "zeigen"
was hier eine "richtige" usability und "richtige" syntax ist?

Quote:
[...]
Dann könnte Dein Beispiel m.E. nur funktionieren, wenn "helo" eine
globale JS-Variable wäre. Die sehe ich aber nicht (was vielleicht daran
liegt, dass Du kein komplettes Beispiel, sondern nur nicht-lauffähige
Auszüge lieferst).

Es gibt hier ein Element mit ID "helo".
Ja und darueber geht es dann letztenldich auch mit getelementbyid und
deklarieren einer globalen variable.

Quote:
Uraltes und immer wieder auftretendes Problem: IEs MSHTML erzeugt für
Elemente mit id-Attribut und/oder name-Attribut Eigenschaften eines
Host-Objekts in der Scope Chain mit dem Attributwert als Name. Andere
Laufzeitumgebungen (z.B. Firefox's Gecko) tun das nicht.
Ja, wirkt alles erstmal etwas "umstaendlich".

Prinzipell laueft es jetzt auch im FF, aber ich wuerde das gerne
noch verallgeieiner indem ich einfach alle a tags abgrase
und dann fuer die NAMEs oder IDs auch globale Variablen deklariere.

Das Problem ist das ich z.B. ueber GetElemtnsByTagName
an die "name" Attribute und Inhalte komme, aber dann ein Problem
habe, wenn ich diese "name" Inhalte als Variable deklarieren will.

Geht sowas in JavaScript ueberhaupt?

Quote:
[...]
Thomas

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

Default Re: Diese Art der click() methode geht im IE, aber nicht im FF - 07-03-2009 , 07:40 PM



Thomas Steinbach wrote:
Quote:
Hallo Thomas,
^

Lass das bitte und ergänze stattdessen den Autor/die Autoren des Zitierten.

,----------------------------------------'
vvvvvvvvvv
Quote:
[...]
[...]
Dass das sowohl von der Syntax als auch der Usability her völliger Müll
Ja, so ungefähr hab' ich mir Müll vorgestellt ;-) (Siehe unten.)

Quote:
ist,
und wie es besser geht, ergibt sich nach kurzem Nachdenken und ein wenig
Recherche (inkl. FAQ) von selbst. Hint: Was machen Nutzer ohne
JavaScript?

Also mir ist es trotz Nachdenken und FAQ nicht klar.
Was ist denn hier einen "nichtmuellige" Usability?
Was waere denn die "nichtmuellige" Syntax?

Kannst du das an einem (eventuell diesem) Beispiel mal konkret "zeigen"
was hier eine "richtige" usability und "richtige" syntax ist?
Sicher. Was genau hast Du denn an den Beispielen in der FAQ nicht verstanden?

Quote:
[...]
Es gibt hier ein Element mit ID "helo".

Ja und darueber geht es dann letztenldich auch mit getelementbyid und
deklarieren einer globalen variable.
Was Du aber nicht machen willst.

Quote:
Uraltes und immer wieder auftretendes Problem: IEs MSHTML erzeugt für
Elemente mit id-Attribut und/oder name-Attribut Eigenschaften eines
Host-Objekts in der Scope Chain mit dem Attributwert als Name. Andere
Laufzeitumgebungen (z.B. Firefox's Gecko) tun das nicht.

Ja, wirkt alles erstmal etwas "umstaendlich".
Umgekehrt wird ein Schuh draus: Normalerweise kommt man nicht auf solche ...
Ideen wie Du.

Quote:
Prinzipell laueft es jetzt auch im FF, aber ich wuerde das gerne
noch verallgeieiner indem ich einfach alle a tags abgrase
und dann fuer die NAMEs oder IDs auch globale Variablen deklariere.
Nein, das willst Du ganz sicher nicht. Es ist auch wahrscheinlich nicht nötig.

Quote:
Das Problem ist das ich z.B. ueber GetElemtnsByTagName
an die "name" Attribute und Inhalte komme, aber dann ein Problem
habe, wenn ich diese "name" Inhalte als Variable deklarieren will.

Geht sowas in JavaScript ueberhaupt?
Du kannst nicht gleichzeitig mit derselben Referenz zwei unterschiedliche
Eigenschaften ansprechen. Du kannst aber das globale Objekt direkt
referenzieren. RTFM.

Dein Newsreader ist offenbar kapott. Ich hatte (so wie immer) UTF-8
deklariert und verwendet; Dein Newsreader hat einfach weiter mit ISO-8859-1
gepostet, ohne den Versuch der Transformation des Inhalts vorzunehmen.
Zudem erzeugt er schlecht lesbares Kammquoting. Du solltest jetzt gleich
de.test benutzen, wo man Dir möglicherweise sagen kann, wie Du das
reparieren kannst.


PointedEars
--
Anyone who slaps a 'this page is best viewed with Browser X' label on
a Web page appears to be yearning for the bad old days, before the Web,
when you had very little chance of reading a document written on another
computer, another word processor, or another network. -- Tim Berners-Lee

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 - 2009, Jelsoft Enterprises Ltd.