HighDots Forums  

javascirpt Problem ?!

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


Discuss javascirpt Problem ?! in the Javascript (German) forum.



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

Default javascirpt Problem ?! - 10-03-2009 , 03:45 PM






Kann mir wer sagen warum das untere Script einmal DIV und dann
"undefined" bringt ?!

<html>
<head>
<script type="text/javascript">
function go2(x)
{
alert(x.parentElement.firstChild.tagName);
alert(x.parentElement.lastChild.tagName);
}
</script>
</head>
<body>
<div>
<div onclick="javascript:go2(this);">This is a DIV</div>
<input type="text" />
</div>
</body>
</html>

Reply With Quote
  #2  
Old   
Holger Jeromin
 
Posts: n/a

Default Re: javascirpt Problem ?! - 10-03-2009 , 04:03 PM






UnTo schrieb am 03.10.2009 21:45:
Quote:
Kann mir wer sagen warum das untere Script einmal DIV und dann
"undefined" bringt ?!
Tut es das? Im opera und Firefox gibts zweimal undefined :-)

Quote:
html
head
script type="text/javascript"
function go2(x)
{
alert(x.parentElement.firstChild.tagName);
alert(x.parentElement.lastChild.tagName);
}
/script
/head
body
div
div onclick="javascript:go2(this);">This is a DIV</div
input type="text" /
/div
/body
/html
Liegt im FF daran, dass sogar parentElement undefined ist...

ein parentNode liefert dir dein Div, firstChild und lastChild dann deine
Zeilenumbrüche, die aber kein tagName haben.

Im IE triffst du mit lastChild deinen Zeilenumbruch.

<div><div onclick="javascript:go2(this);">This is a DIV</div><input
type="text" /></div>

erzeugt im IE dein gewünschtes...

Bedenke es gibt mehr als den IE... und ordentliche Debugtools auch.

--
Mit freundlichen Grüßen
Holger Jeromin

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

Default tagName-Eigenschaft liefert "undefined" (was: javascirpt Problem ?!) - 10-03-2009 , 04:23 PM



UnTo wrote:
^^^^
An dieser Stelle sollte Dein richtiger Name stehen, wenn Du hier weiterhin
ernstgenommen werden willst.

Quote:
Subject: javascirpt Problem ?!
<kopfschuettel>
Hätte der Betreff nicht noch ein wenig weniger aussagekräftig ausfallen
können?
</kopfschuettel>

Quote:
Kann mir wer sagen warum das untere Script einmal DIV und dann
"undefined" bringt ?!
^^^
Deine Fragezeichen-Taste ist kapott und Du plenkst. Bitte abstellen.

