У меня есть этот JavaScript, который получает HTML-часть с сервера.Я могу вернуть html в сообщении с предупреждением, и это правильный код.
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 напрямую к menupopup с идентификатором ajax, он будет работать, как и ожидалось.Когда я прикрепляю его с помощью 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 не работает.