- ベストアンサー
iframe内からjQueryで親要素のIDを取得する方法
- jQueryを使用して、iframe内から親要素のIDを取得する方法について教えてください。
- parent()メソッドを使用すると、読み込み元のHTMLまでたどることができないようです。
- 他の方法でiframe内から親要素のIDを取得する方法はありますか?
- みんなの回答 (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(){~でもダメで、もう少しタイムラグが必要でした。)
その他の回答 (1)
- fujillin
- ベストアンサー率61% (1594/2576)
ちゃんと調べてはいないので、ヒントにでもなれば… フレーム内のドキュメントと親ドキュメントは別物なので、そのままの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や要素そのものを渡しておくようにすれば、取得が簡単になると思います。 (↑)の例は、仕様をちゃんと確認してはいません。 標準モードと互換モードで違いがあるかも知れませんし、ブラウザのバージョンによっても挙動が異なるかも。 その他いろいろ、ご自身でご確認ください。
お礼
ありがとうございます! ご認識の通り、子から親です。 ページ内に複数のiframeが存在しており、 あるiframeにフォーカスしたら、それを囲うdivのidを拾いたい というのが、始まりでした。(なので、jQuery('this')から上に追ってました) 純粋なjsの記述に疎いので、いただいたソースがうまく活用できるか不安ですが、 取りあえずトライしてみます。 jQueryで親から子は >jQuery("div#main iframe").contents().find('body'). でいけるのに、子から親は無理なんですね。。。
お礼
お付き合いいただきありがとうございます! >実際のところはDOMの親子ではなく、ドキュメント経由になっていることは同じ 確かにそうでした。 お恥ずかしいんですが、先程までこの意味がわからず、 「DOMの親子」関係から追っていく方法がばかり探していました。 いただいたソースのように、視点を変えるもの大切ですね。 とてもとても勉強になります。 読み込みのタイミングについては jQuery.event.add(window, "load", function(){ で最後にしていますので、難なくidが取れました。(的外れだったらすみません) jsは読み込みのタイミングにいつも悩まされます。。。 意図を汲みとっていただき、 すごく助かりました。