getAttribute im IE spinnt
nam
- javascript
Guten Tag!
In einem Script muss ich aus HTML-Tags die Attribute "lang" oder "xml:lang" auslesen. Funktioniert auch prima - nur nicht in meinem <sarkasmus>l_IE_blings</sarkasmus> Browser.
Wenn ich nämlich bei einem TABLE-Element, welches kein 'xml:lang'-Attribut besitzt, genau dieses Abfrage, gibt der IE (6 und 7) nicht den Wert 'null' zurück, wie er es bei allen anderen Elementen tut, sondern wirft den Fehler "Invalid Argument" aus.
Vereinfachter Code um das auszuprobieren: http://www.mnn.ch/IEtest.html
Mach ich was falsch oder tritt der Fehler bei euch (nur im IE) auch auf?
Wenn das ein IE-Bug ist, kann man den bei MS irgendwo einsenden?
es grüsst nam
Hallo,
In einem Script muss ich aus HTML-Tags die Attribute "lang" oder "xml:lang" auslesen. Funktioniert auch prima - nur nicht in meinem <sarkasmus>l_IE_blings</sarkasmus> Browser.
Im Prinzip kann der IE eigentlich gar kein get-/set- oder removeAttribute. Denn statt ein Attribut zu hinzuzufügen, erstellt er eine Eigenschaft.
Das Problem wird in der Objektreferenz von SELFHTML in Abschnitt node > http://de.selfhtml.org/javascript/objekte/node.htm#set_attribute@title=setAttribute kurz beschrieben.
Mach ich was falsch
Nein. Wie immer der IE.
oder tritt der Fehler bei euch (nur im IE) auch auf?
Ich kenne diesen Fehler nur zu gut…
Wenn das ein IE-Bug ist, kann man den bei MS irgendwo einsenden?
k.A., müsstest du mal suchen.
mfg. Daniel
Hallo,
Nachtrag:
Warum greift du nicht mit der http://de.selfhtml.org/javascript/objekte/htmlelemente.htm#universaleigenschaften@title=Universaleigenschaft lang darauf zu? Die müsste sogar unabhängig vom Mime-Type immer den Inhalt des richtigen Attributs repräsentieren.
mfg. Daniel
Hi
Danke für deine Antworten.
Der Zugriff über die Universaleigenschaft lang auf die xml:lang-Eigenschaft gelingt nur eingeschränkt: Bei IE und Firefox gar nicht, bei Safari nur, wenn ich das Dokument als application/xml+xhtml ausliefere.
Ich glaube inzwischen sehr, dass es ein Bug ist, zumal es ja nur beim TABLE-Element so ist.
Weiss jemand einen Link zur MSIE-Bug-Report-Seite? Habe gesucht, aber nichts gefunden (ich finde microsoft.com sehr unübersichtlich).
Hallo,
Der Zugriff über die Universaleigenschaft lang auf die xml:lang-Eigenschaft gelingt nur eingeschränkt: Bei IE und Firefox gar nicht
Kann ich nicht nachvollziehen. Wenn ich auf meiner Seite folgendes in die Adressleiste des Browsers schreibe, kommt eine alert-Meldung mit „de“:
javascript:alert(document.documentElement.lang)
Ich glaube inzwischen sehr, dass es ein Bug ist, zumal es ja nur beim TABLE-Element so ist.
Ich habe mir deine Testseite jetzt mal angeschaut. Wo befindet sich dort eigentlich das lang, bzw. das xml:lang? Selbst Firefox sagt „null“.
Übrigens solltest du das „javascript:“ aus den onclick-Attributen entfernen. Das brauchst du nur, wenn du Code durch Eingabe in die Adresszeile mal schnell testen oder Links für eine JS-Aktionen missbrauchen willst.
mfg. Daniel
Ich habe mir deine Testseite jetzt mal angeschaut. Wo befindet sich dort eigentlich das lang, bzw. das xml:lang? Selbst Firefox sagt „null“.
Nirgends! Das ist ja das Problem, dass IE statt 'null' auszugeben einen Fehler meldet. Mein Script fragt viele Elemente ab, wobei die meisten kein spezielles lang oder xml:lang-Attribut haben.
Übrigens solltest du das „javascript:“ aus den onclick-Attributen entfernen. Das brauchst du nur, wenn du Code durch Eingabe in die Adresszeile mal schnell testen oder Links für eine JS-Aktionen missbrauchen willst.
Ich weiss, es handelt sich hierbei auch nicht um mein Script, sondern um ein sehr vereinfachtes Anschauungsbeispiel, das ich mal schnell so hingeschrieben habe.
Gruss
Mathias
Hi,
Ich weiss, es handelt sich hierbei auch nicht um mein Script, sondern um ein sehr vereinfachtes Anschauungsbeispiel, das ich mal schnell so hingeschrieben habe.
Also von 2 Texten schreibe *ich* denjenigen schneller, bei dem ich 11 überflüssige Buchstaben einsparen kann! ;)
Gruß, Cybaer
Also von 2 Texten schreibe *ich* denjenigen schneller, bei dem ich 11 überflüssige Buchstaben einsparen kann! ;)
Ja! Wer nicht?
Aber wenn ich dabei nichts studiere, gehts noch schneller. :-/
Mathias
Moin
Ich glaube inzwischen sehr, dass es ein Bug ist, zumal es ja nur beim TABLE-Element so ist.
Die Angabe xml:lang kann ich auf einer meiner Testseiten auch im html-Element nicht mittels document.getElementsByTagName("html")[0].lang abfragen, und zwar bei Opera, FF und IE (Mime-Type: text/html)
Gruß
rfb
Hallo,
Guten Tag!
In einem Script muss ich aus HTML-Tags die Attribute "lang" oder "xml:lang" auslesen. Funktioniert auch prima - nur nicht in meinem <sarkasmus>l_IE_blings</sarkasmus> Browser.
Hmm, bist du dir im Klaren, was du da versuchst?
Du hast eine XHTML-Seite als text/html, das bedeutet: Dem Browser ist das ganze XHTML-Gedöhns egal, er wendet durch und durch HTML-Regeln an.
Du setzt jetzt irgendwo ein willkürliches Attribut, das nicht Teil von HTML ist, setzt das Dokument den Browsern das XHTML als HTML vor und wunderst dich, dass ein Browser, der ohnehin nur HTML, nicht XHTML kann, dein willkürliches Attribut nicht korrekt auslesen will, genau dann, wenn es nicht da ist, und das auch nur bei bestimmten Elementen. Ja nee, is klar... ;)
Wieso willst du überhaupt »xml:lang« auslesen - für HTML und HTML-kompatible XHTML-Dokumente ist ohnehin »lang« Pflicht und auch praktisch ratsam.
Wenn ich nämlich bei einem TABLE-Element, welches kein 'xml:lang'-Attribut besitzt, genau dieses Abfrage, gibt der IE (6 und 7) nicht den Wert 'null' zurück, wie er es bei allen anderen Elementen tut, sondern wirft den Fehler "Invalid Argument" aus.
Ja, seltsam - ich glaube nicht, dass es dafür eine rationale Erklärung gibt.
Wenn das ein IE-Bug ist, kann man den bei MS irgendwo einsenden?
Das sind eigentlich bekannte Schwächen. Ganz falsch ist das ja nicht - kein korrektes Attribut darf m.W. im DOM »xml:lang« heißen. getAttribute("xml:lang") ist überhaupt nur ein Workaround für DOM 1 und HTML, welche nicht Namespace-kompatibel sind. Sprich, was du machst, hat das DOM nie offiziell vorgesehen. DOM 2 führt dazu getAttributeNS ein. Das funktioniert allerdings auch nur in XHTML-Dokumenten, die als solche verarbeitet werden - in HTML gibts keine Namespaces. Die übliche Aufregung über IE ist doch etwas künstlich, schließlich gibt es kein zu erwartendes Verhalten.
Mathias
Hallo molily.
DOM 2 führt dazu getAttributeNS ein. Das funktioniert allerdings auch nur in XHTML-Dokumenten, die als solche verarbeitet werden […]
Und das funktioniert? Folgendes ergibt im Opera nur „null“ und im Firefox eine leere Zeichenkette:
javascript:alert(document.documentElement.getAttributeNS("http://www.w3.org/1999/xhtml","lang"))
Die betreffende Ressource wird als application/xhtml+xml ausgeliefert.
Einen schönen Sonntag noch.
Gruß, Mathias
Hallo,
javascript:alert(document.documentElement.getAttributeNS("http://www.w3.org/1999/xhtml","lang"))
Darauf bin ich auch hereingefallen. Das sollte funktionieren, denkt man - dummerweise ist genau das unmöglich:
»Default namespace declarations do not apply directly to attribute names; the interpretation of unprefixed attributes is determined by the element on which they appear. ... The namespace name for an unprefixed attribute name always has no value.«
Namespaces in XML
Das heißt, wenn man <html xmlns="http://www.w3.org/1999/xhtml" lang="de"> schreibt, dann befindet sich »lang« NICHT im XHTML-Namespace! Man müsste vor alle Attribute ausdrücklich Präfixe vorsetzen, also z.B. <xhtml:html xmlns:xhtml="http://www.w3.org/1999/xhtml" xhtml:lang="de">. Erst dann ginge getAttributeNS("http://www.w3.org/1999/xhtml", …). Ansonsten muss man getAttributeNS("", …) nehmen. Damit ist getAttributeNS natürlich ziemlich unbrauchbar, weil man ja nicht weiß, wie die Attribute gerade im Code notiert sind. Man assoziert lang natürlich mit XHTML, aber die Standards tun es nicht - was ich für ziemlich panne halte.
Mathias
Hallo molily.
javascript:alert(document.documentElement.getAttributeNS("http://www.w3.org/1999/xhtml","lang"))
[…]
Das heißt, wenn man <html xmlns="http://www.w3.org/1999/xhtml" lang="de"> schreibt, dann befindet sich »lang« NICHT im XHTML-Namespace!
Mir ging es eigentlich um xml:lang. Verfügt XML über einen Namespace-URI?
Einen schönen Sonntag noch.
Gruß, Mathias
Hallo,
Mir ging es eigentlich um xml:lang.
Wenn du den XHTML-Namensraum angibst, gehe ich natürlich davon aus, du wollest das XHTML-Attribut auslesen. ;)
Verfügt XML über einen Namespace-URI?
Ja: http://www.w3.org/XML/1998/namespace
Mathias
Hallo molily.
Mir ging es eigentlich um xml:lang.
Wenn du den XHTML-Namensraum angibst, gehe ich natürlich davon aus, du wollest das XHTML-Attribut auslesen. ;)
Eh, ja. Nur war mir …
Verfügt XML über einen Namespace-URI?
Ja: http://www.w3.org/XML/1998/namespace
… das hier nicht bekannt. Damit funktioniert es, danke.
Einen schönen Sonntag noch.
Gruß, Mathias
Wieso willst du überhaupt »xml:lang« auslesen - für HTML und HTML-kompatible XHTML-Dokumente ist ohnehin »lang« Pflicht und auch praktisch ratsam.
Weil es Seiten gibt, die xml:lang verwenden und mein Script soll auch damit fertig werden. Konkret geht es um meinen verzweifelten Versuch für HTML eine automatische Silbentrennung in JavaScript zu programmieren.
Diese Silbentrennung kann auch via Bookmarklet aktiviert werden und da muss es mit den verschiedenen Sprachangaben fertig werden (auch mit xml:lang), um die korrekten Trennmuster zu laden (deutsch oder englisch oder französisch). Darum die ganze Aufregung über das seltsame Verhalten des IE.
Das Problem habe ich jetzt allerding mit einem try-catch abgefangen.
Gruss,
Mathias
hi,
Diese Silbentrennung kann auch via Bookmarklet aktiviert werden und da muss es mit den verschiedenen Sprachangaben fertig werden (auch mit xml:lang), um die korrekten Trennmuster zu laden (deutsch oder englisch oder französisch). Darum die ganze Aufregung über das seltsame Verhalten des IE.
Das Problem habe ich jetzt allerding mit einem try-catch abgefangen.
Abgefangen bedeutet funktionierende Lösung, oder einfach nicht-Nutzung des Features im IE?
Wenn ein Workaround gewünscht wäre, und der auch etwas ekligerer Natur sein darf - dann könnte man ja schauen, ob das Attribut in outerHTML eines Knotens auftaucht, und es dort ggf. herausfischen (bspw. RegEx) - wenn das nicht zu sehr auf die Performance geht.
gruß,
wahsaga
Hi
Abgefangen bedeutet funktionierende Lösung, oder einfach nicht-Nutzung des Features im IE?
Wenn ein Workaround gewünscht wäre, und der auch etwas ekligerer Natur sein darf - dann könnte man ja schauen, ob das Attribut in outerHTML eines Knotens auftaucht, und es dort ggf. herausfischen (bspw. RegEx) - wenn das nicht zu sehr auf die Performance geht.
Weder noch und beide;-) Das Problem besteht ja nur, wenn im TABLE-Element KEIN xml:lang-Attribut steht - wenn eines da ist, lesen das alle Browser (auch IE) korrekt aus. Workaround ist also nicht nötig, danke aber trotzdem;-)
So hab ichs gemacht, und das funktioniert jetzt:
function getLang(el) {
if(!el.hasAttribute) { //fuer IE
el.hasAttribute=function(a) {
try {
return (this.getAttribute(a)!='' && this.getAttribute(a)!=null)?true:false; //Dies war die kritische Stelle
} catch(e) {
return false;
}
};
}
if(el.hasAttribute('lang')) {
return el.getAttribute('lang').substring(0,2);
}
if(el.hasAttribute('xml:lang')) {
return el.getAttribute('xml:lang').substring(0,2);
}
return null;
};
Gruss,
Mathias
hi,
Das Problem besteht ja nur, wenn im TABLE-Element KEIN xml:lang-Attribut steht - wenn eines da ist, lesen das alle Browser (auch IE) korrekt aus.
Oh, da habe ich die Problembeschreibung wohl nicht aufmerksam genug verfolgt.
gruß,
wahsaga