iframe内からjQueryで親要素のIDを取得する方法

このQ&Aのポイント
  • jQueryを使用して、iframe内から親要素のIDを取得する方法について教えてください。
  • parent()メソッドを使用すると、読み込み元のHTMLまでたどることができないようです。
  • 他の方法でiframe内から親要素のIDを取得する方法はありますか?
回答を見る
  • ベストアンサー

iframe内からjQueryで指定したい

jQueryのparentで親要素のIDを収得したいのですが、iframe内から、 読み込み元のHTMLを.parent()で追っていくと、取得できません。 jQuery("div#main iframe").contents().find('body').click(function(){ var hoge = jQuery(this).parent().parent().attr("id"); alert(hoge); }); .parent()では読み込み元のHTMLをまでいけないようなんですが、jQueryでは取得できないのでしょうか。 他にiframeから親を取得する記述があるのでしょうか。 アドバイスいただけると助かります。 拙い説明で恐縮ですが、どうぞよろしくお願いします。 こちら↓の板が閉鎖されるのを知らずにポストしていまい、 http://www.tagindex.com/cgi-lib/q4bbs/patio.cgi 解決の見込みがなさそうですで、改めてこちらでお尋ねしています。 ややマルチ気味で恐縮ですが、ご容赦ください。

質問者が選んだベストアンサー

  • ベストアンサー
  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.2

#1です。 >複数のiframeが存在しており、あるiframeにフォーカスしたら、 >それを囲うdivのidを拾いたい もしかするとそうなのかと思いましたが、ご質問文からははっきりとは読取れなかったので… もしそうであるなら、#1にも書きましたようにわざわざ子ドキュメントから遡ってこなくても、イベントを設定するときにidを渡しておけばよいと思われます。 >jQueryで親から子は >>jQuery("div#main iframe").contents().find('body'). >でいけるのに、子から親は無理なんですね。。。 これも、実際のところはDOMの親子ではなく、ドキュメント経由になっていることは同じだと思いますが…? (jQueryの記法がそれを感じさせ難くなっているだけではないでしょうか?) ---サンプル--- HTML内に以下のようなdivが沢山あるとして… <div id="test1" class="document"> <iframe src="A.html"></iframe> </div> <div id="test2" class="document"> <iframe src="B.html"></iframe> </div> javascript(jQuery)で仮に以下のような設定にすれば それぞれのdivのidがalertされます。 $("div.document").each(function(){   var id=$(this).attr("id");    $("iframe",this).contents().find('body').click(function(){     alert(id);   }); }); ただし、イベントの設定はそれぞれのiframeを読込んでいないと(bodyを取得できないと)うまくいきません。 (jQueryだと対象が無いだけなので、エラーにならないみたい) ((↑)これはid以前の問題。特にfxでは$(function(){~ でも、$(document).load(function(){~でもダメで、もう少しタイムラグが必要でした。)

Search_tmp
質問者

お礼

