2016-11-03 6 views
5

Ich habe ein Hauptfenster und ein Popup-Fenster. Popup-Fenster wird im Hauptfenster erstellt.window.onbeforeunload nicht in Chrome feuern, aber in Firefox arbeiten

Wie parent.php ist das Hauptfenster. Auf dieser Seite habe ich eine Funktion JavaScript, um die Seite, wie unten neu zu laden:

function popUpClosed() { 
    window.location.reload(); 
} 

Wir Popup-Fenster aus parent.php öffnen können. Jetzt möchte ich popUpClosed() Funktion auf parent.php von Popup-Fenster ausführen, wenn wir das Popup-Fenster schließen/navigieren.

Ich habe folgende Methoden versucht, um das gleiche zu erreichen.

Methode 1

window.onunload = window.onbeforeunload = function() { 
    if(window.opener && !window.opener.closed) { 
    window.opener.popUpClosed(); 
    } 
}; 

Methode 2

window.onbeforeunload = Call; 

function Call() { 
    if(window.opener && !window.opener.closed) { 
    window.opener.popUpClosed(); 
    } 
} 

Methode 3

window.onpagehide = function() { 
    window.opener.popUpClosed(); 
} 

Alles funktioniert in jedem Browser außer Google Chrome in Ordnung. Chrome löst keine der Funktionen aus.

Dies geschieht jedoch von den letzten 2-3 Tagen. Früher funktionierte alles in Chrome gut. (Möglicherweise wurde aufgrund der neuesten Chrome-Updates verursacht)

Jeder Vorschlag wird geschätzt.

+1

Konnte sehr wahrscheinlich ein Sicherheitsupdate sein.Es ist ein sehr pornsitähnlicher Gedanke, ein Fenster zu öffnen, wenn der Benutzer gehen möchte. Eine sicherere Version ist die Verwendung eines Mouseover auf einem Div im oberen Bereich des Fensters. Anthing in der Konsole? – mplungjan

+1

pagehide line ist falsch – epascarello

+0

@mplungjan tatsächlich Entwickler-Tools schließen, wenn wir das Fenster zu schließen. So kann ich die Konsole sehen. : D – vitorio

Antwort

-3

Sie können den Code unten versuchen:

ich die gemeinsame Funktion für offene erstellt habe das Pop-up-Fenster:

function PopupCenter(url, title, w, h) { 
     var dualScreenLeft = window.screenLeft != undefined ? window.screenLeft : screen.left; 
     var dualScreenTop = window.screenTop != undefined ? window.screenTop : screen.top; 

     width = window.innerWidth ? window.innerWidth : document.documentElement.clientWidth ? document.documentElement.clientWidth : screen.width; 
     height = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document.documentElement.clientHeight : screen.height; 

     var left = ((width/2) - (w/2)) + dualScreenLeft; 
     var top = ((height/2) - (h/2)) + dualScreenTop; 

     child = window.open(url, title, 'scrollbars=yes, width=' + w + ', height=' + h + ', top=' + top + ', left=' + left); 

     if (child.focus) { 
      child.focus(); 
     } 
    } 

Für das Kind Fenster Überprüfung geschlossen oder nicht, ich bin mit der setInterval Funktion und überprüfen, das Intervall wie folgt:

function checkChild() { 
    if (child != undefined && child.closed) { 
      //alert("Child window closed"); 
      clearInterval(timer); 
      location.reload(); 
     } 
    } 

DEMO

+5

Wie kann das die Bounty bekommen ... Es ist eine sehr schlechte Idee, Ereignisse durch setInterval zu ersetzen – Kaiido

1

Neueste Google Chrome hat ein Problem mit window.opener. window.opener Navigation in einem beforeunload/unload Handler wird in der neuesten Version ignoriert. Es gibt jedoch einen Workaround dafür. Versuchen Sie unter Code:

var btn = document.getElementById("btn"); 
 

 
function detectClick(event) { 
 
    var wind = window.open('urlhere', 'name', 'width=' + screen.width/2 + ', height=' + screen.height/2); 
 
    wind.onbeforeunload = function(){ 
 
    popupClosed(wind); 
 
    } 
 
} 
 
btn.addEventListener("click", detectClick, false); 
 

 
function popupClosed(wind) { 
 
    setTimeout(function() { 
 
    wind.opener.location.href = window.location.href; 
 
    }, 0); 
 
}
<input id= "btn" type="button" value="open popup" />

dieser Code nicht hier auf Stack Overflow ausgeführt wird, ABER ARBEITET IN BEIDE: Chrome UND Mozilla Firefox WENN DURCH jsfiddle ODER Server ausgeführt.

Hier ist ein funktionierendes Code: jsfiddle

here ist die Verbindung von Fehlerbericht, der beforeunload/unload handler Ausgabe bestätigt.

+0

Check [this] (https://bugs.chromium.org/p/chromium/issues/ Detail? id = 660496) link @Kaiido –

+0

Ah mein Schlechter, dieser Bug geht sogar durch die Hauptfensterfunktion. Aber IMO wäre eine bessere Lösung, das Timeout innerhalb der 'popupClosed()' Funktion zu platzieren. Ihre Antwort macht es ein wenig unklar, wie Sie das Problem von OP lösen. – Kaiido

+0

'popupClosed()' verwendet 'window.location.reload()' und nicht etwas wie 'element.location.reload();'. Es gibt kein Objekt des "Popup-Fensters", das es schwierig macht zu erklären, weshalb ich den vollständigen Code für diesen Zweck geschrieben habe. @Kaiido –

Verwandte Themen