Why does href _blank not open a new window?

Hvorfor Åbner target="_blank" Ikke Altid Ny Fane?

30/03/2024

Rating: 4.14 (14239 votes)

Det er en klassisk forventning på internettet: Når du klikker på et link, der er markeret med target="_blank", forventer du, at det åbner i en ny browserfane eller et nyt vindue. Dette er den standard HTML-adfærd, som de fleste webbrugere er vant til. Men hvad sker der, når denne simple forventning pludselig ikke indfries? Hvorfor forbliver du på den samme side, selvom linket tydeligt beder browseren om at åbne en ny fane? Svaret ligger ofte gemt i den diskrete, men kraftfulde indflydelse fra JavaScript, som kan overtage kontrollen med din klikoplevelse og tilsidesætte standard HTML-direktiver.

Why does href _blank not open a new window?
Fixed it by putting target="_blank" before href Your syntax for the target attribute is correct, but browsers need not honor it. They may interpret it as opening the destination in a new tab rather than new window, or they may completely ignore the attribute. Browsers have settings for such issues.
Indholdsfortegnelse

Forstå target="_blank" og Dets Intention

For at forstå, hvorfor target="_blank" nogle gange fejler, er det vigtigt først at huske, hvad det er designet til at gøre. Attributten target på et <a> (anker) element specificerer, hvor det linkede dokument skal åbnes. Værdien _blank er en foruddefineret nøgleord, der instruerer browseren om at åbne det linkede URL i et nyt, unavngivet browservindue eller en ny fane. Dette er især nyttigt for eksterne links, PDF-dokumenter eller andre ressourcer, som du ønsker, at brugeren skal kunne tilgå uden at forlade din nuværende side.

Når en bruger klikker på et sådant link, er browserens standardadfærd at oprette en ny kontekst (fane/vindue) og indlæse det angivne URL deri, mens den oprindelige side forbliver åben og aktiv. Denne adfærd er dybt indlejret i webstandarderne og forventes af de fleste internetbrugere. Problemet opstår, når et script intervenerer i denne proces og ændrer eller stopper den forventede adfærd.

JavaScriptets Rolle i Overstyringen

Den primære årsag til, at target="_blank" ikke virker som forventet, er, at JavaScript håndterer klikhændelsen. Når du klikker på et link, og der er et JavaScript-event listener tilknyttet dette klik, kan scriptet vælge at gribe ind, før browseren får en chance for at udføre sin standardhandling.

Forestil dig følgende scenario, som direkte er baseret på den kode, du har beskrevet:

el.addEvent('click', function(e){
if(obj.options.onOpen){
new Event(e).stop();
if(obj.options.open == i){
obj.options.open = null;
obj.options.onClose(this.href, i);
}else{
obj.options.open = i;
obj.options.onOpen(this.href, i);
}
}
})

Lad os nedbryde, hvad der sker her:

  1. el.addEvent('click', function(e){ ... }): Dette er en event listener, der lytter efter et 'klik' på et element (el). Når et klik registreres, udføres den anonyme funktion. e er event-objektet, som indeholder information om klikket.
  2. new Event(e).stop();: Dette er den kritiske linje. I mange JavaScript-frameworks eller med ren JavaScript (via e.preventDefault()), stopper denne kommando browserens standardadfærd for klikhændelsen. For et link betyder det, at browseren ikke længere vil forsøge at navigere til linkets href-destination på egen hånd – og dermed ignoreres target="_blank" fuldstændigt.
  3. obj.options.onOpen(this.href, i); eller obj.options.onClose(this.href, i);: Efter at standardadfærden er stoppet, tager JavaScript over. I dette specifikke eksempel kalder scriptet en funktion (enten onOpen eller onClose) og sender linkets URL (this.href) som et argument. Inde i disse funktioner sker den manuelle navigation, typisk ved at ændre window.location eller location.href. Når location = e.href; bruges, instrueres den nuværende browserfane om at navigere til den nye URL, og muligheden for at åbne en ny fane forsvinder, da scriptet ikke eksplicit kalder window.open().