お付き合いいただきありがとうございます! >実際のところはDOMの親子ではなく、ドキュメント経由になっていることは同じ 確かにそうでした。 お恥ずかしいんですが、先程までこの意味がわからず、 「DOMの親子」関係から追っていく方法がばかり探していました。 いただいたソースのように、視点を変えるもの大切ですね。 とてもとても勉強になります。 読み込みのタイミングについては jQuery.event.add(window, "load", function(){ で最後にしていますので、難なくidが取れました。(的外れだったらすみません) jsは読み込みのタイミングにいつも悩まされます。。。 意図を汲みとっていただき、 すごく助かりました。

その他の回答 (1)

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.1

ちゃんと調べてはいないので、ヒントにでもなれば… フレーム内のドキュメントと親ドキュメントは別物なので、そのままのDOM操作では取得できません。 ご質問が子から親へなのか親から子へなのかよくわかりませんが、 >jQuery("div#main iframe").contents().find('body'). の記述から、子フレーム内のthis値から親ドキュメントを取得したいのだろうと推測して、 適当に実験してみたところ var hoge = this.ownerDocument.defaultView || this.ownerDocument.parentWindow; hoge = hoge.parent.document; みたいにすることで、一応、親のドキュメントを取得可能みたい。 (クロスドメインではないことが前提。 || はff用とIE用) でも、親ドキュメントは自分のはずなので、こんな面倒なことをしなくても直接  document~ の記述でもOKのはずです。 直接にiframe要素を取得するのは無理かと思いますが、iframeが沢山あって、そこから親要素内のiframe要素を取得したいとかであるなら、パラメータとしてiframeのidや要素そのものを渡しておくようにすれば、取得が簡単になると思います。 (↑)の例は、仕様をちゃんと確認してはいません。 標準モードと互換モードで違いがあるかも知れませんし、ブラウザのバージョンによっても挙動が異なるかも。 その他いろいろ、ご自身でご確認ください。

Search_tmp
質問者

お礼

ありがとうございます! ご認識の通り、子から親です。 ページ内に複数のiframeが存在しており、 あるiframeにフォーカスしたら、それを囲うdivのidを拾いたい というのが、始まりでした。(なので、jQuery('this')から上に追ってました) 純粋なjsの記述に疎いので、いただいたソースがうまく活用できるか不安ですが、 取りあえずトライしてみます。 jQueryで親から子は >jQuery("div#main iframe").contents().find('body'). でいけるのに、子から親は無理なんですね。。。

関連するQ&A

  • jQuery 複数のfind()

    ID hogeの中のimgとiframeのsrcを取得したいです。 imgだけなら、こう書きます。 $('#hoge').find('img').each(function(){ alert($(this).attr('src'); }); imgとiframeの両方としたい場合、どうしたら良いでしょうか? いっぺんに取れない仕様の場合、find('img')とfind('iframe')で取得したオブジェクトを マージする方法でもよいです。 以上、よろしくお願いいたします。

  • 親フレームのjQueryオブジェクトを使えるか?

    html(親html)上に別のhtml(子html)を<iframe>で表示しています。 親htmlではjQuery(v1.8.2)を使用しています。 子htmlでもjQueryを使いたいです。 単純に子htmlでjquery.jsを読み込めば良いですが、勉強のため以下のように親htmlのjQueryオブジェクトを使って実現してみました。 【子htmlのscript】 var $ = parent.jQuery; $(window).load(function() {   $("body", document).append( "hoge" ); }); これで見た目は正しく動作してますが、以下の不明点が出てきたので質問させて下さい。 【質問】 $(window).loadではなく$(document).readyを使った場合は"hoge"が追加されていませんでした。 <body>要素がまだ読み込めていないせいかとも思いましたが、documentの読み込み完了後に実行されているはずです。 なぜ"hoge"が追加されないのでしょう? このdocumentは親htmlのdocumentなのでしょうか? ただ、$("body").append( "hoge" )と書いた場合は親htmlに"hoge"が追加され、$("body", document).append( "hoge" )と書くことで子htmlに"hoge"が追加されるようなので、親htmlのdocumentではない気がします。 よろしくお願いします。

  • jQueryで指定した要素自身のHTML

    jQueryを使用していて困っています。 下記の様なHTMLがある場合に <div id="hoge">   <div id="first">hoge</div>   <div id="second">hogehoge</div>   <div id="third">hogehogehoge</div> </div> “<div id="second">hogehoge</div>”を取得したいです。 $("#second").html()では、   hogehoge が取得されることになりますし、 $("#hoge").html()では、   <div id="first">hoge</div><div id="second">hogehoge</div><div id="third">hogehogehoge</div> が取得されることになると思います。 $("#second").wrap("<div class='target'></div>")して、 $(".target").html()を取得しても良いのですが、 他のところで影響がでそうで怖いので、できれば避けたいです。 (殆ど完成状態にありますので……) 何か良い方法はありますでしょうか?

  • jQueryのカスタムデータ属性追加について

    いつもこちらでお世話になっています。 jQueryでカスタムデータ属性(data-*)を新規追加するにはどう記述すれば良いのでしょうか。 html側にはカスタムデータ属性が未設定の状態です。 以下の方法で試してみましたが、カスタムデータ属性を取得すると「NaN」となっています。 【html】  <div id='hoge'>hogehoge< /> 【jQuery】  $(#hoge).attr({ 'data-a': 'A', 'data-b': 'B' }); よろしくお願いいたします。

  • htmlのiframeについて

    iframeを使用する際に特定のidのエリアのみ表示させることはできますか? 例:取得先サイト ■ヘッダ ■コンテンツ1(id="area1") ■コンテンツ2(id="area2") ■フッタ 取得元のサイト(表示させたいサイト)に、上記サイトのコンテンツ2だけを引っ張ってきたいと考えています。 ヘッダやコンテンツ1、フッタはiframeに表示させたくありません。 コンテンツ2のみiframeに表示させたいです。 こういったことは可能でしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • HTML
  • jsp内iframe(cgi)へjspデータを渡す

    はじめまして、現在jspでプログラムされたページのiframe内に perl(cgi)で組んでいるアンケートフォームを設定しております。 こちらのcgi内にjspのセッションデータを受け渡すことは可能でしょうか? 現在、色々と試行錯誤しておりますが、うまくいきません。 もし可能であれば、どなたか具体的な方法を教えていただけますでしょうか? 現在は下記のように試していることです。 ■1.jsp <input type="hidden" name="hoge" value="<%=getString(session, " hoge")%>"> こちらのhogeのvalueデータを、 ■2.jsp 親フレームの2.jspには上記のhogeセッションは反映しておりますが、 2.jsp内の下記、iframe内のcgiに反映できません。 <iframe src="http://www.hoge.com/cgi-bin/hoge.cgi" style="width:600px; heigh t:600px; scrolling:no; valign:top;" frameborder="0" method="post" name="hoge" value="<%=getString(session, "hoge")%>"></iframe> 宜しくお願いいたします。

    • ベストアンサー
    • Java
  • CGIをiframeで読み込んだ物に間隔を空けたい

    HTMLでホームページを作ってます。 ホームページの中にチャットを作ろうと思いCGIをDLし、HTMLの中にiframe文で読み込むことに成功しました。 その際、iframeで読み込むCGIが2つあり、画面が2つに別れてしまうのが嫌で、iframeをdivで囲み、 folat:leftで回り込ませ、最初のiframeの下に2つ目のiframeで読み込んだ物が来るようにしました。 これでいちお、成功したと思ってるのですが、 できればこれらを同じ間隔で中央に寄せたいのですが,marginで間隔を空けようとしても空くことができません。 他に方法が無いかと思い質問させていただきました。 下記プログラムです。 ちなみにCGIソース元はkentさんのところです。http://www.kent-web.com/chat/ <div id=sample1> <iframe name="form" src="./comchat.cgi?mode=form&nam=&eml=&col=&retime=40&line=20" width="900" height="200"></iframe> <iframe name="log" src="./comchat.cgi?retime=40&line=20" width="900" height="900"></iframe> </div> </body> sample1{ float:left: }

    • ベストアンサー
    • HTML
  • JQueryのセレクタ

    jqueryでセレクタの取得をしたいのですがうまくいきません div要素の中のspan要素を取得したいのですがclassで取得すると重いのでid属性で場所を限定してからclass属性で絞り込みたいです こんな感じにしたらだめでした $("#hoge.foo").html('ほげ'); html <div id=hoge> <span class=foo></span> </div>

  • HTMLのIFRAMEについて教えて

    HTMLのIFRAMEについて教えて欲しいのですが、 例えば、cgiの入力項目で、数字の1を入力した場合、aaa.htmlというページ内にあるIFRAMEで囲まれた エリア内に、1の写真が表示できるようにしたいのです。 現在、以下のような記述をしているのですが、IFRAMEの部分がエラーになってしまうのです。(>_<) noには、数字の変数が入っています。 他の方法でも結構なのですが、数字によってIFRAME内に表示される写真を変えたいのです。 どなたか、宜しくおねがいします。 <script type="text/javascript"> <!-- switch(no){ case 0: id = "01.jpg"; break; case 1: id = "02.jpg"; break; case 2: id = "03.jpg"; break; default : id = "00.jpg"; break; } // --> </script> <iframe src="id" name="picture" width="300" height="300"></iframe>

    • ベストアンサー
    • HTML
  • jQueryのcontainsフィルターについて

    こんにちは。 jQueryについてご質問があります。 jQueryのcontainsフィルターで要素を取得できなくて困っております。 たとえば以下のようなHTMLがあるとします。 ======================== <g class="parent"> <text width="50" height="50" x="10" y="10"><tspan>abc</tspan></text> </g> ======================== このときtspan要素を取得したい場合、 $("g.parent text tspan:contains('abc')"); のようにしても取得できないのです。 例えば次のパターンの場合 ========================= <section class="parent"> <p><span>abc</span></p> </section> ========================= $("section.parent p span:contains('abc')"); というコードを実行すると正確にspan要素を取得できます。 前者の場合はなぜ取得できないのでしょうか? ご教示よろしくお願いいたします。

専門家に質問してみよう