Eine neue Registerkarte im Hintergrund öffnen?

79

Mit Javascript möchte ich eine neue Seite auf einer anderen Registerkarte öffnen, mich aber weiterhin auf die aktuelle Registerkarte konzentrieren. Ich weiß, dass ich es so machen kann:

open('http://example.com/');
focus();

Wenn ich dies jedoch in Chrome mache, blinkt die neue Registerkarte für einen Moment, bevor zur aktuellen Registerkarte zurückgekehrt wird. Ich möchte das vermeiden.

Die Anwendung ist ein persönliches Lesezeichen, daher muss sie nur in der neuesten Version von Chrome funktionieren.

st-boost
quelle
w3schools.com/js/js_ex_browser.asp versuchen Sie eines dieser
Code Spy
1
@ jolly.exe Danke, aber keiner von denen vermeidet es, die neue Seite für einen Moment in Chrom anzuzeigen.
St-Boost
3
Scheint ein Duplikat dieser Frage zu sein stackoverflow.com/questions/6897430/… Die Lösung besteht darin, die Chrome-Erweiterungs-API zu verwenden.
Willem Joosten
@ WillemJoosten danke für die erste Antwort, die das Ziel tatsächlich erreicht hat. Aber gibt es eine Möglichkeit, dies außerhalb einer Erweiterung zu tun? Der Nutzen ist so gering, dass er durch die Zeit, die für die Installation der Erweiterung benötigt wird, aufgewogen wird.
St-Boost
Mögliches Duplikat von Fenster verhindern. Vom Fokussieren
öffnen

Antworten:

102

UPDATE: Nach Version 41 von Google Chrome initMouseEvent schien sich das Verhalten geändert zu haben.

Dies kann durch Simulieren von ctrl+ click(oder anderen Schlüssel- / Ereigniskombinationen, die eine Hintergrundregisterkarte öffnen) für ein dynamisch generiertes aElement erfolgen, dessen hrefAttribut auf das gewünschte eingestellt isturl

In Aktion: Geige

function openNewBackgroundTab(){
    var a = document.createElement("a");
    a.href = "http://www.google.com/";
    var evt = document.createEvent("MouseEvents");
    //the tenth parameter of initMouseEvent sets ctrl key
    evt.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0,
                                true, false, false, false, 0, null);
    a.dispatchEvent(evt);
}

nur auf Chrom getestet

Amro
quelle
8
Super, ich denke wir haben es verstanden. Ein wichtiger Hinweis: Unter OSX muss der metaKey-Wert wahr sein.
St-Boost
4
Ein weiterer Hinweis: Dies funktioniert nur mit URLs mit Ankertext, wenn Sie dies festlegen a.target='_blank';.
St-Boost
1
Dies ist eine große Hilfe. Du bist großartig: D
iAnuj
24
Dies scheint nicht mehr mit Google Chrome Dev Release 41.0.2224.0, veröffentlicht am 20.11.2014 (getestet unter Linux), zu funktionieren. Kein Wunder, denn ich denke, es war zunächst "unbeabsichtigte Funktionalität", aber ärgerlich, da ich sie in lokalen Anwendungen sehr gut eingesetzt habe. Die stabilen und Beta-Kanäle von Chrome sollten noch nicht betroffen sein, werden die Änderungen aber wahrscheinlich bald zusammenführen.
Daniel Andersson
5
@ maggot092 mit MouseEvent('click', {view: window, ctrlKey: true, metaKey: true});, stiehlt der neu geöffnete Tab immer noch den Fokus. Vermisse ich etwas
Stepan Parunashvili
9

THX für diese Frage! Funktioniert gut für mich in allen gängigen Browsern:

function openNewBackgroundTab(){
    var a = document.createElement("a");
    a.href = window.location.pathname;
    var evt = document.createEvent("MouseEvents");
    //the tenth parameter of initMouseEvent sets ctrl key
    evt.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0,
                                true, false, false, false, 0, null);
    a.dispatchEvent(evt);
}

var is_chrome = navigator.userAgent.toLowerCase().indexOf('chrome') > -1;
if(!is_chrome)
{
    var url = window.location.pathname;
    var win = window.open(url, '_blank');
} else {
    openNewBackgroundTab();
}
user2837849
quelle
3
Von MDN "Veraltet Diese Funktion wurde aus den Webstandards entfernt. Obwohl einige Browser sie möglicherweise noch unterstützen, wird sie gerade gelöscht. Verwenden Sie sie nicht in alten oder neuen Projekten. Seiten oder Webanwendungen, die sie verwenden, können bei brechen Jederzeit."
BaSsGaz
1

