レスポンスヘッダーに x-frame-options: SAMEORIGIN が設定されているとそのページは同一ドメインでないと IFRAME に読み込んで表示する事ができません。 さらに、x-frame-options: SAMEORIGIN が設定されていなくても、通常のブラウザであれば表示する事はできても、JavaScript でアクセスする事ができません。 IFRAME 内に x-frame-options: SAMEORIGIN の設定されていない WEB ページを表示してかつ、JavaScript で値を取り出せるのは HTA だけです。
<html> <head> <meta http-equiv="x-ua-compatible" content="ie=edge" /> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.1/css/bootstrap.css" /> <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/smoothness/jquery-ui.css"> <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script> <script> // ************************************* // デスクトップ中央 // ************************************* function centerWindow( w, h ) { // ウインドウの位置とサイズ top.resizeTo( w, h ); top.moveTo((screen.width-w)/2, (screen.height-h)/2 ) } </script> <script> // ウインドウの位置とサイズ centerWindow( 860, 600 ); // テーブルの行作成用 var row_data = ""; $(function(){ // レジストリキーの値一覧 $("#act").on("click", function(){ var domdoc = $("iframe[name='extend']").get(0).contentWindow.document; $(domdoc).find("#datalist p").each( function(idx){ row_data = $("<tr></tr>") .addClass("row_data") .appendTo( "#tbl" ); // 複製を取得して複製内の span を削除して // .end() で参照を p_clone に戻す var p_clone = $(this).clone().find("span").remove().end(); // 複製内の span を削除 // p 内にある span のテキスト $("<td></td>") .text($(this).find("span").text()) .appendTo( row_data ); // span が削除された p 内のテキスト $("<td></td>") .text(p_clone.text()) .appendTo( row_data ); }); }); // 再表示 $("#view").on("click", function(){ location.reload(true); }); // IE のドキュメントモードを表示 $("<div></div>") .text( document.documentMode ) .css( { "float" : "right", "color": "#808080", "font-size": "8px" } ) .insertBefore( $("p").eq(0) ); // ボタン表示位置微調整 $( ".btn" ).css({ "margin-top": "-4px" }); }); </script> <style> /* ブロックを左右に表示 */ .ttl { display: inline-block; width: 230px; vertical-align: top; } .entry { display: inline-block; } .line { margin-bottom: 0; } #head { padding: 16px; } /* DIV を Window 下部にフィット */ html,body { height: 100%; } body { margin: 0; } #head { padding: 16px; width: 100%; height: 120px; background-color: #e0e0e0; } .extend { padding: 4px 16px; display: block; margin-left: auto; margin-right: auto; width: calc( 100% - 3px ); height: calc( 100% - 120px - 2px ); border: solid 2px #c0c0c0; overflow: scroll; } /* テーブルのカーソル用 */ .row_data td, .row_data th { cursor: default!important; white-space: pre; } </style> </head> <body> <div id="head"> <p class="ttl"> 外部IFRAMEの内容を取り出す </p> <p class="entry"> <input id="act" class="ml-4 btn btn-outline-primary" type="button" value="一覧表示"> <input class="ml-4 btn btn-info btn-sm" id="view" type="button" value="再表示"> </p> <p class="line"></p> <h4 class="text-danger"></h4> </div> <div class="extend"> <table class="table table-hover"> <tbody id="tbl"> </tbody> </table> <br> </div> <iframe class="extend" name="extend" APPLICATION="yes" src="https://lightbox.sakura.ne.jp/demo/iframe_target.html"></iframe> </body> </html>
jQuery でテキストノードの文字列を取り出す 以下のような HTML では、テキスト がテキストノードにあたります。テキスト2 はテキストノードでは無いので、a に対するセレクタで取得できますが、テキストと同様の方法で取り出します。 参考 : [Javascript] jQueryでテキストノードを選択するにはどうすればよいですか?
<div id="datalist"> <p><span>18/07/23</span>テキスト</p> <p><span>18/07/22</span>テキスト</p> <p><span>18/07/18</span>テキスト</p> <p><span>18/07/16</span><a href="URL">テキスト2</a></p> <p><span>18/07/15</span><a href="URL">テキスト2</a></p> <p><span>18/07/15</span><a href="URL">テキスト2</a></p> </div></body>
IFRAME 内のドキュメント参照と .clone() と .end() 1) var domdoc = $("iframe[name='extend']").get(0).contentWindow.document で、DOM として IFRAME 内の document を取得します 2) テキストノードを取得する為に span を削除する必要があるので、clone() で同じものを作成してその中から span を削除します 3) 削除した段階で、参照が span に移行しているので、end() で一つ前に戻って、そこから text() でデータを取得します
var domdoc = $("iframe[name='extend']").get(0).contentWindow.document; $(domdoc).find("#datalist p").each( function(idx){ row_data = $("<tr></tr>") .addClass("row_data") .appendTo( "#tbl" ); // 複製を取得して複製内の span を削除して // .end() で参照を p_clone に戻す var p_clone = $(this).clone().find("span").remove().end(); // 複製内の span を削除 // p 内にある span のテキスト $("<td></td>") .text($(this).find("span").text()) .appendTo( row_data ); // span が削除された p 内のテキスト $("<td></td>") .text(p_clone.text()) .appendTo( row_data ); });
WEB ページのデータを HTA で自動的に取得したい場合、x-frame-options: SAMEORIGIN がなければそのまま使えます。しかし、一般的には欲しいページをダウンロードしてローカルに置いて読み込めば全てのページのデータをある程度自動取得できます。
|
【HTA ( HTMLアプリケーション )の最新記事】
- HTA / ADO / Jscript : Access( .accdb .mdb ) の読み込みと表示
- HTML Application : JavaScript で新しい Excel の Book を作成する
- HTML Application : JavaScript で Windows のいろいろなフォルダを開く
- HTA (または IE11) で フォルダ選択ダイアログからフォルダとファイルの一覧
- HTA (または IE11) で hostname を実行して標準出力からPC名の取得
- HTA (HTMLアプリケーション) で JavaScript と VBScript を混在させる手法 / GetObject を VBScript 側で使用する
- HTA + Basp21 + jQuery + twitter-bootstrap(4.1.1) でメール受信ツール
- HTA + Basp21 + jQuery + twitter-bootstrap(4.1.1) でメール送信ツール