Hallo,
mein Problem scheint am ehesten in dieses Forum zu passen:
Ich entwickle eine chrome Anwendung fuer XULRunner 1.8.0.1. In dieser Anwendung lade ich mittels XMLHttpRequest eine "entfernte" xul Datei von einem Webserver. Sodann versuche ich, die in einem iframe enthaltene aktuelle Seite durch die soeben geladene Seite mittels DOM Funktionen zu ersetzen. Dabei stosse ich auf gravierende Probleme. Die mittlerweise tagelange Recherche auf dem Internet hat kein Ergebnis gebracht. Daher hier mein Problem (in aller Ausfuehrlichkeit), denn ausser ueber ein Forum sehe ich kein Weiterkommen mehr. (Das Problem tritt in derselben Weise auf, wenn ich die Anwendung mit firefox 1.5.0.1 starte)
Und noch eine Anmerkung vorneweg; Ich >muss< XMLHttpRequest zum Laden von Seiten verwenden. Die Gruende dafuer kann ich gerne nachliefern.
Problem:
Meine Applikation oeffnet das triviale Fenster
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<window debug="true" title="JSF Connect" orient="vertical"
width="800px" height="500px"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
onload="init();"
onunload="return shutdown('onunload');" onclose="return shutdown('onclose');" >
<script src="jsfclient.js"/>
<script src="tools/Dom.js"/>
<script src="tools/Logger.js"/>
<script src="tools/Connection.js"/>
<command id="parent-button" oncommand="execute('parent-button');"/>
<button id="asasbutton" label="asas" command="parent-button"/>
<iframe minwidth="600px" id="topFrame" flex="1" src="about:blank"/>
<statusbar id="bbb" minheight="20px">
<statusbarpanel id="statusBar" label="" flex="1"/>
</statusbar>
</window>
Alles anzeigen
Sodann lade ich die Seite
via XMLHttpRequest. Diese Seite sieht folgendermassen aus (in jsp, wobei das jsp-Gedoehns natuerlich nicht so vom Webserver geliefert wird... Wichtig ist alles innerhalb von <page>):
<?xml version="1.0" encoding="ISO-8859-1" ?>
<jsp:root version="2.0"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:x="http://de.jsf.xul"
xmlns:jsp="http://java.sun.com/JSP/Page"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/JSP/Page http://java.sun.com/xml/ns/j2ee/jsp_2_0.xsd ">
<jsp:directive.page language="java"
contentType="application/vnd.mozilla.xul+xml; charset=ISO-8859-1" pageEncoding="ISO-8859-1" />
<jsp:text><![CDATA[<?xml version="1.0" encoding="ISO-8859-1" ?> ]]></jsp:text>
<jsp:text><![CDATA[<?xml-stylesheet href="chrome://global/skin/" type="text/css"?> ]]></jsp:text>
<f:view>
<page debug="true" title="JSF Connect" orient="vertical" id="mypage"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<grid flex="1">
<columns>
<column />
<column flex="1" />
</columns>
<rows>
<row>
<label control="app-link"
value="Enter link to Web Application:" />
<textbox id="app-link" size="50"
type="autocpmplete" autocompletesearch="history" tabIndex="1"
onkeypress="if (event.keyCode == event.DOM_VK_RETURN) {alert('textbox'); return false;} else {return true;};" />
</row>
<row>
<hbox />
<hbox>
<button id="b1" label="XXConnect" oncommand="alert('button XXconnect b1');"
tabIndex="2" />
<button id="b2" label="XXExit" oncommand="alert('button XXEdit b2');"
tabIndex="3" />
<spacer flex="1" />
</hbox>
</row>
</rows>
</grid>
</page>
</f:view>
</jsp:root>
Alles anzeigen
Die Anwort von XMLHttpRequest steckt in retParams.responseXML und retParams.responseText. response ist der Handler von XMLHttpRequest, welcher asynchron aufgerufen wird (onload event). Sodann ersetze ich die alte Seite im iframe auf folgende Weise durch die neue Seite:
function response(retParams) {
gLogger.trace("> Global.response >");
var newDoc = retParams.responseXML;
var iframe = window.document.getElementById('topFrame');
var oldDoc = iframe.contentDocument;
var newNode = newDoc.documentElement;
var oldNode = oldDoc.documentElement;
var retDoc;
try{
var nodeList = oldDoc.childNodes;
for( var i = 0; i < nodeList.length; ){
try {
oldDoc.removeChild(nodeList.item(i));
} catch (e) {
}
}
var importNode;
// import processing instruction
importNode = oldDoc.importNode(newDoc.firstChild, true);
retDoc = oldDoc.appendChild(importNode);
// importe root document
importNode = oldDoc.importNode(newNode, true);
retDoc = oldDoc.appendChild(importNode);
} catch(e) {
}
iframe.focus();
stopEvents = false;
setCursor("auto");
gLogger.trace("< Global.response <");
}
Alles anzeigen
Soweit sollte alles schulbuchmaessig sein. Die geladene Seite wird auch korrekt, inklusive Style, angezeigt. Ich habe auch den DOM Baum ueberprueft, alles wie zu erwarten korrekt.
Das Problem haengt am JavaScript des importierten Dokuments, vgl.
in der geladenen Seite. Wenn ich die im folgenden beschriebenen Interaktionen mit dem GUI ausfuehre, werden in den Faellen A-C je >zwei< Alertfenster nacheinander angezeigt , im Fall D sogar >drei<. Erwartet wird jedoch nur je ein Alertfenster!!! Das zweite bzw. dritte Fenster wird dabei immer erst angezeigt, wenn ich im vorhergehenden den OK Button gedrueckt habe.
Hier die Fenster mit Titel und Text:
[A] Klicke den Button "XXConnect" mit dem Ergebnis:
Title: "http://localhost:8080"
Text: "button XXConnect b1"
Title: "[JavaScript Application]"
Text: "button XXEdit b2"
[B] Klicke den Button "XXEdit" mit dem Ergebnis:
Title: "http://localhost:8080"
Text: "button XXEdit b2"
Title: "[JavaScript Application]"
Text: "button XXEdit b2"
[C] Fuege 'a' im Textfeld ein und druecke <enter> mit dem Ergebnis:
Title: "http://localhost:8080"
Text: "textbox"
Title: "[JavaScript Application]"
Text: "textbox"
[D] Druecke <tab> so dass der Button "XXConnect" den Fokus hat und druecke <enter> mit dem Ergebnis:
Title: "[JavaScript Application]"
Text: "textbox"
Title: "http://localhost:8080"
Text: "button XXConnect b1"
Title: "[JavaScript Application]"
Text: "button XXEdit b2"
Seltsam, oder? Erwartet wird in jedem Fall immer nur das Alertfenster mit dem Titel "http://localhost:8080".
Zum Beweis habe ich die entfernte Seite einmal anders geladen, also nicht mit XMLHttpRequest, sondern mit
var iframe = window.document.getElementById('topFrame');
iframe.webNavigation.loadURI("http://localhost:8080/GASWEB/login.jsf", iframe.webNavigation.LOAD_FLAGS_NONE, null, null, null);
Das Ergebnis ist:
[A] Klicke den Button "XXConnect" mit dem Ergebnis:
Title: "http://localhost:8080"
Text: "button XXConnect b1"
[B] Klicke den Button "XXEdit" mit dem Ergebnis:
Title: "http://localhost:8080"
Text: "button XXEdit b2"
[C] Fuege 'a' im Textfeld ein und druecke <enter> mit dem Ergebnis:
Title: "http://localhost:8080"
Text: "textbox"
[D] Druecke <tab> so dass der Button "XXConnect" den Fokus hat und druecke <enter> mit dem Ergebnis:
Title: "http://localhost:8080"
Text: "button XXConnect b1"
Wie schon gesagt, ich habe absolut keine Idee, was hier falsch lauft, insbesondere, ob es mein Fehler ist, oder ein Bug.
Ich hoffe, ueber das Forum Hilfe zu erhalten und bedanke mich im voraus dafuer,
viele Gruesse
Andreas.