2

私はHTML iframeにWebページを持っています。Webページにはリンクを開くJavaScript関数があり、その関数はwindow.openメソッドを使用して新しいウィンドウを開きます。

javascript関数を変更することはできません(ページはmapguideで作成されています)ので、新しいウィンドウを開く代わりに、新しいウィンドウのコンテンツをajaxモーダルフレームに入れるためにiframeの外側でその呼び出しをキャッチしたいのですが、これは可能ですか?

4

3 に答える 3

3

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)
    };
}
于 2012-04-04T13:38:25.537 に答える
0

'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.openiframeの機能を置き換えることができます-ポップアップを防ぐために、または代わりにあなたが望むものは何でも-@jbabeyが別の答えで言うように。

これらすべては、「mapguide」コンテンツに、(「mapguide」コンテンツの作成者)コンテンツを「スクレイピング」(自動的にコピー)することを禁止するユーザー契約および/または著作権ポリシーが付属していないことを前提としています。

于 2012-04-04T13:37:52.100 に答える
0

これは私が取り組んできた同様のスニピットです... 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
于 2014-06-13T16:31:58.880 に答える