Catch the window.open von Javascript

Ich habe eine Webseite in einem HTML-Iframe, die Webseite hat eine Javascript-Funktion zum Öffnen von Links, diese Funktion verwendet die window.open-Methode, um ein neues Fenster zu öffnen.

Ich kann die JavaScript-Funktion nicht ändern (die Seite wird mit Mapguide erstellt), daher möchte ich diesen Aufruf außerhalb des Iframes abfangen, um den Inhalt des neuen Fensters in einen Ajax-Modal-Frame zu setzen, anstatt ein neues Fenster zu öffnen. Ist dies möglich? ?

 Gabriel Gartz04. Apr. 2012, 15:24
Wenn die Frames von derselben Domäne und demselben Port stammen, können Sie die Funktion window.open außer Kraft setzen, um etwas anderes zu tun, das Sie möchten.
 Naty Bizz04. Apr. 2012, 22:39
Ich habe vergessen zu erwähnen, dass ich meine Webseite in asp.net erstelle, c #

Antworten auf die Frage(3)

Lösung für das Problem

können Sie die Definition von überschreibenwindow.open Funktion im Iframe, vorausgesetzt, Ihre Seite und der Iframe befinden sich in derselben Domäne, um XSS-Sicherheitsfehler zu vermeiden.

HTML:

<code><iframe id="myFrame" src="...">
</iframe>
</code>

Javascript im übergeordneten Fenster:

<code>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)
    };
}
</code>
 Naty Bizz04. Apr. 2012, 23:02
Kannst du mir bitte mehr Details über meinen falschen Code geben?
 jbabey04. Apr. 2012, 22:55
@ NatyBizz Sie haben eine Reihe von Syntaxfehlern in Ihrem Code.
 Naty Bizz04. Apr. 2012, 22:38
Ich habe es versucht, aber nach der Ausführung der Zeile 'frame.contentWindow.open' erhalte ich: 'frame.window ist null oder kein Objekt'; Ich führe dies im Internet Explorer 8 aus. Dies ist mein Code: var d = document.getElementById ("ifr"); // mein Frame if (d) {var ifropen = d.contentWindow.open; d.contentWindow.open = function (url, windowName, windowFeatures) {alert (windowFeatures); return orgOpen (url, windowName, windowFeatures); } d.window.open ("stackoverflow.com "); }
 jbabey05. Apr. 2012, 15:20
@ NatyBizz Ihnen fehlt ein; nachdem Sie eine neue Funktion zugewiesen habend.contentWindow.open und du hast eine extra; in deinem Anruf and.window.open.

Mapguide'-Inhalt von einer anderen Domain bereitgestellt wird als die Seite, die den Iframe enthält.

In diesem Fall müssten Sie den "Mapguide" -Inhalt "vertreten", dh, Ihr Iframe muss den Mapguide-Inhalt von einer anderen Skript-URL (für dieses Beispiel nehme ich PHP an) auf Ihren Server laden, dessen Code würde die 'Mapguide'-Software von jedem Ort abrufen, von dem sie wirklich stammt. Dieser Teil ist einfach und der serverseitige Code könnte folgendermaßen aussehen:

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

    // alter content here

    print $content;
?>
</code>

Der Iframesrc Das Attribut sollte auf die PHP-Datei auf Ihrem Server verweisen, die diesen Code enthält (anstelle des 'mapguide'-Servers).

Wenn der 'Mapguide'-Inhalt HTML-Links enthält, CSS- / JavaScript-Dateien lädt oder AJAX-Aufrufe ausführt, muss Ihr serverseitiger Code diese URLs neu schreiben, um auf Ihren Server zu verweisen. Dieser Teil ist nicht sehr einfach und hängt davon ab, wie kompliziert der 'Mapguide' JavaScript ist.

Also nach dem Kommentar darüber heißt esalter content hereMüssten Sie einige schreckliche reguläre Ausdrücke ersetzen (oder analysieren und neu generieren), die in HTML enthalten sind$content, mit dem Ziel, jede einzelne URL so zu ändern, dass sie Ihr "Proxy" PHP-Skript durchläuft und von der entsprechenden Stelle auf dem "Mapguide" -Server geladen wird.

Wenn Sie all das schaffen, wird Ihr iframe Server von derselben Domain wie Ihre HTML-Seite sein, sodass das JavaScript der äußeren Seite das ersetzen kannwindow.open Funktion des Iframes - um das Popup zu verhindern oder zu tun, was immer Sie wollen - wie @jbabey in einer anderen Antwort sagt.

All dies setzt voraus, dass der Inhalt von 'mapguide' nicht mit einer Benutzervereinbarung und / oder einer Urheberrechtsrichtlinie versehen ist, die das "Abschaben" (automatische Kopieren) des Inhalts (des Autors von 'mapguide' Inhalten) verbietet.

Hier ist ein ähnlicher Ausschnitt, an dem ich gearbeitet habe ... es war schwierig, das contentWindow richtig zu machen, aber vielleicht bietet dies einen Einblick?

<code>//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
</code>

Ihre Antwort auf die Frage