Вопрос по html, javascript, iframe – Поймать window.open из JavaScript

2

У меня есть веб-страница в HTML-iframe, веб-страница имеет функцию javascript для открытия ссылок, эта функция использует метод window.open, чтобы открыть новое окно.

Я не могу изменить функцию javascript (страница сделана с помощью mapguide), поэтому я хочу перехватить этот вызов за пределами iframe, чтобы поместить содержимое нового окна в модальный фрейм ajax вместо открытия нового окна, возможно ли это ?

Если кадры принадлежат одному домену и порту, вы можете переопределить функцию window.open, чтобы сделать что-то еще, что вы хотите. Gabriel Gartz
Я забыл упомянуть, что я делаю свою веб-страницу в asp.net, c # Naty Bizz

Ваш Ответ

3   ответа
3

вы можете переписать определениеwindow.open работать в iframe, предполагая, что ваша страница и 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)
    };
}
Я пытался это сделать, но после выполнения "frame.contentWindow.open" строка, которую я получаю: «frame.window имеет значение null или не является объектом»; Я запускаю это в Internet Explorer 8, это мой код: var d = document.getElementById (& quot; ifr & quot;); // мой фрейм if (d) {var ifropen = d.contentWindow.open; d.contentWindow.open = function (url, windowName, windowFeatures) {alert (windowFeatures); вернуть orgOpen (url, windowName, windowFeatures); } d.window.open (& quot;stackoverflow.com"); } Naty Bizz
не могли бы вы дать мне больше информации о моем неправильном коде? Naty Bizz
@NatyBizz, вам не хватает; после назначения новой функцииd.contentWindow.open и у вас есть дополнительный; в вашем звонкеd.window.open.
@NatyBizz, у вас есть куча синтаксических ошибок в вашем коде.
0

что «mapguide» контент подается из другого домена, чем страница, содержащая iframe.

Если это так, вам необходимо «прокси». «картограф» content - т.е. ваш iframe должен будет загрузить содержимое картографа с URL-адреса другого скрипта (я буду использовать PHP для этого примера) на ваш сервер, чей код будет извлекать "mapguide" программное обеспечение, откуда бы оно ни происходило. Эта часть проста, и код на стороне сервера может выглядеть так:

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

    // alter content here

    print $content;
?>

Iframesrc Атрибут должен указывать на файл PHP на вашем сервере, который содержит этот код (вместо сервера «mapguide»).

Если «mapguide» Контент содержит ссылки HTML, загружает файлы CSS / JavaScript или выполняет вызовы AJAX, и тогда вам потребуется, чтобы ваш код на стороне сервера переписал эти URL-адреса, чтобы вернуться к вашему серверу. Эта часть не очень проста и действительно зависит от того, насколько сложным является «mapguide». JavaScript есть.

Так что после комментария выше, что говоритalter content hereВы должны сделать несколько ужасных замен регулярного выражения (или проанализировать и заново сгенерировать) HTML, содержащийся в$contentс целью изменения каждого URL-адреса для прохождения через ваш «прокси-сервер» PHP-скрипт и его можно загрузить из соответствующего места на «mapguide» сервер.

Если вам удастся выполнить все это, тогда ваш iframe будет сервером из того же домена, что и содержащая HTML-страница, и, следовательно, JavaScript внешней страницы сможет заменитьwindow.open Функция iframe - предотвращать всплывающее окно или делать все, что вы хотите вместо этого - как говорит @jbabey в другом ответе.

Все это предполагает, что «mapguide» Контент не поставляется с пользовательским соглашением и / или политикой авторских прав, которая запрещает "удаление". (автоматически копируя) их (содержание авторов картографического содержимого).

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

Похожие вопросы