jQuery.ajax()で外部HTMLファイルを読み込み、要素を取得したいのですが、最上層の要素を取得することが出来ません。

・jsファイル
---------------------------------------------------------------------------
$("#button").click(function() {
$.ajax({
type: 'GET',
url: 'file.html',
dataType: 'html',
success: function (data) {
console.log($('div', $(data)));
},
});
});
---------------------------------------------------------------------------

・file.html
---------------------------------------------------------------------------
<div class="test">test</div>
---------------------------------------------------------------------------


ちなみに、以下のようにdiv.testをdivでさらに囲んでやると取得することが出来るようです。

---------------------------------------------------------------------------
<div class="wrap">
<div class="test">test</div>
</div>
---------------------------------------------------------------------------


jQueryのバージョンは1.11、ブラウザはSafari 7.05を使用しています。

どのようなスクリプトで最上層の要素を取得することができるのでしょうか?

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2014/08/17 02:06:24
  • 終了:2014/08/19 00:40:03

ベストアンサー

id:Lhankor_Mhy No.1

Lhankor_Mhy回答回数775ベストアンサー獲得回数2302014/08/17 15:40:36

 単純に

$(data)

 でいいと思うんですが、もしcontextを使った表現にしたいのであれば、

$(':first-child', $(data)).parent()

 とか書けば取得できると思います。

他5件のコメントを見る
id:Lhankor_Mhy

context を利用しなくていいのであれば、フィルタでできると思います。

$('<div id="div1">div1</div><div id="div2" class="test">div2</div>').filter('div.test');
2014/08/18 09:46:05
id:Coban

find()ばかり考えていましたが、filter()というメソッドがあったのですね。
勉強になりました。ありがとうございます。

2014/08/19 00:34:13

その他の回答(1件)

id:Lhankor_Mhy No.1

Lhankor_Mhy回答回数775ベストアンサー獲得回数2302014/08/17 15:40:36ここでベストアンサー

 単純に

$(data)

 でいいと思うんですが、もしcontextを使った表現にしたいのであれば、

$(':first-child', $(data)).parent()

 とか書けば取得できると思います。

他5件のコメントを見る
id:Lhankor_Mhy

context を利用しなくていいのであれば、フィルタでできると思います。

$('<div id="div1">div1</div><div id="div2" class="test">div2</div>').filter('div.test');
2014/08/18 09:46:05
id:Coban

find()ばかり考えていましたが、filter()というメソッドがあったのですね。
勉強になりました。ありがとうございます。

2014/08/19 00:34:13
id:a-kuma3 No.2

a-kuma3回答回数4365ベストアンサー獲得回数18012014/08/18 09:48:31

探したい要素が、ルートにあるかどうかが分からない場合に、不便だな、ってことに気が付きました。

jQuery.load は、URL の最後に、空白で区切ってセレクタを書くことで、対象の一部を読み込めます。
http://api.jquery.com/load/#loading-page-fragments

以下は、jQuery 1.10.2 の jQuery.load の実装の抜粋です。

        }).done(function( responseText ) {

            // Save response for use in complete callback
            response = arguments;

            self.html( selector ?

                // If a selector was specified, locate the right elements in a dummy div
                // Exclude scripts to avoid IE 'Permission Denied' errors
                jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :

                // Otherwise use the full result
                responseText );

jQuery の実装にならって、こんな風にしてはどうでしょう。

$("#button").click(function() {
    $.ajax({
        type: 'GET',
        url: 'file.html',
        dataType: 'html',
        success: function (data) {
            console.log($('.test', $('<div>').append(data)));
        },
    });
});
id:Coban

こんなload()使い方があったのですね。
HTMLDocumentを生成せずともルートノードを作ってやることで、その子孫を検索できるというわけですね。
参考になりました。ありがとうございます。

2014/08/19 00:39:08
id:Coban

ご回答頂きましたお二人とも非常に参考になりました。
どちらもベストアンサーなのですが、最初に頂きましたご回答をベストアンサーをさせて頂きました。
ありがとうございました。

  • id:language_and_engineering
    console.log(data)

    をすると,どのように表示されるのでしょうか。
  • id:a-kuma3
    >>
    console.log(data)
    をすると,どのように表示されるのでしょうか。
    <<
    jQuery.ajax() を使ったことが無いんでしょうか?
    data は、String ですよ。
  • id:language_and_engineering
    a-kuma3さん、こんにちは。
    人力検索ではよくお見かけしますが、私に絡んでくれたのはこれが初めてかも…

    私の上記のコメントの意味がわかりづらくてごめんなさいね。

    自分が聞きたかった意図は、

    dataという文字列の中身はどうなってますか、確認しましたか

    そのdataという文字列に対して$()のコンテキストを適用させたらどうなりますか

    という誘導尋問でした。

    jqueryの使い方や、console.logの使い方を知りたくて聞いたわけではありませんので
    念のため…。

    (jQueryはプラグイン開発とかしてます。)


  • id:a-kuma3
    次の質問が用意されてた、ってことですね >lang_and_engine さん

    >人力検索ではよくお見かけしますが、私に絡んでくれたのはこれが初めてかも…
    あ、そうですか?
    徘徊しているエリアが似ているので、あまり初めてという気がしません :-)

    これからも、よろしくお願いします。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません