IE: ungültiges Argument

Hallo,

Ich bin gerade dabei mittels JS ein XML-File umzuwandeln und dann im A4-Format anzuzeigen.
Da man nun aber nicht annehmen kann, dass bei jedem das selbe Element gleich viel Platz benötigt, muss ich da jeweils beim Seitenumbruch manuell eine “neue seite” generieren und das Element, welches zuviel Plazt benötigt auf die nächste Seite nehmen.
Bis hier hin einigermassen klar, um was es geht?

Also habe ich mir eine Funktion geschrieben, die eine Seite erzeugt. Nach jedem einzelnen Element wird also nun überprüft, ob die Seite nun zu lange ist. Falls dies der Fall ist, wird das Element wieder entfernt und auf der neuen Seite erneut “generiert”.
Javascript:

function addPage() { var doc = request.responseXML.firstChild; var page = document.createElement("div"); var state = document.createElement("div"); var container = document.createElement("div"); state.appendChild(container); page.setAttribute("class", "page"); page.appendChild(state); root.appendChild(page); while(container.offsetHeight < state.offsetHeight) { container.appendChild(doc.childNodes[i].cloneNode(true)); i++; if(doc.childNodes.length < i) return(true); } var elem = container.lastChild; container.removeChild(elem); //IE i--; return addPage(); }

Wie wahrscheinlich zu erwarten ist, funktioniert alles im FF wunderbar. Der Seitenumbruch ist da, wo er sein soll und das Element ist auch erst auf der nächsten Seite.
Nun aber zum IE. Wie der IE mir immer solche “klugen” Fehlermeldungen macht, schreibt er dieses mal auch nur ungültiges Argument. Im obigen Code ist die Zeile mit //IE vermerkt. Das Zeichen 2 ist betroffen, also das c von container.

Bei näherem betrachten fällt auf, dass dieser Fehler 3 mal auftritt (die function addPage wird 3 mal erfolgreich ausgeführt, kann man im DOM nachsehen. Jedoch sind die Seiten leer.

:unamused: Nun, meine Frage, ob mir jemad helfen kann.

mfg Joey

EDIT: habs hochgeladen: http://bcg.bplaced.net/docs

FireBug meldet mir bei deinem Beispiel

request.responseXML is null http://bcg.bplaced.net/docs/document.js Line 40 doc.childNodes[i] is undefined http://bcg.bplaced.net/docs/document.js Line 49

  • weil du nicht mal abwartest, bis das XML-Dokument geladen wurde.

Selbst wenn ich den Fehler beseitige, bleibt’s aber dabei, dass

var elem = container.lastChild;

irgendwann null liefert, weil der container einfach keine Kindelemente hat - und das kracht dann in der nächsten Zeile,

container.removeChild(elem);

natürlich …

[Exception... "Component returned failure code: 0x80004003 (NS_ERROR_INVALID_POINTER) [nsIDOMHTMLDivElement.removeChild]"  nsresult: "0x80004003 (NS_ERROR_INVALID_POINTER)"  location: "JS frame :: http://... :: addPage :: line 54"  data: no]

[quote]FireBug meldet mir bei deinem Beispiel[/quote]Komisch, bei mir klappte es ohne Meldungen :astonished: :smiley:

[quote]irgendwann null liefert, weil der container einfach keine Kindelemente hat - und das kracht dann in der nächsten Zeile,[/quote]Sieht so aus. (Im IE im Entwicklertool, da is tatsächlich kein Kind drinne.) Aber wieso? o.0
Schliesslich wird ja vorher einige male container.appendChild(doc.childNodes[i].cloneNode(true)); ausgeführt, was dann auch zu einigen Kindelementen Führen sollte, oder irre ich mich da? Zumindest im FF funktioniert dies ja tadellos…

Nun, ich überprüf mal, ob das XML-Dokument überhaupt Kindelemente zu klonen hat:

function addPage() { if(request.readyState != 4) return false; //abwarten bis request vollständig geladen ist var doc = request.responseXML.firstChild; var page = document.createElement("div"); var state = document.createElement("div"); var container = document.createElement("div"); state.appendChild(container); page.setAttribute("class", "page"); page.appendChild(state); root.appendChild(page); if(doc.childNodes.length == 0) return false; //Hier überprüfen ob Kindelemente da sind while(container.offsetHeight < state.offsetHeight) { container.appendChild(doc.childNodes[i].cloneNode(true)); i++; if(doc.childNodes.length < i) return(true); } var elem = container.lastChild; container.removeChild(elem); i--; return addPage(); }
Im Firefox klapp alles imernoch prima (war ja auch zu erwaten (aus meiner Sicht))
Nun, wie ich erwartete liefert der IE keinen Fehler mehr, da er dort aus addPage steigt, wo die Kindelemente überprüft werden.

Wenn ich nun request.responseText ausgeben lasse steht da ein für mich gültiges XML-Dokument beginnend mit<?xml version="1.0" encoding="iso-8859-1"?>

Naja, danke dir schonmal chrisb

mfg Joey