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:

  1. Safari -> Innstillinger
  2. Sikkerhet -> Fjern merkingen for 'Blokker popup-vinduer'

Relaterte artikler