1

似たような質問を見たことがありますが、私のケースに役立つ回答はないようです...

基本的に、$.ajax()(別のドメインにある) 使用中に HTML をロードし、独自の DOM に解析して、実際のウィンドウ DOM で属性を適用し、HTML を操作できるようにしたいと考えています。

$.ajax({
    type: 'GET',
    url: 'http://example.com/index.html',
    dataType: 'html',
    crossDomain: true,
    cache: false,
    success: function(data) 
    {
        var src = $('body img', data).first().attr("src");
        //also tried: var src = $('body', $(data)).first().attr("src"); 
        $('#someDiv img').attr("src", src);
    }
});

HTML ファイルの例は次のとおりです。

<html>
<body>
    <img src="someurl"></img>
</body>
</html>

Firefox では機能しますが、IE では機能しません。何を試しても、解析して読み取ろうとすると、null が返されます。助言がありますか?

編集:

私の質問にはあいまいさがあったようです。問題はAJAXではなく解析です。AJAX は html 文字列を正しく返しますが、jQuery はそれを解析できません。

編集2:

「解決策」を見つけましたが、思ったほど良くはありません.DOMに適用するのではなく、HTML文字列を切り刻んで並べ替え、データを抽出します. データの順序を予測できるため、効率的に実行されているようです。

煮詰めると、次のようになります。

var imgsrcs = new Array(5);
var searchItem = '<img src="';
for (var a=0; a<5; a++) {
    var startLoc = data.search(searchItem) + searchItem.length;
    for (var i=0; i<data.length; i++) {
        if (data.charAt(startLoc + i) == '"')
            break;
        imgsrcs[a] += data.charAt(startLoc + i);
    }
    data = data.substring(startLoc + i, data.length);
}
$('.image').each(function(i) {
    $(this).attr("src", imgsrcs[i]);
}); 

かなり醜いですが、問題を解決したので、投稿したほうがよいと思いました。

4

1 に答える 1

2

これは、Same Origin ポリシーの問題です。

crossDomainjquery の関数のフラグはajax、すべてのブラウザーでクロス ドメイン リクエストを自動的に機能させるわけではありません (すべてのブラウザーが CORS をサポートしているわけではありません)。別のドメインからこれをリクエストしているため、通常のリクエストでは実際にデータを読み取ることはできません (またはリクエストを行うことさえできません)。

通常、json データの場合は、crossDomain頻繁にフラグを使用して有効にする JSONP を実行できます。ただし、JSON は JavaScript でネイティブに読み取ることができるという点でユニークです。HTML は読み取ることができないため、解析可能な JavaScript でラップして、JSONP のようなトリックを採用する必要があります。

ただし、自分でそれを行うのではなく、このようなクロスドメイン メッセージを行うために easyXDM ライブラリを調べることを強くお勧めします。基本的に、他のドメインで非表示の iframe を開き、親フレームと非表示のフレームの間でメッセージをやり取りします。また、非表示のフレームはhtmlと同じドメインにあるため、問題なく ajax できます。

http://easyxdm.net/wp/

于 2012-04-27T06:32:42.960 に答える