[Object HTMLCollection]
Pete
- javascript
Ich versuche über
document.getElementsByTagName
auf die Daten in einem iFrame zuzugreifen.
Bekomme dann (bei Ausgabe durch alert) den
Typ [Object HTMLCollection] zurück.
Welche Methoden kann ich denn jetzt benutzen, um auf das ObjeKt zu zu greifen?
Ich hatte es u.a. mit
document.getElementsByTagName("meta")[0].firstChild.data
document.getElementsByTagName("meta")[0].innerHTML
versucht, was aber beide Male nicht geklappt hat.
Pete
Hi,
Welche Methoden kann ich denn jetzt benutzen, um auf das ObjeKt zu zu greifen?
eine Collection verfügt über eine length-Eigenschaft sowie über Zugriffswege auf ihre einzelnen Elemente. Mehr braucht's nicht. Methoden der von Dir gewünschten Art haben nur besagte Elemente.
document.getElementsByTagName("meta")[0].firstChild.data
In HTML ist es nicht erlaubt, dass <meta>-Elemente Kinder haben.
document.getElementsByTagName("meta")[0].innerHTML
Auch keine Textknoten o.ä.
was aber beide Male nicht geklappt hat.
Natürlich nicht. Vielleicht solltest Du Dir erst mal genau überlegen, was Du eigentlich möchtest, und dann im DHTML-Kapitel von SelfHTML die entsprechenden DOM-Methoden und -Eigenschaften einer Node nachschlagen.
Cheatah
eine Collection verfügt über eine length-Eigenschaft sowie über Zugriffswege auf ihre einzelnen Elemente.
Okay.
In HTML ist es nicht erlaubt, dass <meta>-Elemente Kinder haben.
Mein Fehler. In meinem XML-Dokument habe ich <meta>-tags verwendet ohne zu bedenken, dass das Probleme machen kann. Ich schreibe vor alle Tagname jetzt my_, dass sollte es ja wohl tuen.
Natürlich nicht. Vielleicht solltest Du Dir erst mal genau überlegen, was Du eigentlich möchtest, und dann im DHTML-Kapitel von SelfHTML die entsprechenden DOM-Methoden und -Eigenschaften einer Node nachschlagen.
Ich weiß, was ich will, nur weiß ich nicht wie und welche Mittel mir zur Verfügung stehen. Das was ich hier mache ist learning by doing ;-)
Pete
In HTML ist es nicht erlaubt, dass <meta>-Elemente Kinder haben.
Mein Fehler. In meinem XML-Dokument habe ich <meta>-tags verwendet ohne zu bedenken, dass das Probleme machen kann.
Das macht keine Probleme. Cheatah schrieb »in HTML ist es nicht erlaubt«. In deinem eigenen XML-Derivat ist es freilich erlaubt.
Mathias
Hi,
Mein Fehler. In meinem XML-Dokument habe ich <meta>-tags verwendet ohne zu bedenken, dass das Probleme machen kann.
Das macht keine Probleme. Cheatah schrieb »in HTML ist es nicht erlaubt«. In deinem eigenen XML-Derivat ist es freilich erlaubt.
das ist richtig. Allerdings gebe ich zu bedenken, dass der Browser eine "HTMLCollection" sieht - also offenbar glaubt, HTML vorliegen zu haben. Es scheint also noch etwas Grundsätzliches falsch zu laufen.
Cheatah
Hallo,
Allerdings gebe ich zu bedenken, dass der Browser eine "HTMLCollection" sieht - also offenbar glaubt, HTML vorliegen zu haben. Es scheint also noch etwas Grundsätzliches falsch zu laufen.
Nein, es ist tatsächlich so, dass Gecko eine HTMLCollection zurückgibt, auch wenn es sich nicht um HTML handelt. Das ist höchstens ein Fehler im Gecko. Oder ein Feature, wie man will. Ich sehe es eher als Feature, obwohl es selbstverständlich aus dem Rahmen der Standards fällt.
Auch wenn das Element im XML-Dokument hinzundkunz heißt, liefert getElementsByTagName eine HTMLCollection. Der Unterschied zur NodeList aus DOM Core ist die namedItem-Methode. Und diese existiert auch kurioserweise und lässt sich wie in HTML-Dokumenten benutzen, obwohl das HTML-DOM abgesehen davon freilich nicht verfügbar ist. Es handelt sich ja nur um ein generisches XML-Dokument.
Mathias
Nur mal so für die Anfänger:
Was ist eine HTMLCollection? Und was fange ich damit an?
Pete
Hallo,
Was ist eine HTMLCollection? Und was fange ich damit an?
getElementsByTagName gibt, oh Wunder, eine geordnete Liste mit allen Elementen zurück, die eben diesen Tag-Namen besitzen. Genauer gesagt sind es Elementknoten und die nummerierte Liste ist ein JavaScript-Array.
Wie in SELFHTML erklärt, kannst du die einzelnen Elementknoten in diesem Array über die Nummer ansprechen. Über diesen Elementknoten kannst du dann den Textknoten ansprechen, der am Elementknoten hängt. Darüber hast du Zugriff auf den Textinhalt (z.B. »text« bei <element>text</element>), also die Daten, die dich interessieren.
Diese Zusammenhänge sind alle auf http://de.selfhtml.org/javascript/objekte/node.htm beschrieben, dessen Lektüre dir Cheatah bereits ans Herz gelegt hat.
»HTMCollection« ist der DOM-interne Begriff für eine solche Liste mit Elementknoten. Siehe auch http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-75708506.
Mathias
»HTMCollection« ist der DOM-interne Begriff für eine solche Liste mit Elementknoten. Siehe auch http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-75708506.
Das hatte ich inzwischen auch gefunden. Danke dennoch.
Pete
Hi,
Nein, es ist tatsächlich so, dass Gecko eine HTMLCollection zurückgibt, auch wenn es sich nicht um HTML handelt.
erstaunlich. Danke für die Aufklärung.
Cheatah
hi,
Ich versuche über
document.getElementsByTagName
auf die Daten in einem iFrame zuzugreifen.Bekomme dann (bei Ausgabe durch alert) den
Typ [Object HTMLCollection] zurück.Welche Methoden kann ich denn jetzt benutzen, um auf das ObjeKt zu zu greifen?
die methoden, die dir das jeweilige objekt zur verfügung stellt.
wenn du mit
document.getElementsByTagName("meta")[0]
auf den iframe zugegriffen hast, liegt darunter ja erst einmal document.
gruß,
wahsaga
die methoden, die dir das jeweilige objekt zur verfügung stellt.
Was für ein Objekt habe ich denn vor mir? Es sagt mir nichts und unter SELFHTML habe ich unter HTMLCollection nichts gefunden,
auf den iframe zugegriffen hast, liegt darunter ja erst einmal document.
Es ist das document-Objekt? Dann hangel ich mich da mal weiter.
Pete
document.getElementsByTagName("meta")[0]
auf den iframe zugegriffen hast, liegt darunter ja erst einmal document.
Das klappt aber nicht.
Folgendes Mein iFrame schaut so aus:
<div style="position:absolute;left:0px;top:0px;visibility:hidden;" id="datadiv">
<iframe src="about:blank" height="0" width="0" name="dataframe"></iframe>
</div>
Meine Daten die ich mit dem Befehl
window.frames['dataframe'].window.location.replace(document.f.xml_file.value);
in das iFrame schreibe, schauen so aus:
<my_page>
<my_meta>
<my_author>karlheinz</my_author>
<my_id>3118</my_id>
<my_name>Eingelesenen Daten</my_name>
<my_descr>Diese Daten wurden eingelesen.</my_descr>
</my_meta>
<my_content>
</my_content>
</my_page>
Die Daten wurden durch ein <input type="file"> eingegeben, daher document.f.xml_file.value
Wenn ich jetzt versuche durch
alert(window.frames['dataframe'].window.document.getElementsByTagName("OLELE_meta").all);
mal nach zu schauen, was da ist, bekomme ich undefined zurück, dabei ist doch all ein Unterobjekt von document.
Wie kann ich denn nun auf meine Daten zugreifen?
Ich arbeite übrigens unter MacOSX unter Firefox.
Pete
Hallo,
Meine Daten die ich mit dem Befehl
window.frames['dataframe'].window.location.replace(document.f.xml_file.value);
Oder einfach window.frames['dataframe'].src = document.f.xml_file.value;
in das iFrame schreibe, schauen so aus:
<my_page>
Die »my-«-Präfixe brauchst du nicht.
alert(window.frames['dataframe'].window.document.getElementsByTagName("OLELE_meta").all);
mal nach zu schauen, was da ist, bekomme ich undefined zurück, dabei ist doch all ein Unterobjekt von document.
Nein, nicht gemäß dem W3C-DOM. all kennt Gecko nicht. Du musst mit reinen DOM-Methoden arbeiten. Zum Beispiel (angenommen, my_ wurde aus den Elementnamen herausgenommen):
<iframe name="dataframe" src="test.xml"></iframe>
<script type="text/javascript">
window.onload = function () {
var doc = window.frames['dataframe'].window.document;
var meta = doc.getElementsByTagName('meta').item(0); // erstes meta-Element
var author = meta.getElementsByTagName('author').item(0); // erstes author-Element im meta-Element
var author_text = author.firstChild.data; // Wert des Textknotens im author-Element
alert(author_text);
}
</script>
Mathias
Nein, nicht gemäß dem W3C-DOM. all kennt Gecko nicht. Du musst mit reinen DOM-Methoden arbeiten.
Was sind denn die reinen DOM-Methoden. Ich hatte unter SELFHTML unter dem document-Objekt nachgeschaut und da stand dann auch all. Also bin ich davon ausgegangen, dass das Standard ist.
Ich habe nnun folgendes geschrieben:
window.frames['dataframe'].src = document.f.xml_file.value;
alert(window.frames['dataframe'].window.document.getElementsByTagName('meta').item(0));
Bekomme aber null zurück. =8-/ Woran kanns liegen? Hast du sonst noch eine Idee?
Dennoch danke für deine Ausführliche Hilfe.
Pete
Hallo,
alert(window.frames['dataframe'].window.document.getElementsByTagName("OLELE_meta").all);
mal nach zu schauen, was da ist, bekomme ich undefined zurück, dabei ist doch all ein Unterobjekt von document.
Nein, nicht gemäß dem W3C-DOM. all kennt Gecko nicht. Du musst mit reinen DOM-Methoden arbeiten.
Was sind denn die reinen DOM-Methoden. Ich hatte unter SELFHTML unter dem document-Objekt nachgeschaut und da stand dann auch all.
Erstens behandelt die Objektreferenz vor allem den JavaScript-Zugriff auf HTML-Dokumente, nicht generell auf alle möglichen XML-Dokumente. Nur weil Gecko ein document-Objekt für den Zugriff von HTML-Dokumenten auf XML-Dokumente zur Verfügung steht, heißt es nicht, dass alle Eigenschaften und Funktionen, die in SELFHTML für document beschrieben sind, auch in diesem Fall verfügbar sind.
Zweitens hast du in obigem Code gar nicht document.all angesprochen, sondern document.getElementsByTagName(...).all. Zuerst wird also document.getElementsByTagName(...) ausgeführt und dann das Unterobjekt all des Ergebnisses angesprochen. Und ein solches existiert nicht, weil es sich um einen Array mit Elementknoten handelt.
Drittens ist auf http://de.selfhtml.org/javascript/objekte/all.htm mehrfach erklärt, worum es sich bei document.all handelt: Um ein Konzept von Microsoft, was Gecko/Firefox sowieso nicht unterstützt. Schon gar nicht bei XML-Dokumenten und schon gar nicht bei der Rückgabe von getElementsByTagName.
Mit den reinen DOM-Methoden meinte ich diejenigen Teile des DOM, die für den Zugriff auf alle möglichen XML-Dokumente vorgesehen sind (»Core«). Dazu zählt unter anderem getElementsByTagName sowie die unter http://de.selfhtml.org/javascript/objekte/node.htm beschriebenen.
Also bin ich davon ausgegangen, dass das Standard ist.
Dann musst du gründlicher lesen, so steht das sicher nicht in SELFHTML.
Mathias
Vielen Dank für die Mühe und die ausführliche Auskunft.
Dann musst du gründlicher lesen, so steht das sicher nicht in SELFHTML.
Tja, da hast du wohl recht. Ich habe mich wohl etwas von mir selbst mitreißen lassen und bin oberflächlich geworden.
Also, nochmal Danke Mathias.
Pete
Ich habe jetzt noch
window.frames['dataframe'].window.location.replace(document.f.xml_file.value);
alert(window.frames['dataframe'].document);
ausprobiert und bekomme ein HTMLDocument angezeigt.
Wenn ich jetzt die Abfrage auf
alert(window.frames['dataframe'].document.getElementsByTagName('meta').item(0));
erweitere, bekomme ich nur null zurück. Inzwischen habe ich das Gefühl, dass mein Dokument gar nicht wirklich reingeschrieben wurde, also in meinem iFrame gar nichts steht. Wie kann ich mir den anschauen/abfragen, ob da was steht?
Pete
Hallo,
Ich habe jetzt noch
window.frames['dataframe'].window.location.replace(document.f.xml_file.value);
alert(window.frames['dataframe'].document);
ausprobiert und bekomme ein HTMLDocument angezeigt.
Da kommt bei mir »[object XMLDocument]« (Firefox 0.10.1 Linux).
Wenn ich jetzt die Abfrage auf
alert(window.frames['dataframe'].document.getElementsByTagName('meta').item(0));
erweitere, bekomme ich nur null zurück.
Dann gibt es kein meta-Element in deinem XML-Dokument. Oder das Markup ist fehlerhaft und es kann deshalb nicht ausgelesen werden. Prinzipiell ist der Code richtig.
Inzwischen habe ich das Gefühl, dass mein Dokument gar nicht wirklich reingeschrieben wurde, also in meinem iFrame gar nichts steht. Wie kann ich mir den anschauen/abfragen, ob da was steht?
Indem du ihm eine Größe gibst, es nicht versteckst und schaust, ob Gecko darin ein XML-Elementbaum anzeigt.
Mathias
Wie kann ich mir den anschauen/abfragen, ob da was steht?
Indem du ihm eine Größe gibst, es nicht versteckst und schaust, ob Gecko darin ein XML-Elementbaum anzeigt.
Okay, das habe ich gemacht:
<div style="position:absolute;left:0px;top:0px;visibility:visible;" id="datadiv">
<iframe src="../about.html" height="200" width="100" name="dataframe">HALLO</iframe>
</div>
Und habe zunächst eine andere Seite von mir eingebunden, damit ich überhaupt den iFrame mal sehe.
Dann habe ich meine Datei ausgewählt und den Pfad an die folgende Funktion übergeben:
function transferPageData(){
if (document.f.xml_file.value=="") {
alert("Es wurde noch keine XML-Datei ausgesucht.");return;
}
window.frames['dataframe'].src = document.f.xml_file.value;
alert(window.frames['dataframe'].src);
}
Die Anzeige im iFrame ändert sich aber nicht, der src aber schon. Es wird als src die ausgewählte Datei angezeigt.
Pete
Indem du ihm eine Größe gibst, es nicht versteckst und schaust, ob Gecko darin ein XML-Elementbaum anzeigt.
Okay, das hatte alles nicht funktioniert, deswegen habe ich noch ein normales Frame in meinem Frameset erzeugt und schreibe das File nun dort hinein. Allerdings interpretiert er das ganze dann als HTML und nicht als XML, was man auch an folgender Ausgabe erkennt (Wenigstens sehe ich jetzt mein XML):
var doc = top.bottom.document;
alert(doc); //Hier bekomme ich HTMLDocument
var meta = doc.getElementsByTagName('my_meta').item(0); // erstes meta-Element
alert(meta); //Hier kommt dann schon null
var author = meta.getElementsByTagName('my_author').item(0); // erstes author-Element im meta-Element
alert(author);
var author_text = author.firstChild.data; // Wert des Textknotens im author-Element
alert(author_text);
Das Ganze bricht dann mit "meta has no properties" ab. Ich müsste ihm also nur klar machen, dass er ein XML-File bekommen hat. Frage ist nur, wie ich das mache.
Pete
Also, letzter Versuch für heute:
Habe meine XML-Datei als
<object data="test.xml" type="text/xml">
eingebunden.
In test.xml steht:
<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/css" href="./css/leer.css" ?>
<my_page>
<my_meta>
<my_author>karlheinz</my_author>
<my_id>3118</my_id>
<my_name>Eingelesenen Daten</my_name>
<my_descr>Diese Daten wurden eingelesen.</my_descr>
</my_meta>
<my_content>
</my_content>
</my_page>
Die Seite wird in dem normalen Frame auch angezeigt. Aber ich kann nicht auf die Daten zugreifen.
var doc = top.bottom.document;
alert(doc); //Liefert immer noch HTMLDocument
var meta = doc.getElementsByTagName('my_meta').item(0); // erstes meta-Element
alert(meta); //Liefert null
Kann ich überhaupt so irgendwie darauf zugreifen?
Pete
Hallo,
keine Ahnung, wo der Fehler liegt. Die von dir geposteten Beispiele (iframe, object) funktionieren bei mir problemlos.
In test.xml steht:
<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/css" href="./css/leer.css" ?>
Wenn das so verknüpfte Stylesheet nicht existiert, bekomme ich keinen Zugriff auf die Elemente. Stimmt der Pfad? Wenn das Stylesheet leer ist, fülle es mal mit sinnvollen Angaben oder nehme es testweise heraus. Vielleicht klappt dann der Elementzugriff.
Ansonsten wüsste ich nicht, woran es liegen könnte, ohne den gesamten Code zu sehen. Hast du darauf geachtet, dass das Abfragen erst nach dem fertigen Laden des XML-Dokuments passiert (onload)? Bei größeren Dokumenten könnte das relevant sein.
Mathias
Wenn das so verknüpfte Stylesheet nicht existiert, bekomme ich keinen Zugriff auf die Elemente. Stimmt der Pfad?
Ohne css-Datei habe ich eine Fehlermeldung bekommen. Der Pfad stimmt übrigens.
Wenn das Stylesheet leer ist, fülle es mal mit sinnvollen Angaben oder nehme es testweise heraus. Vielleicht klappt dann der Elementzugriff.
Ansonsten wüsste ich nicht, woran es liegen könnte, ohne den gesamten Code zu sehen. Hast du darauf geachtet, dass das Abfragen erst nach dem fertigen Laden des XML-Dokuments passiert (onload)? Bei größeren Dokumenten könnte das relevant sein.
Ich habe es nicht mit onload gemacht. Allerdings ist das Dokument auch klein.
Liegt es vielleicht daran, das ich das Ganze lokal ohne Server mache?
Pete