我有这个JavaScript从服务器获取html部分。我能够在警告消息中返回html,并且它是正确的代码。将HTML附加到XUL(Firefox扩展)
ajax: function(url){
var request = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"]
.createInstance(Components.interfaces.nsIXMLHttpRequest);
request.onreadystatechange = function() {
if (request.readyState == 4) {
// only if "OK"
if (request.status == 200) {
var popup = document.getElementById("ajax"); // a <menupopup> element
var txt = request.responseText;
alert(txt);
popup.appendChild(txt);
} else {
alert("There was a problem retrieving the XML data:\n" +
request.statusText);
}
}
};
request.open("GET", url, true);
request.send(null);
}
的XUL/HTML从服务器返回:
<menuitem>
<html:h2><html:a href="http://google.com">Google</html:a></html:h2>
<html:p><html:table><html:tr><html:td>xxxx</html:td></html:tr></html:table></html:p>
</menuitem>
<menuitem>
<html:h2><html:a href="http://yahoo.com">Yahoo</html:a></html:h2>
<html:p><html:table><html:tr><html:td>yyyy</html:td></html:tr></html:table></html:p>
</menuitem>
我的XUL页面:
...更多的代码
<menu class="menu" label="test">
<menupopup id="ajax" width="450" height="700" onpopupshowing="myextension.ajax('http://www.myserver.com/phpscript.php'>
</menupopup>
</menu>
现在,如果我附上了html direc对id ajax的menupopup可以按照预期工作。当我使用appendChild附加它时,它不会。我知道我不能使用appendChild,但在XUL中似乎没有与innerHTML等效的内容。我无法控制从服务器返回的xul/html,所以我不能使用DOM方法添加内容并绕过html。
我尝试使用HTMLParser https://developer.mozilla.org/en/Code_snippets/HTML_to_DOM将它转换为DOM对象,但似乎并不奏效,我相信因为它削减了<menuitem>
标记。
任何想法如何将HTML附加到menupopup,以便我可以将它们显示为菜单项。
好吧,我试过了iframe的办法:
ajax: function(url){
var request = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"]
.createInstance(Components.interfaces.nsIXMLHttpRequest);
request.onreadystatechange = function() {
if (request.readyState == 4) {
// only if "OK"
if (request.status == 200) {
var frame = document.getElementById("frame");
frame.setAttribute("src", "data:text/html," + encodeURIComponent(request.responseText));
} else {
alert("There was a problem retrieving the XML data:\n" + request.statusText);
}
}
};
request.open("GET", url, true);
request.send(null);
}
与
<iframe id="frame" type="content" src="" />
这似乎并没有工作。但是,如果我执行encodeURIComponent(request.responseText)的警报,它的编码是正确的。进而更如果我直接把它添加到这样的iframe:
<iframe type="content" src="data:text/html,%3Chtml%3E%0A%3Cbody%3E%0A%3Cp%3EHello%20everyone%3C%2Fp%3E%0A%09%3C%2Fbody%3E%0A%3C%2Fhtml%3E%0A%0A"/>
这是行不通的,因为显示它需要标签内的HTML,但HTML中包含这应该是每一个在自己的标签很多不同的项目。简单地添加到HTML是行不通的。
如果你控制服务器,AJAX调用返回一些JSON和你想要显示的数据,然后使用DOM方法或XBL在客户端构建XUL/HTML结构可能会更好。 – MatrixFrog 2011-06-02 17:25:07
我不能那样做。实际上,我收到的描述中包含一些HTML的RSS源。我已经解析了RSS feed,以便将HMTL部分从它中解放出来。但是很难解析这个html,以及我不知道将会发生什么。所以我更喜欢使用html。 – Stofke 2011-06-02 22:45:33
对不起,我没有注意到你已经说过你无法控制服务器。 – MatrixFrog 2011-06-02 23:22:45