Browsers typically don't allow a child tab/window to close its opener with script. And yet they do allow the child to alter the location of the opener tab/window.
Questo non è completamente accurato. Se leggi più attentamente il testo MDN citato, in realtà si riferisce all'apertura di parent , non della relazione con popup . La restrizione attuale che stai probabilmente incontrando è:
- Gli script possono solo chiudere le finestre originariamente aperte dallo script.
Quindi nel tuo esempio specifico, popup è stato aperto da uno script, ma opener è stato aperto da un utente e quindi opener non può essere close d da solo o popup .
Immagina uno scenario in cui ci sono due popup
- Scheda aperta dall'utente (non può essere
close d)
- Popup 1 (
opener è una scheda aperta dall'utente)
- Popup 2 (
opener è popup 1)
Popup 2 può close popup 1 in questo scenario.
Tuttavia, il popup 1 non può close della scheda aperta dall'utente perché viola la regola precedente.
-
In Chrome & Firefox, non importa se popup s sono la stessa origine di opener s. Il popup può modificare location o close il opener come desiderato, soggetto al mio primo punto sopra.
-
In IE11, il popup può close il parent , ma non può cambiare parent.location a meno che non soddisfi Stessa politica dell'origine . (si ottiene un nuovo popup se si tenta)
Inoltre, vorrei chiarire che qualsiasi opener può close il proprio popup s o modificare il loro location senza restrizioni. L'accesso ai contenuti popup è ancora soggetto alla stessa politica di origine per motivi di sicurezza.
This leads to a curious workaround whereby you can create a page that does nothing but close itself with script as soon as its loaded, and then change the location of the parent tab/window to this new page, effectively closing it. ... does this workaround effectively create a back door?
Per rispondere direttamente alla tua domanda, non esiste una tale soluzione alternativa. L'esempio collegato produrrà l'errore:
Scripts may not close windows that were not opened by script.
A meno che tu non sia in una situazione a 2 popup come ho spiegato sopra, nel qual caso il popup potrebbe solo close il suo opener direttamente. Tuttavia, la soluzione non sarebbe necessaria in questo caso.