Quote:
html
head
script type="text/javascript"
function go2(x)
{
alert(x.parentElement.firstChild.tagName);
alert(x.parentElement.lastChild.tagName);
^^^^^^^^^^^^^
Korrekt muss es

window.alert(x.parentNode.firstChild.tagName);

usw. heissen. Jedoch deutet `parentElement' darauf hin, dass Du den einen
MSHTML-basierten Browser wie z.B. Internet Explorer zum Test verwendest (das
nächste Mal bitte Laufzeitumgebung angeben!), da es AFAIK nur im
proprietären MSHTML-DOM eine parentElement-Eigenschaft gibt.

Entsprechend ist dann auch die erwartete Normalisierung von Whitespace-
Textknoten; während der erste Whitespace-Textknoten wegnormalisiert wird, so
wird der letzte nicht wegnormalisiert.

In Deinem Beispiel wird `x' mit `this' eine Referenz auf das Element-Objekt
zugewiesen, welches das angeklickte DIV-Element representiert. Dessen
`parentElement' ist ein weiteres DIV-Element. Dessen erster Kindknoten ist
nach Normalisierung der Knoten des angeklickten DIV-Elements selbst. Jedoch
ist dessen letzter Kindknoten nach Normalisierung ein Whitespace-Textknoten
(und nicht der INPUT-Elementknoten); das Objekt, welches diesen Textknoten
im DOM repräsentiert, hat keine tagName-Eigenschaft, da es kein
Elementobjekt ist.

Der Zugriff auf nicht existierende Eigenschaften hat normalerweise als
Ergebnis den undefined-Wert (bei Host-Objekten kann es hier jedoch
definitionsgemäss Abweichungen geben). Die String-Repräsentation dieses
Wertes (wegen window.alert(), welches aller Erfahrung nach Typkonvertierung
nach String vornimmt) ist "undefined".

Quote:
}
/script
/head
body
div
div onclick="javascript:go2(this);">This is a DIV</div
`javascript:' ist in einem Event-Handler-Attributwert im allgemeinen nur ein
Label (LabelledStatement) und daher redundant (denn Labels dienen als
Sprungmarken, und hier fe lt die entsprechende continue-Anweisung). Nur in
MSHTML steht dieses Label für die Script-Sprache, weil es neben JScript auch
noch VBScript unterstützt. Falls Du zuvor nicht VBScript eingesetzt hast
(wovon im Web dringend abzuraten ist), wird das fehlerträchtige Label nicht
benötigt.

Quote:
input type="text" /
Dein Quelltext ist eher (ungültiges) HTML als (ungültiges) XHTML; deklariere
daher HTML und entferne den `/'. `type="text"' ist ausserdem redundant,
denn "text" ist der Anfangswert des type-Attributs (siehe DTD).

<http://validator.w3.org/>

Alles in allem solltest Du Dich vor weiteren Aktionen unbedingt genauer mit
den Grundlagen auseinandersetzen:

<http://dcljs.de/>


HTH

PointedEars

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

Default Re: javascirpt Problem ?! - 10-05-2009 , 01:47 PM



Holger Jeromin wrote:

Quote:
UnTo schrieb am 03.10.2009 21:45:
Kann mir wer sagen warum das untere Script einmal DIV und dann
"undefined" bringt ?!

Tut es das? Im opera und Firefox gibts zweimal undefined :-)

[...]
alert(x.parentElement.firstChild.tagName);
alert(x.parentElement.lastChild.tagName);
[...]

Liegt im FF daran, dass sogar parentElement undefined ist...
Das kann nicht sein. Wenn der Zugriff auf

x.parentElement.firstChild.tagName

möglich ist, so muss

x.parentElement

ein Objekt referenzieren (kann also nicht `undefined' sein). Andernfalls
führte

alert(x.parentElement.firstChild.tagName);

nicht zu Anzeige von "undefined", sondern zu einem Laufzeitfehler
("TypeError: x.parentElement is undefined").

Es ist hingegen zu erwarten, dass mit diesem Markup ohne DOCTYPE-Deklaration
der Quirks Mode von Gecko verwendet wird, in dem auch proprietäre
Eigenschaften des MSHTML-DOM zumindest teilweise unterstützt werden.

Quote:
ein parentNode liefert dir dein Div, firstChild und lastChild dann deine
Zeilenumbrüche, die aber kein tagName haben.

Im IE triffst du mit lastChild deinen Zeilenumbruch.
Das ist übersimplifiziert.

Der "Zeilenumbruch" besteht mindestens aus einem Newline-Zeichen, wegen IE
(und daher WinDOS) wahrscheinlich mindestens aus <CR><LF>. Möglich sind
aber noch weitere nichtdruckbare Zeichen, die daher unter "Whitespace"
subsumiert werden. Entscheidend ist, dass es sich hierbei um einen
Textknoten handelt.

Ausserdem ist das Verhalten nicht browserabhängig, sondern abhängig von der
Layout-Engine, hier MSHTML. Dasselbe Verhalten könnte man auch in Netscape
8 oder IE Tab in Firefox beobachten. Von den vielen anderen
Benutzerprogrammen, welche die MSHTML-Browserkompontente verwenden, mal ganz
abgesehen.


PointedEars

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.