私はHTML iframeにWebページを持っています。Webページにはリンクを開くJavaScript関数があり、その関数はwindow.openメソッドを使用して新しいウィンドウを開きます。
javascript関数を変更することはできません(ページはmapguideで作成されています)ので、新しいウィンドウを開く代わりに、新しいウィンドウのコンテンツをajaxモーダルフレームに入れるためにiframeの外側でその呼び出しをキャッチしたいのですが、これは可能ですか?
私はHTML iframeにWebページを持っています。Webページにはリンクを開くJavaScript関数があり、その関数はwindow.openメソッドを使用して新しいウィンドウを開きます。
javascript関数を変更することはできません(ページはmapguideで作成されています)ので、新しいウィンドウを開く代わりに、新しいウィンドウのコンテンツをajaxモーダルフレームに入れるためにiframeの外側でその呼び出しをキャッチしたいのですが、これは可能ですか?
window.open
これは一般的にはお勧めしませんが、XSSセキュリティエラーを回避するためにページとiframeが同じドメインにあると仮定して、iframeの関数の定義を上書きできます。
HTML:
<iframe id="myFrame" src="...">
</iframe>
親ウィンドウのjavascript:
var frame = document.getElementById('myFrame');
if (frame) {
frame.contentWindow.open = function (url, windowName, windowFeatures) {
// do whatever you want here (e.g. open an ajax modal frame)
};
}
'mapguide'コンテンツは、iframeを含むページとは異なるドメインから提供されると想定します。
その場合は、「mapguide」コンテンツを「プロキシ」する必要があります。つまり、iframeは、サーバー上の別のスクリプトURL(この例ではPHPを想定)からmapguideコンテンツをロードする必要があります。コードは、実際の場所から「mapguide」ソフトウェアをフェッチします。この部分は簡単で、サーバー側のコードは次のようになります。
<?
$content = file_get_contents('http://mapguide.domain/path/to/contents');
// alter content here
print $content;
?>
iframesrc
属性は、(「mapguide」サーバーではなく)そのコードを含むサーバー上のPHPファイルを指している必要があります。
'mapguide'コンテンツにHTMLリンクが含まれている場合、CSS / JavaScriptファイルをロードする場合、またはAJAX呼び出しを行う場合は、サーバー側のコードでそれらのURLを書き換えてサーバーを参照する必要があります。その部分はそれほど簡単ではなく、実際には「mapguide」JavaScriptがどれほど複雑かによって異なります。
したがって、上記のコメントの後で、「プロキシ」PHPスクリプトを通過するようにすべてのURLを変更することを目的として、にalter content here
含まれるHTMLに対していくつかのひどい正規表現置換を行う(または解析して再生成する)必要があります。 $content
'mapguide'サーバーの適切な場所からロードされます。
それをすべてやってのけることができれば、iframeは含まれているHTMLページと同じドメインのサーバーになるので、外側のページのJavaScriptがwindow.open
iframeの機能を置き換えることができます-ポップアップを防ぐために、または代わりにあなたが望むものは何でも-@jbabeyが別の答えで言うように。
これらすべては、「mapguide」コンテンツに、(「mapguide」コンテンツの作成者)コンテンツを「スクレイピング」(自動的にコピー)することを禁止するユーザー契約および/または著作権ポリシーが付属していないことを前提としています。
これは私が取り組んできた同様のスニピットです... contentWindow を正しく取得するのは難しかったですが、これで洞察が得られるのではないでしょうか?
//get a reference to the iframe DOM node
var node_iframe = document.getElementById("myiframe");
//get a reference to the iframe's window object
var win_iframe = node_iframe.contentWindow;
//override the iframe window's open method
win_iframe.open = function(strUrl,strName,strParams){
/* create an object (to substitute for the window object) */
var objWin = new Object;
/* save the open arguments in case we need them somewhere */
objWin.strUrl = strUrl;
objWin.strName = strName;
objWin.strParams = strParams;
/* create a blank HTML document object, so any HTML fragments that
* would otherwise be written to the popup, can be written to it instead */
objWin.document = document.implementation.createHTMLDocument();
/* save the object (and document) back in the parent window, so we
* can do stuff with it (this has an after-change event listener that
* pops a YUI Panel to act as a kind of popup) -- NOTE: the object in
* the parent window that we're saving this to has YUI Attribute installed
* and listens to changes to the objPopupWindow attribute... when it
* gets changed by this .set() operation, it shows a YUI Panel. */
parent.MyCustomClassObjectWithYUIAttributes.set('objPopupWindow', objWin);
/* return the object and all its members to whatever was trying to
* create a popup window */
return objWin;
};//end override method definition