Dette er et almindeligt mønster i moderne webudvikling, især med JavaScript-tunge applikationer, der ønsker at kontrollere navigationen for at opnå brugerdefinerede overgange, spore klik eller opretholde en bestemt tilstand i applikationen. Selvom det giver udviklere stor fleksibilitet, kan det skabe uventet adfærd for brugere, der forventer, at target="_blank" fungerer som standard.

Hvorfor Udviklere Gør Dette (Og Udfordringerne)

Der er flere legitime grunde til, at webudviklere vælger at overstyre standardlinkadfærd med JavaScript:

  • Brugerdefinerede Animationer og Overgange: For at skabe flydende overgange mellem sider eller for at indlæse indhold dynamisk uden en fuld sidegenindlæsning (som i Single Page Applications – SPA'er).
  • Sporing og Analyse: JavaScript kan fange klikbegivenheden, sende data til analyseværktøjer (f.eks. Google Analytics) og derefter manuelt navigere, hvilket giver mere detaljeret kontrol over, hvad der spores.
  • Modale Vinduer og Lightboxes: Ofte bruges links til at udløse åbningen af et billede, en video eller en formular i et modalvindue, i stedet for at navigere væk fra siden.
  • Sikkerhed og Kontrol: I sjældne tilfælde kan udviklere ønske mere kontrol over, hvordan nye vinduer åbnes, f.eks. ved at tilføje sikkerhedsforanstaltninger eller sikre, at vinduet åbnes med specifikke dimensioner.
  • Forhindre Flere Faner: I nogle applikationer ønsker udvikleren at forhindre, at brugeren åbner den samme ressource i flere faner, og vælger derfor at navigere i den eksisterende fane.

Udfordringen opstår, når denne JavaScript-kontrol ikke tager højde for brugerens intention, som udtrykt gennem target="_blank". Det kan føre til en forvirrende brugeroplevelse, da brugeren måske mister kontekst eller bliver frustreret over ikke at kunne åbne et link i en ny fane, som de forventede.

Diagnosticering af Problemet

Som bruger er der ikke meget, du kan gøre, udover at forsøge at åbne linket manuelt i en ny fane (f.eks. ved at højreklikke og vælge 'Åbn link i ny fane' eller bruge Ctrl/Cmd + klik). Men som udvikler eller en person med adgang til koden er der flere måder at diagnosticere og potentielt løse problemet på:

  • Browserens Udviklerværktøjer: Åbn udviklerværktøjerne (F12 i de fleste browsere), gå til 'Elements' og inspicer linket. Se efter event listeners tilknyttet linket (ofte under en 'Event Listeners' fane). Du kan også sætte et breakpoint i den tilknyttede JavaScript-kode for at se, hvad der sker, når klikket udløses.
  • Søg efter preventDefault() eller stop(): Gennemgå JavaScript-koden, der håndterer klikhændelsen, og søg efter metoder som event.preventDefault(), return false; (i ældre event-handlere) eller new Event(e).stop();. Disse er klare indikatorer på, at browserens standardadfærd forhindres.
  • Identificer manuel navigation: Se, om scriptet manuelt ændrer window.location.href eller location = 'url'; efter at have stoppet standardadfærden.

Løsninger og Workarounds

Baseret på den leverede JavaScript-kode og almindelige praksis er der flere måder at adressere dette problem på, afhængigt af din adgang til og mulighed for at modificere kildekoden:

1. Modificer JavaScript-filen (f.eks. ImageMenu.js)

Hvis du har mulighed for at redigere den JavaScript-fil, der håndterer klikbegivenheden (som ImageMenu.js i eksemplet), er dette den mest robuste løsning. Ideen er at lade JavaScriptet inspicere linket selv for at se, om target="_blank" er til stede, og derefter handle derefter.

Først skal du ændre den kode, der kalder onClose eller onOpen, så den sender selve <a>-elementobjektet (this) i stedet for kun linkets href. Dette giver din event-handler adgang til linkets attributter, herunder target:

obj.options.onClose(this, i); // Send 'this' i stedet for 'this.href'

Dernæst skal du opdatere din ImageMenu-instans' onOpen-funktion til at tjekke for target="_blank":

window.addEvent('domready', function(){ var myMenu = new ImageMenu($$('#imageMenu a'), { openWidth: 310, border: 2, onOpen: function(el, i) { // Nu modtager vi 'el' (elementet) i stedet for kun 'e' (href) if (el.target === '_blank') { // Tjekker for target-attributten på elementet window.open(el.href); // Åbn i nyt vindue/fane } else { location = el.href; // Naviger i den nuværende fane } } }); });

Denne tilgang er den bedste praksis, da den respekterer HTML-attributten og giver udvikleren fuld kontrol. Den kræver dog adgang til og forståelse af det underliggende JavaScript-framework eller bibliotek.

2. Modificer Links med en Unik Identifikator

Hvis du ikke kan modificere den centrale JavaScript-fil, kan du modificere dine links for at inkludere en specifik streng i URL'en, som JavaScript derefter kan tjekke for. Dette er en workaround, der lader dig signalere din intention til scriptet.

Eksempel på linkmodifikation:

<a href="http://www.foracure.org.au/#_b=1" target="_blank" style="width: 105px;"></a>

Og så opdaterer du din onOpen-funktion til at tjekke for denne identifikator:

onOpen: function(e, i) { // Her er 'e' stadig den fulde href-streng if (e.indexOf('_b=1') > -1) { // Tjekker om strengen '_b=1' findes i URL'en window.open(e); // Åbn i nyt vindue/fane } else { location = e; // Naviger i den nuværende fane } }

Ulempe: Brugeren vil se hash-delen (#_b=1) i URL'en, når de holder musen over linket, hvilket kan virke forvirrende eller uæstetisk. Det kan også påvirke URL'ens renhed og SEO, selvom det ofte ignoreres af søgemaskiner.

3. Brug et Kort (Map) over Links, der Skal Åbnes i Ny Fane

Hvis antallet af links, der skal åbnes i et nyt vindue, er begrænset og kendt på forhånd, kan du oprette et JavaScript-objekt (et 'map' eller 'whitelist') over disse URL'er og tjekke mod det.

var linksThatOpenInANewWindow = { 'http://www.foracure.org.au': 1, 'http://www.example.com/some_external_page.html': 1 }; onOpen: function(e, i) { // Her er 'e' stadig den fulde href-streng if (linksThatOpenInANewWindow[e] === 1) { // Tjekker om URL'en er i vores map window.open(e); // Åbn i nyt vindue/fane } else { location = e; // Naviger i den nuværende fane } }

Ulempe: Denne metode kræver manuel vedligeholdelse af listen over URL'er. Hvis du har mange links, der skifter ofte, kan det blive besværligt og fejlbehæftet at holde listen opdateret.

Brugeroplevelse og Bedste Praksis

Når target="_blank" ikke fungerer, kan det skabe en række problemer for brugeroplevelsen:

  • Forvirring: Brugere forventer en bestemt adfærd, og når den ikke indfries, kan det føre til forvirring og frustration.
  • Tab af Kontekst: Hvis et eksternt link åbner i den samme fane, kan brugeren miste sin placering på din side og have svært ved at finde tilbage.
  • Tilgængelighed: For brugere af skærmlæsere eller dem, der navigerer via tastaturet, kan uventet navigation være særligt forstyrrende.

Bedste Praksis for Udviklere:

For at sikre en god brugeroplevelse og undgå at tilsidesætte target="_blank" utilsigtet, bør udviklere overveje følgende:

  1. Respekter Standarder: Medmindre der er en meget stærk grund til at gøre andet, bør target="_blank" respekteres. Hvis du bruger JavaScript til at fange klik, så tjek altid for target="_blank" og kald window.open(), hvis det er til stede.
  2. Visuelle Indikatorer: Hvis et link åbner i en ny fane (uanset om det er via target="_blank" eller JavaScript), bør der være en klar visuel indikator, f.eks. et lille ikon ved siden af linket, der signalerer, at det er et eksternt link eller vil åbne en ny fane.
  3. Kontrolleret Åbning: Hvis du absolut skal åbne et nyt vindue via JavaScript, brug da window.open(url, '_blank', 'noopener,noreferrer'). noopener og noreferrer er vigtige sikkerhedsforanstaltninger, der forhindrer det nye vindue i at få adgang til det åbnende vindues referencere.
  4. Test Grundigt: Test altid dine links på tværs af forskellige browsere og enheder for at sikre, at de opfører sig som forventet.

Ofte Stillede Spørgsmål (FAQ)

Hvad betyder target="_blank" i HTML?

target="_blank" er en HTML-attribut, der, når den tilføjes til et <a> (anker) element, fortæller browseren, at det linkede dokument skal åbnes i en ny, unavngivet browserfane eller et nyt vindue. Dette er nyttigt for at lade brugere tilgå nyt indhold uden at forlade den nuværende side.

Hvorfor åbner mit link ikke en ny fane, selvom jeg har target="_blank"?

Den mest almindelige årsag er, at JavaScript på din side har overtaget kontrollen med klikhændelsen for linket. JavaScriptet forhindrer browserens standardhandling (som ville inkludere at åbne en ny fane) og udfører i stedet sin egen navigationslogik, som ofte leder til, at linket åbnes i den eksisterende fane.

Er det altid dårligt, når target="_blank" ikke virker?

Ikke nødvendigvis 'dårligt' i teknisk forstand, men det kan være forvirrende for brugeren. Udviklere kan bevidst vælge at overstyre adfærden for at opnå specifikke brugeroplevelser, som f.eks. animationer eller at holde brugeren inden for en enkelt sideapplikation. Problemet opstår, når brugerens forventning ikke stemmer overens med den implementerede adfærd.

Hvordan kan jeg som bruger tvinge et link til at åbne i en ny fane?

Selvom et link er under JavaScript-kontrol, kan du ofte tvinge det til at åbne i en ny fane ved at højreklikke på linket og vælge 'Åbn link i ny fane' (eller lignende indstilling) fra kontekstmenuen. På de fleste systemer kan du også holde Ctrl-tasten (Windows/Linux) eller Cmd-tasten (Mac) nede, mens du klikker på linket.

Hvad er e.preventDefault() i JavaScript?

e.preventDefault() er en JavaScript-metode, der kaldes på et event-objekt (e). Dens formål er at stoppe browserens standardhandling for den pågældende begivenhed. For et link-klik betyder det, at browseren ikke vil navigere til linkets href-destination, og eventuelle attributter som target="_blank" ignoreres.

Hvordan kan jeg løse dette som udvikler?

Den bedste løsning er at modificere dit JavaScript, så det tjekker for target="_blank" på det klikkede element. Hvis attributten er til stede, bør dit script kalde window.open(el.href, '_blank') i stedet for at ændre location.href. Alternativt kan du tilføje en specifik identifikator til dine links' URL'er eller oprette en 'whitelist' af URL'er, der skal åbne i nye faner.

Konklusion

Problemet med target="_blank", der ikke åbner en ny fane, er et klassisk eksempel på spændingen mellem HTML-standarder og den dynamiske kontrol, som JavaScript tilbyder. Selvom JavaScript giver udviklere en enorm fleksibilitet til at skabe rige og interaktive weboplevelser, er det afgørende at forstå og respektere brugerens forventninger og de etablerede webstandarder. Ved at implementere løsninger, der enten respekterer target="_blank" eksplicit eller giver brugeren klare visuelle signaler, kan vi skabe en mere intuitiv og friktionsfri weboplevelse for alle. Det handler i sidste ende om at finde den rette balance mellem teknisk kontrol og en god, forudsigelig brugeroplevelse.

Hvis du vil læse andre artikler, der ligner Hvorfor Åbner target="_blank" Ikke Altid Ny Fane?, kan du besøge kategorien Teknologi.

Go up