考虑一下:

<!DOCTYPE HTML> 
<html><head><title>XML-problem</title> 
 
<script src="jquery-1.3.2.min.js" type="text/javascript"></script> 
 
<script type="text/javascript"> 
 
$(function() { 
    $('<p/>').load("text.xml", function(responseText, textStatus, xhr) { 
        var xml = $(xhr.responseXML); 
        var x_txt = xml.find('atom\\:x').text(); 
        $(this).text(x_txt).appendTo('#container'); 
    }); 
}); 
 
</script> 
 
</head><body><div id="container" /></body></html> 

此脚本应在加载文档后加载 text.xml。 text.xml 看起来像这样:

<xml xmlns:atom="http://www.w3.org/2005/Atom"> 
    <atom:x>Text</atom:x> 
</xml> 

加载此文件后,atom:x 节点的文本内容将附加到文档中。我可以在浏览器窗口中看到“文本”。

这在 Firefox 中按预期工作。但是,它在 Opera 中不起作用,除非我将查询从 'atom\\:x' 更改为仅 'x'。在这种情况下,它适用于 Opera,但不适用于 Firefox。

我发现了一个解决方法,即将查询更改为 'atom\\:x, x',但我更想深入了解这一点。


现在有趣的是:我可以直接内联 xml 而不是通过更改从 XHR 获取它

var xml = $(xhr.responseXML); 

进入

var xml = $('<xml xmlns:atom="http://www.w3.org/2005/Atom"><atom:x>Text</atom:x></xml>'); 

在这种情况下,'atom\\:x' 的查询将在两种浏览器中给出所需的结果,而仅 'x' 将在两种浏览器中都不会给出任何结果.

这在 Opera 中的工作方式不同这一事实使我得出结论,前一种行为是 Opera 中的一个错误。这是一个合理的结论吗?我可以在哪里找到描述它应该如何工作的标准?


总结:

  1. 此问题的替代解决方法是什么?有比我找到的那个更好的吗?
  2. 这是 Opera 中的错误吗?如果是,哪个标准是这样说的?

希望你能帮上忙:)

请您参考如下方法:

这不是 Opera 中的错误。这是the correct behavior :

In a namespace-aware client, the name part of element type selectors (the part after the namespace separator, if it is present) will only match against the local part of the element's qualified name.

在您的情况下,本地名称是 xatom:x isn't even a legal local name in XML .

此外,namespace-prefixed type selector在 CSS 中有完全不使用冒号的不同语法:

@namespace atom url(http://www.w3.org/2005/Atom); 
atom|x { color: blue } 

您的语法似乎依赖于 HTML 解析器在 namespace 未知的用户代理中引入的怪癖。

HTML 解析器“吃掉”冒号作为标签名称的一部分,您将在默认命名空间中获得 atom:x 元素,这将匹配 atom\:x 选择器,但是在 XML 中,您在 http://www.w3.org/2005/Atom 命名空间中获得 x 元素。


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!