2

我有一个网页变成了一个html iframe,网页有一个javascript函数来打开链接,那个函数使用window.open方法打开一个新窗口。

我无法修改 javascript 函数(页面是用 mapguide 制作的),所以我想在 iframe 之外捕获该调用,以将新窗口的内容放入 ajax 模态框架中,而不是打开一个新窗口,这可能吗?

4

3 回答 3

3

虽然我一般不建议这样做,但您可以覆盖window.openiframe 中函数的定义,假设您的页面和 iframe 在同一个域中,以避免 XSS 安全错误。

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

我假设“地图指南”内容来自与包含 iframe 的页面不同的域。

如果是这种情况,您需要“代理”“地图指南”内容——即:您的 iframe 将需要从您的服务器上的另一个脚本 URL(我将假设为 PHP)加载地图指南内容,其代码将从它真正来自的任何地方获取“地图指南”软件。这部分很简单,服务器端代码可能如下所示:

<? 
    $content = file_get_contents('http://mapguide.domain/path/to/contents');

    // alter content here

    print $content;
?>

iframesrc属性应指向服务器上包含该代码的 PHP 文件(而不是“地图指南”服务器)。

如果“地图指南”内容包含 HTML 链接、加载 CSS/JavaScript 文件或进行 AJAX 调用,那么您需要让服务器端代码重写这些 URL 以引用您的服务器。这部分不是很容易,实际上取决于“地图指南”JavaScript 的复杂程度。

因此,在上面的评论之后alter content here,您需要对包含在$content其中的 HTML 进行一些糟糕的正则表达式替换(或解析和重新生成),目的是更改每个 URL 以通过您的“代理”PHP 脚本和从“地图指南”服务器上的适当位置加载。

如果您设法取消所有这些,那么您的 iframe 将是与包含 HTML 页面相同域的服务器,因此外部页面的 JavaScript 将能够替换window.openiframe 的功能 - 以防止弹出,或者做不管你想要什么——正如@jbabey 在另一个答案中所说。

所有这些都假定“地图指南”内容不附带禁止“抓取”(自动复制)他们(“地图指南”内容的作者)内容的用户协议和/或版权政策。

于 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 回答