5

考虑一下:

<!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>

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

这在 Firefox 中按预期工作。'atom\\:x'但是,除非我将查询从改为 just ,否则它在 Opera 中不起作用'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中的错误吗?如果是,哪个标准是这样说的?

希望你能帮忙:)

4

4 回答 4

3

这不是 Opera 中的错误。这是正确的行为

在命名空间感知客户端中,元素类型选择器的名称部分(命名空间分隔符之后的部分,如果存在)将仅与元素限定名称的本地部分匹配。

在您的情况下,本地名称是xatom:x 甚至不是 XML 中的合法本地名称

此外, CSS 中以命名空间为前缀的类型选择器具有完全不使用冒号的不同语法:

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

您的语法似乎依赖于 HTML 解析器在不知道命名空间的用户代理中引入的怪癖。

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

于 2009-11-09T00:57:02.520 回答
2

我已经在同一浏览器的不同版本中经历过这种行为,据我记得当时我正在使用 FF 和 IE 测试有问题的页面,所以我会说这不是 Opera 特定的错误。

我建议每当您使用 jQuery 解析带有命名空间前缀的 XML 标记时,您都可以查询带有和不带有前缀的选择器。也就是说,而不是使用

var x_txt = xml.find('atom\\:x').text();

尝试

var x_txt = xml.find('atom\\:x, x').text();

我认为在大多数情况下这是一个可以接受的解决方法,它可以确保你的结果是正确的,尽管有不当行为......

于 2009-11-06T11:44:31.743 回答
1

我认为您应该说“atom:x”(不带反斜杠),并确保在主的 html 标记上声明 xmlns:atom="http://www.w3.org/2005/Atom" html 文件,或以其他一些已知的 javascript 方式。

于 2009-11-05T14:31:44.260 回答
0

很难说这是 Opera 中的错误,还是 jQuery 中特定于 Opera 的错误。从它的声音来看,Opera 没有正确地将命名空间添加到 xhr 文档 dom,这就是 jQuery 无法查询 atom:x 的原因,也解释了为什么当您创建自己的 jquery 节点时,您没有得到相同的结果。

我要做的第一件事是尝试查看 atom 是否是 xhr dom 中定义的 namspace。它应该按照定义返回您的 atom ns,如果没有,这可能是一个歌剧错误。我不确定测试这个的最佳方法,但也许:xhr.getElementByTagNameNS( "x" "http://www.w3.org/2005/Atom" );会工作。

如果做不到这一点,Opera 声称完全支持XML 命名空间,但是,我会用 jQuery 打开一个错误请求,看看你在哪里。

在其他方面,正如我在评论中回避的那样,我认为查询根本不是atom:x一个x好主意。您最好不要使用名称空间,因为它违背了目的。

于 2009-11-05T18:35:25.283 回答