• 締切済み

フレーム内の要素へのXPATHはどのように書けばよいのでしょうか?

フレーム内の要素へのXPATHはどのように書けばよいのでしょうか? また、それは可能なのでしょうか? 実際には、firefoxのgreasemonkey で、フレームを使ったページ内のテーブル内のデータを取得したいと考えています。 下記のようにやればできるかと思ったのですが、できないようです・・・ var xpath ='/html/frameset/frame[2]/html/body/table/tbody'; var tbody = document.evaluate(xpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.contentDocument; alert(tbody.rows[0].cells[0].firstChild.data); 対象としているサイトの構造は、下記のようになっています。 2つのフレームを含むソース <HTML> <HEAD> <meta http-equiv="Content-Type" content="text/html; charset=x-sjis"> <TITLE>ほげほげ</TITLE> <FRAMESET ROWS="88,*"> <FRAME SRC="frame1.html" NAME="FRM1"> <FRAME SRC="frame2.html" NAME="FRM2"> </FRAMESET> </HTML> frame2.html <HTML> <HEAD> <meta http-equiv="Content-Type" content="text/html; charset=x-sjis"> <TITLE>フレーム2</TITLE> </HEAD> <BODY> <TABLE border="0"> <TR><TD>データ1</TD>・・・</TR> ・・・・・ </TABLE> </BODY> </HTML> 以上です。 はたしてできるのかどうかもわからない状態です。 どうぞ宜しくお願い致します!!!

  • gwky
  • お礼率45% (5/11)

みんなの回答

回答No.3

>#1 お礼 サンプルでは,それも考えてframeset要素のonload属性で発動するようにしてあるの。

gwky
質問者

お礼

ご回答ありがとうございます。 greasemonkeyの場合、Q4549731-1.xhtml がロードされた後にスクリプトの実行が開始するため、 frameset に onload で関数を実行する処理を追加することができないように思われます。 tbody が nil だったら、所定時間待機するような処理を加えようかと考えています。 もしも、親ページのhtmlを変更することなく、子フレームのロードが 完了したかどうかを確認する方法がありましたらご教示ください。

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.2

前にiframeへアクセスするには っていう質問に答えた事があったけど それが参考になるかな? http://okwave.jp/qa2826529.html まずは通常のjavascriptとしてframe越えでデータをもってきてから希望の処理にかける方が無難だと思うよ

回答No.1

=============Q4549731-1.xhtml===================== <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Q4549731 TestCase 1</title> <script type="text/javascript"> //<![CDATA[ function init(){ //greasemonkey使ったことないし,当面使う気もないからそっちでは検証してない //質問文のように続けて一つにまとめるのは無理。 //手元で実験したのは全てXHTMLですが,HTMLでも,XPath中の名前空間接頭辞を取り除き //evaluateメソッドに名前空間リゾルバを指定しなければ動くと思います。 //あと、gooはURIっぽい文字列(http://の後に連続するSP以外のprintableなASCII文字からなる //文字列の中で最長のものの後ろにNO WIDTH SPACEをつけるので取り除いて各XHTML文書をwell-formedにしてから //やってみてください。 var doc= document.getElementById("hoge").contentDocument; var xpath ="/xhtml:html/xhtml:body/xhtml:table/xhtml:tbody"; //コンテキストノードが属するドキュメントでないと,document.evaluateが通用しません。 //document関数で出来るかな、とも思ったけど、document関数はXPath 1.0にはない。あるのはXSLT 1.0 //個人的な好みで,FIRST_ORDERED_NODEではなくなってます。 var tbody = doc.evaluate(xpath, doc, resolveNamespace, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); //DOM Level 2 HTMLで、HTMLTableSectionやHTMLTableElementにはcellsはない //ちなみにHTMLの時にFirefoxが,書かれていないように見えるtbody要素を補うのは妥当。HTML 4.01とXHTML 1.0の //table要素型,tbody要素型の定義は異なる。前者はtbodyが1つ以上必須だが,tbodyの開始タグ・終了タグが省略可能 //後者はなくてもよい alert(tbody.snapshotItem(0).getElementsByTagName("tr")[0].getElementsByTagName("td")[0].textContent); } function resolveNamespace(s){ //本来はHashTable等でまともに実装すべき if (s == "xhtml"){ return "http://www.w3.org/1999/xhtml"; }else{ throw new Error("invalid prefix"); } } //]]> </script> </head> <frameset cols="50%,50%" onload="init();"> <frame id="hoge" src="Q4549731-2.xhtml" /> <frame src="Q4549731-3.xhtml" /> </frameset> </html> =====================Q4549731-2.xhtml============== <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Q4549731 TestCase 1</title> </head> <body> <table> <tbody> <tr><td>あ</td></tr> </tbody> </table> </body> </html> =====================Q4549731-3.xhtml============== <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Q4549731 TestCase 1</title> </head> <body> <p>い</p> </body> </html>

gwky
質問者

お礼

ご回答いただきましてありがとうございます!! 私が取得したいサイトでは、フレームにIDがついていないので、 var doc= document.getElementById("hoge").contentDocument; はできませんでした。 そこで、ヒントにさせていただいて、ここもxpathを使ってやろうとして、 下記のようにやったら、うまくいきました。 しかし、alert をコメントにすると、うまくいく場合と、いかない場合と、が出てしまいます。フレームの読み込みが完了していないときに 実行される場合があるということなのでしょうか・・・。 alertをなくしてもうまくいく方法をご存知でしたら教えていただけませんでしょうか? var xpath ='/html/frameset/frame[2]'; // なぜかわからないけど、alertが必要 alert("hoge"); var aframe = document.evaluate(xpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.contentDocument; var xpath ='/html/body/table/tbody'; var tbody = aframe.evaluate(xpath, aframe, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotItem(0); alert(tbody.rows[1].cells[1].firstChild);

関連するQ&A

  • フレームページに文字が表示されなくて困ってます><

    フレームページに文字が表示されなくて困ってます>< フレームページは表示されるのですがmenu.html.htmlやcontents.html.htmlに書いた文字が表示されません どこが間違っているのでしょうか? ーーフレームページーー <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <META http-equiv="Content-Style-Type" content="text/css"> <TITLE>タトル</TITLE> </HEAD> <FRAMESET cols="100,*"> <FRAME name="menu.html.html" src="file:///D:/happystyle/menu.html.html"> <FRAME name="contents.html.html" src="file:///D:/happystyle/contents.html.html"> <NOFRAMES> <BODY> <P>このページを表示するには、フレームをサポートしているブラウザが必要です。</P> </BODY> </NOFRAMES> </FRAMESET> </HTML> ーーmenu.html.htmlーー <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"> <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <META http-equiv="Content-Style-Type" content="text/css"> <TITLE>タイトル</TITLE> </HEAD> <BODY> 画像置き場 </BODY> </HTML> ーーcontents.html.htmlーー <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"> <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <META http-equiv="Content-Style-Type" content="text/css"> <TITLE>タイトル</TITLE> </HEAD> <BODY> 画像表示 </BODY> </HTML> というHTMLを書きました! フレームに表示させたいページのHTMLはフレームと同じフォルダに入っているのですがこれと関係ありますか? どこがおかしいのかまったくわからないです 教えてください!

  • fc2においてのフレームページについて

    fc2で作ったページをメモ帳でフレームページにしているのですが fc2にアップロードしてプレビューすると 左のメニュー欄しかでないんです。 右のメインでは最初から出てくるページも メニューで指定することででてくるページも 全部404Error - Page not foundになります。 色々見渡して確認してみましたが、まだどこか見落としているみたい ですので、どうか、間違いを指摘してくれませんでしょうか。 HTMLは以下のように作成しました :ファイルframe.html: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"> <HTML> <HEAD> <TITLE>てすと</TITLE> </HEAD> <FRAMESET cols="180,*"> <FRAME src="m.menu.html" name="menu"> <FRAME src="top.html" name="main"> <noframes> <body> <p>このサイトはフレームを使用しております</p> </body> </noframes> </frameset> </html> ファイルright.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ja" xml:lang="ja"> <head> <title>てすと2</title> <meta content="text/html; charset=SJIS" http-equiv="Content-Type" /> <meta content="text/css" http-equiv="Content-Style-Type" /><style type="text/css"> <!-- 色ははしょります --></style></head> <body><h6 style="text-align: center">&nbsp;<a href="てすと3"target="main"><img alt="" src="イラストのアド" /></a>&nbsp;</h6> (本当はもっとあります; :ファイルleft.html: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ja"> <head> <title>top</title> <meta http-equiv="Content-Type" content="text/html; charset=SJIS" /> <meta http-equiv="Content-Style-Type" content="text/css" /><style type="text/css"> <!-- body { 色はしょります --></style> </head> <body> <p style="text-align: center">いろいろ</p> </body> 何が駄目なのでしょうか・・ もしかしたらほんのささいなことかもしれませんが ご指摘お願いします、もし表示が不十分でしたら後に追加します

  • ファイヤーフォックスでは、フレームが表示されません。

    タイトル通りで、当方のホームページビルダーV6.5で作ったHPのフレームがファイヤーフォックスでは、表示されません。どうしたらいいか教えてください。 <フレームページ> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <META name="GENERATOR" content="IBM WebSphere Studio Homepage Builder Version 6.5.0.0 for Windows"> <META http-equiv="Content-Style-Type" content="text/css"> <TITLE></TITLE> </HEAD> <BODY></BODY> </HTML> <インデックスページ> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <META name="GENERATOR" content="IBM WebSphere Studio Homepage Builder Version 6.5.0.0 for Windows"> <META http-equiv="Content-Style-Type" content="text/css"> <TITLE></TITLE> </HEAD> <FRAMESET cols="15%,85%"> <FRAME src="newpage2.htm"> <FRAME src="newpage3.htm"> <NOFRAMES> <BODY> <P>このページを表示するには、フレームをサポートしているブラウザが必要です。</P> </BODY> </NOFRAMES> </FRAMESET> </HTML> よろしくお願いします。

  • ビルダー12のフレームを使ったページについて

    今ビルダー12でフレームを使ったページ作成をしているのですが メニューの中の「フレーム HTMLソース」という項目(タブ)があるんですが これはどういった部分に影響するところなんでしょうか?ページのデザイン等には 関係無いように思えますが…。 以下は今製作しているサイトの「フレーム HTMLソース」なんですが 「このページを表示するには、フレームをサポートしているブラウザが必要です。」 の文字はいつどこで表示されるものなのでしょうか? <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <META http-equiv="Content-Style-Type" content="text/css"> <META name="GENERATOR" content="IBM WebSphere Studio Homepage Builder Version 12.0.4.0 for Windows"> <TITLE></TITLE> </HEAD> <FRAMESET rows="146,*" frameborder="NO" border="0"> <FRAME name="top" src="header.html" scrolling="NO"> <FRAMESET cols="246,*" frameborder="NO" border="0"> <FRAME name="left" src="navi.html" scrolling="AUTO"> <FRAME name="right" src="contents_main.html"> </FRAMESET> <NOFRAMES> <BODY> <P>このページを表示するには、フレームをサポートしているブラウザが必要です。</P> </BODY> </NOFRAMES> </FRAMESET> </HTML>

  • フレーム内容が表示されない

    下記のようなページを読み込んだときに、フレームの内容が表示されません。ログを見ると、index.aspのみが読み込まれており、フレーム内のファイルが読み込まれていません。試しに全てをhtmlファイルにして読み込んでもNGでした。フレームをなくしてみるとindex.aspの内容は表示されます。ue.asp、sita.aspのファイルを内容はそのままで新規ファイルに置き換えてみると、たまに表示されます。表示・非表示の場合の規則性はありません。2つのファイルは、共に「うえ」「した」とbodyにテキスト表示しているだけです。 もしかすると、フレームタグ内の単純な書きミスなのかもしれないのですが、リファレンスと比べても違う箇所が分りません。ご教授お願いします。 作成は、VisualStudio6.0。表示検証は、IE6です。 <index.asp> <HTML> <HEAD> <% Response.AddHeader "Pragma", "no-cache" Response.AddHeader "Cache-control", "no-cache" %> <META HTTP-EQUIV="Content-Type" Content="text/html; charset=x-sjis"> <TITLE>new</TITLE> </HEAD> <body> <frameset rows="60,*"> <frame src="ue.asp" name="title" frameborder="0"> <frame src="sita.asp" name="body" frameborder="0"> </frameset> </BODY> </HTML>

  • フレームのスクロールバー表示について。

    お世話になっています。 フレーム表示について質問があります。 ページが表示できません。と表示していた際には、スクロールバーがあったのですが、リンクをつなげたら、一つにつながってしまいました。 どのようにすれば、表示されるようになるのでしょうか。 過去の質問を見ましたが分かりませんでした。 ソースは、 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>サイト</title> </head> <frameset cols="170, *" border="0"> <frame src="menu" name="menu"> <frame src="main" name="main"> <noframes> <body> このページをご覧頂くにはフレーム対応のブラウザが必要です。 </body> </noframes> </frameset> </html> 宜しくお願いします。

  • フレームが表示されない><

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <Html Lang="ja"> <Head> <Meta Http-equiv="content-type" Content="text/html; charset=Shift_JIS"> <Title>フレーム</Title> </Head> <Body> <Frameset Cols="20%,80%" Border="1" FrameBorder="1" BorderColor="#000000"> <Frame Src="menu.html" Name="Left" Scrolling="auto"> <Frame Src="home.html" Name="Right" Scrolling="auto"> </Frameset> <Noframes> このページはフレームに対応していないブラウザではご利用いただけません。 </Noframes> </Body> </Html> というHTMLを書きました。。。これをIEで表示させたのですが、真っ白のまま全然表示されません。。。なにか間違っているでしょうか? ちなみにフレームに表示させたいページのHTMLはフレームと同じフォルダに入っています。。 また、サーバにUPして試しても同じでした。サーバでも表示させたいページは同じファイル名にしてあるので、このまま使えると思うのですが、、、(使っているサーバではアドレスではなくUPしたファイル名を使うようになっている) ず~っとなやんでいますが、どこがおかしいのか全然わかりません。。教えてください。

    • ベストアンサー
    • HTML
  • フレームを下にスクロールさせた状態で表示するにはどうすればよいのでしょうか?

    フレームを下にスクロールさせた状態で表示するにはどうすればよいのでしょうか? 次のようなフレームを使ったHTMLにおいて、ページが表示されたときに、 f2と名前のついたフレームを100pxだけ下にスクロールさせた状態で表示するようにするには どうすればよいのでしょうか。 フレームf1、フレームf2ともに別のドメインのページを読み込んでいますので、 下記のHTMLの 【ここに記述する】 と書いてある場所に記述する方法は ないものでしょうか? <html> <head> <META http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>フレーム</title> <script type="text/javascript"><!-- // 【ここに記述する】 //--> </script> </head> <frameset rows="100,*" frameborder=0> <frame name="f1" src="http://www.hoge.com/"> <frame name="f2" src="http://www.foo.com/"> </frameset> </html> どうぞよろしくお願いします。

  • フレームを使ったページの全体の幅を固定したいのですが

    フレームを使ったページの全体の幅を固定したいのですが、どうやったら出来るのでしょうか? 基本的にフレームは使わないほうがいいとかそういうことではなくて、フレームを使ったページの全体の幅をたとえば780pxに固定できるか否か、出来るのならばその方法を教えてください。 サンプルを添付します。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd"> <html> <head> <meta http-equiv="Content-Language" content="ja"> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis"> <title></title> <style type="text/css"> .container { width: 780px; } </style> </head> <div class="container"> <frameset rows="180,*" cols="*" framespacing="2" frameborder="yes" border="2"> <frame src="header.html" name="topFrame" id="topFrame" title="topFrame"> <frameset cols="180,*" frameborder="yes" border="2" framespacing="2"> <frame src="mokuji.html" name="leftFrame" id="leftFrame" title="leftFrame"> <frame src="honbun.html" name="mainFrame" id="mainFrame" title="mainFrame"> </frameset> </frameset> </div> </html>

    • ベストアンサー
    • HTML
  • フレームページでの自動ジャンプ

    フレームページでA.htmlとB.htmlがあるんですが 自動的に他ページへ飛ばすタグ <META HTTP-EQUIV="refresh" CONTENT="3;URL=http://..."> がありますよね? 自動的へ飛ばすのをフレーム内B.htmlが切り替わるっていう風には できないでしょうか? ---現在--- <html> <head> <title>フレーム</title> <META HTTP-EQUIV="refresh" CONTENT="10;URL=http://..."> </head> <frameset rows="20%,*" frameborder="no"> <Frame name="A" src="A.html"> <Frame name="B" src="B.html"> </frameset> </html> ------ こうなってるんですができませんか? よろしくお願いします。

専門家に質問してみよう