javascript - window.open(url, '_blank'); fungerer ikke på iMac/Safari
Jeg har laget en nettside som lar deg velge et sidenavn fra en nedtrekksliste og deretter overfører nettleseren til den siden. Koden som gjør overføringen er
if (url){
window.open(url, '_blank');
}
der "url" er siden som er valgt.
En console-logg rett før window.open-linjen skriver ut noe som dette:
executing: window.open('http://www.mywebsite.com/44/threats.html', '_blank')
og deretter åpner nettleseren siden i en ny fane.
Dette fungerer fint på Windows 7 for alle nettlesere, inkludert Safari.
På en iMac fungerer det for Firefox, men ikke for Safari.
Vet noen hvorfor iMac/Safari ikke gjør dette?
Svar #1
Safari blokkerer alle kall til window.open() som gjøres inne i et asynkront kall.
Løsningen jeg fant på dette problemet er å kalle window.open før jeg gjør et asynkront kall og sette plasseringen når løftet blir oppfylt.
var windowReference = window.open();
myService.getUrl().then(function(url) {
windowReference.location = url;
});
Svar #2
Bruke setTimeout
REDIGER: Noen få mennesker rapporterer at denne metoden ikke fungerer lenger på den nyeste Safari.
Å pakke inn linjen din window.open(url, '_blank') i den asynkrone funksjonen med en setTimeout fungerer også,
setTimeout(() => {
window.open(url, '_blank');
})
setTimeout-kode kjører på hovedtråden, i stedet for den asynkrone. Testet i Chrome og Safari.
Svar #3
For å bruke window.open() i Safari må du legge det i et elements onclick-hendelsesattributt.
For eksempel: <button class='btn' onclick='window.open("https://www.google.com", "_blank");'>Åpne Google-søk</button>
Svar #4
Du kan ikke stole på window.open fordi nettlesere kan ha forskjellige retningslinjer. Jeg hadde det samme problemet og brukte koden nedenfor i stedet.
let a = document.createElement("a");
document.body.appendChild(a);
a.style = "display: none";
a.href = <your_url>;
a.download = <your_fileName>;
a.click();
document.body.removeChild(a);
Svar #5
window.location.assign(url) fikser window.open(url)-problemet på iOS-enheter
Svar #6
Hentet fra kommentaren til de aksepterte svarene av Steve den 20. desember 2013:
Faktisk er det en veldig enkel måte å gjøre det på: bare fjern avmerkingen for «Blokker popup-vinduer» i iMac/Safari-nettleseren, så gjør den det jeg vil.
For å klargjøre, når du kjører Safari på Mac OS X El Capitan:
- Safari -> Innstillinger
- Sikkerhet -> Fjern merkingen for 'Blokker popup-vinduer'
