我正在尝试为 IE XML DOM 库的text属性编写 shim,但我遇到了有关格式化空白的问题。
如果我处理以下 XML 的文本属性
var doc1 = load_ie('<root><a>A</a><b>B</b></root>')
var doc2 = load_ie('<root><a>A</a> <b>B</b></root>');
他们给出不同的结果:
doc1.text // 'AB'
doc2.text // 'A B' - the multiple spaces are compressed to a single space
然而,令我惊讶的是,IE 似乎并不承认 x2 中存在的空间甚至存在,就像其他浏览器一样:
doc1.documentElement.childNodes.length // 2
doc2.documentElement.childNodes.length // 2 (I expected 3!)
var doc3 = load_ie('<root><a>A</a> c <b>B</b></root>');
doc3.documentElement.childNodes.length // 3
如果我在 Google chrome 上运行测试,则 doc2 案例中的节点数为 3(“a”节点、具有 3 个空格的文本节点和“b”节点),类似于 doc3 案例的工作方式。如果 IE 对我隐藏空白节点并且我无法区分第一种和第二种情况,即使它们需要返回不同的结果,我将如何编写我的 shim?
从字符串加载创建 XML 文档的代码:
load_ie = function(xmlstr){
var doc = new ActiveXObject('Microsoft.XMLDOM');
doc.async=false;
doc.loadXML(xmlstr);
return doc;
}
load_w3c = function(xmlstr){
var p = new DOMParser();
return p.parseFromString(xmlstr, 'text/xml');
}
奖金问题:
我也无法让 MSDN 文档中给出的示例正常工作。根据它,以下XML
var d = load_ie(
'<root att=" 123 a ">\n' +
' <a> a a </a>\n' +
' <!-- comment b -->\n' +
' <?pi pi c ?>\n' +
' <![CDATA[ cdata d ]]>\n' +
' e f\n' +
'</root>'
);
d.text;
应该给
"a a cdata d e f"
但相反我得到
"a a cdata d \n e f"
我想知道我是否遗漏了一些明显导致我行为异常的东西。