XML 数据孤岛的解决方法
Workaround for xml data islands
我最近继承了一个巨大的Web应用程序,它是JSP,Javascript和Java的组合。它仅适用于IE,因为它是使用xml数据岛和其他阻止在其他浏览器上顺利运行的东西进行编码的。一切都很好,直到几天后,Windows 7盒子为少数用户推出,其中IE9/10在应用程序中的某些javascript上遇到了问题。例如,以下数据岛是我的 html 页面中的一个代码段。
<xml id = "underlyingdata" ondatasetcomplete="window.dialogArguments.parent.repopulateDropDown(this, underlyingdd)">
</xml>
<xml id="termdata" ondatasetcomplete="window.dialogArguments.parent.repopulateDropDown(this, termdd)">
</xml>
在此页面上还有另一行代码
window.dialogArguments.parent.request(underlyingdata, "CONTRACT.LIST.WB", "PULP AND PAPER|" + instrumentdd.options[instrumentdd.selectedIndex].text);
调用如下函数
function request(xmldataisland, requestmethod, parameters
{
var screwcache=Math.round(Math.random()*10000);
xmldataisland.value=null;
xmldataisland.load("/webaccess/Request?sessionid=" + sessionid + "&request=" + requestmethod + "¶meters=" + parameters+"&screwcache="+screwcache);
}
这在IE9/10中失败,错误是"加载"不是"xmldataisland"对象上的有效方法(脚本438错误),而在IE 5到IE 8上工作正常。
我相信上述函数中的 xmldataisland 对象是 XMLDocument 类型。为什么加载方法会失败?对此有什么解决方法?我从许多来源读到并听到使用数据孤岛是一个糟糕的主意。在这种情况下,正确的选择是什么?
从IE10开始,不再支持XML数据岛 - 浏览器将它们解析为HTML。Mozilla开发者网络已经发表了一篇文章,它给出了XML数据孤岛的跨浏览器替代方案,即HTML5"数据块"。本文演示了如果省略 src
属性且 type
属性未指定可执行脚本类型,则可以将 <script>
元素用作数据块。还必须确保嵌入的 XML 内容不包含 </script>
标记。
来源:https://developer.mozilla.org/en/docs/Using_XML_Data_Islands_in_Mozilla
这是他们给出的 HTML 示例...
<!DOCTYPE html>
<html>
<head>
<title>XML Data Block Demo</title>
<!-- this is the data block which contains the XML data -->
<script id="purchase-order" type="application/xml">
<purchaseOrder xmlns="http://example.mozilla.org/PurchaseOrderML">
<lineItem>
<name>Line Item 1</name>
<price>1.25</price>
</lineItem>
<lineItem>
<name>Line Item 2</name>
<price>2.48</price>
</lineItem>
</purchaseOrder>
</script>
<script>
function runDemo() {
// the raw XML data can be retrieved using this...
var orderSource = document.getElementById("purchase-order").textContent;
// the XML data can be parsed into a DOM tree using the DOMParser API...
var parser = new DOMParser();
var doc = parser.parseFromString(orderSource, "application/xml");
var lineItems = doc.getElementsByTagNameNS("http://example.mozilla.org/PurchaseOrderML", "lineItem");
var firstPrice = lineItems[0].getElementsByTagNameNS("http://example.mozilla.org/PurchaseOrderML", "price")[0].textContent;
document.body.textContent = "The purchase order contains " + lineItems.length + " line items. The price of the first line item is " + firstPrice + ".";
}
</script>
</head>
<body onload="runDemo()";>
Demo did not run
</body>
</html>
您需要编写自己的方法来将数据加载到该块中(可能使用 jQuery.get
或 .load
方法)。
希望对您有所帮助!
给出接受的答案4.5年后,可以使用HTML5进行更新。脚本标记不是必需的。HTML5基于XML,允许您创建自己的标签名称。您可以为所有浏览器创建一个"xml岛",如下所示:
<parms style="display:none;">
<op>
encrypt
</op>
<msg>
Hello World!
</msg>
</parms>
并做这样的事情来使用它。
var xml = document.querySelector("parms");
var op = xml.querySelector("op").textContent;
var msg = xml.querySelector("msg").textContent;
您还可以使用div (display:none) 作为使用 XHR 获取的 XML 的容器。由于HTML5基于XML,因此您可以使用MIME类型的text/XML从服务器返回XML,并使用.innerHTML将其放入div中。
- 使用JSON序列化图论树的解决方法
- X-Content-Type-Options=nosniff解决方法
- 供应商前缀 CSS 解决方法(引导程序)的速度和大小
- 无法使用HTML5 Web存储保存布尔值的解决方法
- HTML”;文件“/OpenFile对话框解决方法
- 多行链接中引导工具提示的解决方法
- 使用jsonp解决方法进行同步ajax调用
- YQL推特时间线超出速率限制.解决方法
- 嵌套文档.writes和第三方广告在IE中不起作用!!!!任何安全的解决方法
- 加载外部页面的跨域解决方法
- Emberjs - 基于控制器属性进行过滤的奇怪解决方法
- Z 索引绝对定位元素低于父级,具有 z 索引解决方法
- 安卓浏览器触端事件错误解决方法
- 有什么方法可以将类型指定为 self?或解决方法“属性类型不兼容”
- SVG 符号不会触发加载事件(仅在 Firefox 中).我寻找解决方法
- IE10 背景位置 x 的解决方法
- 在 IE11 中添加子项时未更新空选择器的解决方法
- 安卓浏览器上的滚动事件未触发.需要解决方法
- IE8 中 data:uri 的 32KB 限制的任何解决方法
- 溢出-x:可见;不适用于溢出-y:自动;任何解决方法