【发布时间】:2015-01-24 14:44:12
【问题描述】:
编辑
对我的问题进行了所有修改后,它变得相当冗长。所以让我试着把它缩短一点,让它更容易理解。
我正在使用 XULRunner 构建一个 XUL 应用程序。我让它加载一个虚拟 XUL 页面,然后我希望使用 XMLHttprequest 从我的服务器(本地 ampps 服务器)加载所有内容,使用 PHP 来完成所有实际工作。我的 PHP 正在设置 XML Content-Type 标头,并将所有输出数据格式化为 XML。
这是处理 XMLHttprequest 和响应的 JavaScript 函数当前的样子。
function RequestData()
{
if (window.XMLHttpRequest)
{
var url = 'newmenu.xml';
var request = new XMLHttpRequest();
}
else
{
var url = 'http://localdomain.prog/';
var request = Components.classes['@mozilla.org/xmlextras/xmlhttprequest;1'].createInstance(Components.interfaces.nsIXMLHttpRequest);
}
request.onload = function(aEvent)
{
var xmlDoc = aEvent.target.responseXML;
var oldmenu = document.getElementById('menubarwrapper');
oldmenu.parentNode.replaceChild(xmlDoc.documentElement, oldmenu);
};
request.onerror = function(aEvent)
{
window.alert("Error Status: " + aEvent.target.status);
};
request.open('POST', url, true);
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
request.send('pageid=menu');
}
RequestData() 使用窗口 onload 事件调用。
我的原始代码看起来什么也没做,但是当我研究和测试时,我最终让 XULRunner 在错误控制台中显示了一些错误。最终它导致了我现在假设的工作版本,但我只是不知道。
错误控制台正在发出这条消息(现在仍然如此)
警告:窗口元素的 XUL 框包含内联工具箱子项,强制将其所有子项包装在一个块中。
为了确定我的代码是否有效,我必须将它放入 Firefox。这就是if (window.XMLHttpRequest) 的原因,因为它允许我同时使用 Firefox 和 XULRunner 进行测试。然后我获取了我的 PHP 生成的 XML 并制作了一个本地文件,因为 Firefox 不允许 XMLHttprequest 加载远程文件(即使它在技术上是本地的)。
上面的代码确实导入了 XML 并替换了 <menubar id="menubarwrapper">...</menubar>。但是,在 Firefox 和 XULRunner 中,菜单都会消失。如果使用 Firebug,我可以看到所有元素,但是为什么它们不再可见是我无法理解的,并且 Firebug 控制台中没有错误。这就是我目前被难住的地方。
如果它有任何用途,下面是我加载的虚拟 XUL 文件的副本。
<?xml version="1.0"?>
<?xml-stylesheet href="main.css" type="text/css"?>
<window id="main" title="My App" width="1000" height="800" sizemode="maximized" orient="vertical" persist="screenX screenY width height" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script type="application/javascript" src="main.js"/>
<toolbox id="toolboxwrapper">
<menubar id="menubarwrapper">
<menu id="file-menu" label="File" accesskey="F">
<menupopup id="file-popup">
<menuitem label="Refresh" funcname="RefreshWin"/>
<menuitem label="Open Window" funcname="OpenWin" acceltext="Ctrl+O" accesskey="O" />
<menuseparator/>
<menuitem label="Exit" funcname="ExitProg"/>
</menupopup>
</menu>
<menu id="edit-menu" label="Edit" accesskey="E">
<menupopup id="edit-popup">
<menuitem label="Undo"/>
<menuitem label="Redo"/>
</menupopup>
</menu>
</menubar>
</toolbox>
</window>
我的 PHP 生成的 XML 很长,但基本上它是 <menubar> 元素及其所有子元素,类似于上面,但有更多 <menu> 和 <menuitem> 元素。
【问题讨论】:
-
尝试DOM Inspector 验证您的文档 DOM 修改后的样子。
xmlDoc.documentElement是什么元素? -
@Kashif - 我没有使用过 DOM 检查器,但在加载它后,乍一看,它似乎与 Firebug 中的信息相似。我确实在 Firefox 中创建了一个测试,以查看 firebug 正在输出什么。有关详细信息,请参阅我的第二次编辑。
-
@Kashif - 忘了回答你的问题。 xmlDoc.documentElement 是我的 PHP 生成的
元素 -
只是一般的观察,可能与您的问题有关,也可能不相关:您需要在插入之前
adoptNode来自不同 DOM 的节点。 -
我自己 implemented 类似这样的东西,实际上,XHR'ing 一些 XML/XUL 并将其放置在现有窗口中(我这样做是为了获得假覆盖以用于无需重启的附加组件)。也许这会有所帮助。一件重要的事情是,IIRC 是删除纯空白文本节点。
标签: javascript xml xmlhttprequest xul xulrunner