So simulieren Sie target = "_ blank" in JavaScript

156

Wenn ein Benutzer auf einen Link klickt, muss ich ein Feld in einer Datenbank aktualisieren und dann den angeforderten Link in einem neuen Fenster öffnen. Das Update ist kein Problem, aber ich weiß nicht, wie ich ein neues Fenster öffnen soll, ohne dass sie auf einen anderen Hyperlink klicken müssen.

<body onLoad="document.getElementById('redirect').click">
<a href="http://www.mydomain.com?ReportID=1" id="redirect" target="_blank">Report</a>
</body>
Phillip Senn
quelle
1
Hm? target="_top"öffnet nicht in einem neuen Fenster - target="_blank"tut.
Tomalak
Wenn der Link bereits in einem neuen Fenster geöffnet wird (aufgrund von target = "_ blank") und der Javascript-Klick-Handler Ihre Datenbank bereits aktualisiert, warum sollten Sie das neue Fenster überhaupt mit Javascript öffnen?
Joel Mueller

Antworten:

298
<script>
    window.open('http://www.example.com?ReportID=1', '_blank');
</script>

Der zweite Parameter ist optional und der Name des Zielfensters.

ChristopheD
quelle
2
window.openmacht was target="_blank"macht - es öffnet die URL in einem neuen Fenster.
Ceejayoz
3
Ja. Das zweite Argument für window.open () ist der "Name", den Sie dem Fenster geben möchten, ähnlich wie beim Festlegen eines Ziels für einen Link. developer.mozilla.org/En/DOM:window.open
Omer Bokhari
2
Oh, ich verstehe. window.open wird vom Firefox-Popupblocker blockiert, target = "_ blank" jedoch nicht. Sollte ich den Client nur bitten, Popups von seiner eigenen Website zu aktivieren?
Phillip Senn
7
Gibt es eine JavaScript-Lösung, die nicht von Popup-Blockern wie Firefox blockiert wird?
ma11hew28
4
@MattDiPasquale Blocking window.open ist irgendwie der Punkt von Popup-Blockern! Wenn Sie den Anruf als Antwort auf eine Klickaktion tätigen, besteht eine bessere Wahrscheinlichkeit, dass er nicht blockiert wird.
William Denniss
19

Dies könnte helfen

var link = document.createElementNS("http://www.w3.org/1999/xhtml", "a");
    link.href = 'http://www.google.com';
    link.target = '_blank';
    var event = new MouseEvent('click', {
        'view': window,
        'bubbles': false,
        'cancelable': true
    });
    link.dispatchEvent(event);
Jair Reina
quelle
IE11: "Laufzeit-Javascript-Fehler: keine gültige Aktion für das Objekt"
T-moty
8
Diese Antwort könnte verbessert werden, indem eine Beschreibung des Geschehens hinzugefügt wird
Elly Post
13

Ich weiß, dass dies ein abgeschlossenes Geschäft ist, aber hier ist, was ich verwende, um das Problem in meiner App zu lösen.

if (!e.target.hasAttribute("target")) {
    e.preventDefault();     
    e.target.setAttribute("target", "_blank");
    e.target.click();
    return;
}

Grundsätzlich wird hier geprüft, ob der Link ein target=_blankAttribut hat. Wenn dies nicht der Fall ist, wird der Link nicht ausgelöst, so eingerichtet, dass er in einem neuen Fenster geöffnet wird, und dann programmgesteuert darauf geklickt.

Sie können noch einen Schritt weiter gehen und das Stoppen des ursprünglichen Klicks überspringen (und Ihren Code wesentlich kompakter gestalten), indem Sie Folgendes versuchen:

if (!e.target.hasAttribute("target")) {
    e.target.setAttribute("target", "_blank");
}

Wenn Sie jQuery verwendet haben, um die Implementierung des Hinzufügens eines Attribut-Cross-Browsers zu abstrahieren, sollten Sie dies anstelle von e.target.setAttribute("target", "_blank"):

    jQuery(event.target).attr("target", "_blank")

Möglicherweise müssen Sie es überarbeiten, um es genau an Ihren Anwendungsfall anzupassen, aber so kratzte ich meinen eigenen Juckreiz.

Hier ist eine Demo in Aktion, mit der Sie sich anlegen können.

(Der Link in jsfiddle kehrt zu dieser Diskussion zurück. Es wird kein neuer Tab benötigt :))

akamaozu
quelle
1
Ich bevorzuge diese Antwort gegenüber allen anderen, da sie jquery verwendet und die Probleme mit dem Popup-Blocker von window.open vermeidet. Dies ist absolut legitim, wenn Sie mit Daten von Drittanbietern arbeiten, die Links enthalten, bei denen das Ziel fehlt.
IncredibleHat
7

Ich persönlich bevorzuge die Verwendung des folgenden Codes, wenn es sich um einen einzelnen Link handelt. Andernfalls ist es wahrscheinlich am besten, wenn Sie eine Funktion mit ähnlichem Code erstellen.

onclick="this.target='_blank';"

Ich begann damit, den strengen XHTML-Test des W3C zu umgehen.

Zennethe Fuchs
quelle
1
Ich denke, Inline-JavaScript ist chaotischer als das Hinzufügen eines "nicht standardmäßigen" Attributs, das überall funktioniert.
Matti Virkkunen
@ MattiVirkkunen in bestimmten Situationen ist es die einzige Lösung
Claudiu Creanga
1
@Claudiu: Wenn Sie sich in einer solch absurden Situation befinden, sollten Sie lieber die Ursache beheben, als sich darum zu kümmern.
Matti Virkkunen
5

So mache ich das mit jQuery. Ich habe eine Klasse für jeden Link, den ich in einem neuen Fenster öffnen möchte.

$(function(){

    $(".external").click(function(e) {
        e.preventDefault();
        window.open(this.href);
    });
});
Jindra Helcl
quelle
2

Sie können die href aus dem a-Tag extrahieren:

window.open(document.getElementById('redirect').href);
treznik
quelle
1

Dies kann Ihnen helfen, alle Seitenlinks zu öffnen :

$(".myClass").each(
     function(i,e){
        window.open(e, '_blank');
     }
);

Es werden alle <a href="" class="myClass"></a>Linkelemente zu einem anderen Tab geöffnet, als hätten Sie auf jeden einzelnen geklickt.

Sie müssen es nur in die Browserkonsole einfügen. jQuery-Framework erforderlich

Radacina
quelle