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>

このファイルがロードされると、ノードのテキスト コンテンツがatom:xドキュメントに追加されます。ブラウザ ウィンドウに「テキスト」が表示されます。

これは、Firefox では期待どおりに機能します。'atom\\:x'ただし、クエリをから justに変更しない限り、Opera では機能しません'x'。この場合、Opera では機能しますが、Firefox では機能しません。

クエリを に変更するという回避策を発見しましたが、'atom\\:x, x'むしろこれを突き止めたいと思います。


ここで面白いひねりを加えます: XHR から取得する代わりに、xml を直接インライン化することができます。

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 のバグではありません。それは正しい動作です:

名前空間認識クライアントでは、要素タイプ セレクターの名前部分 (存在する場合は名前空間区切り記号の後の部分) は、要素の修飾名のローカル部分に対してのみ一致します。

あなたの場合、ローカル名はxでありatom:x 、XML の有効なローカル名でさえありません

さらに、 CSSの名前空間プレフィックス型セレクターには、コロンをまったく使用しない別の構文があります。

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

あなたの構文は、名前空間を認識しないユーザー エージェントの HTML パーサーによって導入された癖に依存しているようです。

HTMLパーサーはタグ名の一部としてコロンを「食べ」、セレクターにatom:x一致するデフォルトの名前空間で要素を取得しますが、XMLでは名前空間で要素を取得します。atom\:xxhttp://www.w3.org/2005/Atom

于 2009-11-09T00:57:02.520 に答える
2

同じブラウザの異なるバージョンでこの動作を既に経験しており、覚えている限りでは、問題のあるページを FF と IE でテストしていたので、これは Opera 固有のバグではないと思います。

名前空間プレフィックス付きの XML タグを解析するために jQuery を使用するときはいつでも、プレフィックスの有無にかかわらずセレクターを照会することをお勧めします。つまり、使用する代わりに

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のバグなのか、それともOpera固有のjQueryのバグなのかはわかりません。その音から、Operaは名前空間をxhrドキュメントdomに適切に追加していません。これが、jQueryがatom:xをクエリできない理由であり、独自のjqueryノードを作成したときに同じ結果が得られない理由も説明しています。

私が最初にすることは、atomがxhrdomで定義された名前空間であるかどうかを確認することです。定義されたとおりにアトムnsを返す必要があります。そうでない場合、これはおそらくオペラのバグです。これをテストする最善の方法はわかりませんが、おそらく:xhr.getElementByTagNameNS( "x" "http://www.w3.org/2005/Atom" );うまくいくでしょう。

それができない場合、OperaはXML名前空間を完全にサポートすると主張していますが、jQueryを使用してバグ要求を開き、それがどこにあるかを確認します。

atom:x他の点では、コメントでとらえどころのないように、によるクエリxはまったく良い考えではないと思います。名前空間は目的に反するため、使用しない方がよいでしょう。

于 2009-11-05T18:35:25.283 に答える