Soweit ich mich erinnere, wird dies durch die Browsereinstellungen gesteuert. Mit anderen Worten: Der Benutzer kann wählen, ob er eine neue Registerkarte im Hintergrund oder im Vordergrund öffnen möchte. Sie können auch auswählen, ob ein neues Popup in einem neuen Tab geöffnet werden soll oder nur ... ein Popup.

Zum Beispiel in Firefox-Einstellungen:

Beispiel für die Einrichtung von Firefox

Beachten Sie die letzte Option.

demee
quelle
3
Vielen Dank, aber ich hoffe auf etwas, das ich innerhalb einer Website steuern kann, da ich nicht möchte, dass dies Auswirkungen auf andere Websites hat. (auch Strg / cmd + Klick macht das gleiche - ich benutze es die ganze Zeit)
st-boost
1
Dies ist nicht für Javascript, sondern nur für die Browsereinstellung.
Lin
0

Ich habe auf sehr einfache Weise genau das getan, wonach Sie suchen. Es ist in Google Chrome und Opera perfekt flüssig und in Firefox und Safari nahezu perfekt. Nicht im IE getestet.


function newTab(url)
{
    var tab=window.open("");
    tab.document.write("<!DOCTYPE html><html>"+document.getElementsByTagName("html")[0].innerHTML+"</html>");
    tab.document.close();
    window.location.href=url;
}

Geige: http://jsfiddle.net/tFCnA/show/

Erläuterungen:
Angenommen, es gibt die Fenster A1 und B1 sowie die Websites A2 und B2.
Anstatt B2 in B1 zu öffnen und dann zu A1 zurückzukehren, öffne ich B2 in A1 und öffne A2 in B1 erneut.
(Eine andere Sache, die es funktioniert, ist, dass ich den Benutzer nicht dazu bringe, A2 erneut herunterzuladen, siehe Zeile 4)


Das einzige, was Ihnen vielleicht nicht gefällt, ist, dass die neue Registerkarte vor der Hauptseite geöffnet wird.

Mageek
quelle
1
Danke, das ist ein kluger Ansatz. Es gibt jedoch eine Reihe von Problemen, darunter das Überladen von Ereignis-Listenern, das Fehlausrichten des Browserverlaufs, das mögliche Ändern des Doctype und das Verwerfen von Attributen für das HTML-Element, ganz zu schweigen von der Tatsache, dass eine neue Seite nicht auf einer anderen Seite geöffnet wird Tab".
St-Boost
Warum wird keine neue Seite in einem anderen Tab geöffnet?
Mageek
4
Technisch gesehen wird die neue Seite auf derselben Registerkarte und dieselbe Seite auf einer neuen Registerkarte geöffnet. Ich weiß, dass dies nur eine Grammatik ist, die keine Rolle spielt. Wichtig ist, dass dadurch die Seite von ihrem Verlauf getrennt wird (die Schaltfläche "Zurück" wird unterbrochen) und es für Chrome usw. viel schwieriger wird, die Tab-Hierarchie im Auge zu behalten.
St-Boost
-3

Hier ist ein vollständiges Beispiel für das Navigieren in einer gültigen URL auf einer neuen Registerkarte mit Fokus.

HTML:

<div class="panel">
  <p>
    Enter Url: 
    <input type="text" id="txturl" name="txturl" size="30" class="weburl" />
    &nbsp;&nbsp;    
    <input type="button" id="btnopen"  value="Open Url in New Tab" onclick="openURL();"/>
  </p>
</div>

CSS:

.panel{
  font-size:14px;
}
.panel input{
  border:1px solid #333;
}

JAVASCRIPT:

function isValidURL(url) {
    var RegExp = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;

    if (RegExp.test(url)) {
        return true;
    } else {
        return false;
    }
}

function openURL() {
    var url = document.getElementById("txturl").value.trim();
    if (isValidURL(url)) {
        var myWindow = window.open(url, '_blank');
        myWindow.focus();
        document.getElementById("txturl").value = '';
    } else {
        alert("Please enter valid URL..!");
        return false;
    }
}

Ich habe auch einen Papierkorb mit der Lösung unter http://codebins.com/codes/home/4ldqpbw erstellt

gaurang171
quelle
2
Danke, aber ich denke, Sie verstehen meine Frage falsch. Ich möchte, dass die Eröffnungsseite am Ende fokussiert ist, nicht die neue Registerkarte - und die Frage ist, wie ich vermeiden kann, die neue Registerkarte auch nur für einen Moment anzuzeigen.
St-Boost
Ab heute und dem neuesten Chrome scheint dies überhaupt nichts zu bewirken.
Herr Drucker