首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >xml数据孤岛的解决方案

xml数据孤岛的解决方案
EN

Stack Overflow用户
提问于 2013-09-11 18:24:31
回答 2查看 7.5K关注 0票数 7

我最近继承了一个巨大的webapp,它是JSP、Javascript和Java的组合。它只在IE上工作,因为它使用xml、数据孤岛和其他阻止其他浏览器顺利运行的方式进行编码。一切都很好,直到有几天Windows 7盒为少数用户推出,其中IE9/10对应用程序中的一些javascript有问题。例如,下面的数据岛是我的html页面的一个片段。

代码语言:javascript
运行
复制
<xml id = "underlyingdata" ondatasetcomplete="window.dialogArguments.parent.repopulateDropDown(this, underlyingdd)">
</xml>
<xml id="termdata" ondatasetcomplete="window.dialogArguments.parent.repopulateDropDown(this, termdd)">
</xml>

在这个页面上有另一行代码

代码语言:javascript
运行
复制
window.dialogArguments.parent.request(underlyingdata, "CONTRACT.LIST.WB", "PULP AND PAPER|" + instrumentdd.options[instrumentdd.selectedIndex].text);

调用如下所示的函数

代码语言:javascript
运行
复制
function request(xmldataisland, requestmethod, parameters
{       
    var screwcache=Math.round(Math.random()*10000);
    xmldataisland.value=null;
    xmldataisland.load("/webaccess/Request?sessionid=" + sessionid + "&request=" + requestmethod + "&parameters=" + parameters+"&screwcache="+screwcache);

}

这在IE9/10中失败,错误是'load‘不是'xmldataisland’对象上的有效方法(脚本438错误),而它在IE5到IE8上工作得非常好。

我相信上述函数中的xmldataisland对象是XMLDocument类型的。为什么load方法会失败?解决这个问题的办法是什么?我读到并从许多来源听到,使用数据岛是一个糟糕的想法。在这种情况下,正确的选择是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-24 11:32:44

从IE10开始,XML data islands are no longer supported -浏览器将它们解析为XML data islands are no longer supported。生产了一个article,它为XML数据孤岛提供了一个跨浏览器的替代方案,即一个HTML5“数据块”。本文演示了如果省略了<script>属性而type属性没有指定可执行脚本类型,则可以使用type元素作为数据块。您还必须确保嵌入的XML内容不包含</script>标记。

来源:Mozilla

这是他们给出的HTML示例..。

代码语言:javascript
运行
复制
<!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方法)。

希望这能帮上忙!

票数 10
EN

Stack Overflow用户

发布于 2018-09-24 11:51:01

在被接受的答案给出4.5年后,使用HTML5进行更新是可能的。脚本标记不是必需的。HTML5基于XML,允许您自己创建标记名。您可以为所有浏览器创建"xml岛“,如下所示:

代码语言:javascript
运行
复制
   <parms style="display:none;">
    <op>
       encrypt
    </op>
    <msg>
       Hello World!
    </msg>
  </parms>

做些这样的事情来利用它。

代码语言:javascript
运行
复制
  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中。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18748571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档