Otworzyć nową kartę w tle?


79

Korzystając z javascript, chcę otworzyć nową stronę w innej karcie, ale nadal skupiam się na bieżącej karcie. Wiem, że mogę to zrobić w ten sposób:

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

Jednak kiedy robię to w chrome, miga przez chwilę nową kartę, zanim wrócę do bieżącej karty. Chcę tego uniknąć.

Aplikacja jest osobistą bookmarkletem, więc musi działać tylko w najnowszym Chrome.



1
@ jolly.exe Dzięki, ale żadna z tych osób nie unika chwilowego wyświetlania nowej strony w chrome.
st-boost

3
Wydaje się, że jest to duplikat tego pytania stackoverflow.com/questions/6897430/ ... Rozwiązaniem jest użycie interfejsu API rozszerzenia Chrome.
Willem Joosten

@WillemJoosten dziękuje za pierwszą odpowiedź, która faktycznie osiągnęła cel. Ale czy można to zrobić poza rozszerzeniem? Korzyść jest tak mała, że ​​przeważyłaby czas potrzebny do zainstalowania rozszerzenia.
st-boost

Odpowiedzi:


102

AKTUALIZACJA: Wydawało się , że w wersji 41 przeglądarki Google Chrome initMouseEvent zachowanie uległo zmianie.

można to zrobić, symulując ctrl+ click(lub dowolne inne kombinacje klawiszy / zdarzeń, które otwierają kartę w tle) na dynamicznie generowanym aelemencie z hrefatrybutem ustawionym na żądanyurl

W akcji: skrzypce

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);
}

testowany tylko na chromie


8
Świetnie, myślę, że to mamy. Ważna uwaga: w OSX wartość metaKey musi być prawdziwa.
st-boost

4
Kolejna uwaga: to nie zadziała w przypadku adresów URL z tekstem kotwicy, chyba że ustawisz a.target='_blank';.
st-boost

1
To jest bardzo pomocne. Jesteś niesamowity: D
iAnuj

25
Wygląda na to, że przestało to działać z wersją deweloperską Google Chrome 41.0.2224.0, wydaną 2014-11-20 (testowane w systemie Linux). Nic dziwnego, ponieważ wydaje mi się, że na początku była to „niezamierzona funkcjonalność”, ale denerwująca, ponieważ bardzo dobrze z niej korzystałem w lokalnych aplikacjach. Na razie stabilne i beta kanały Chrome powinny pozostać nienaruszone, ale prawdopodobnie wkrótce zostaną scalone.
Daniel Andersson

5
@ maggot092 używając MouseEvent('click', {view: window, ctrlKey: true, metaKey: true});, nowo otwarta karta nadal kradnie fokus. Czy coś mi brakuje?
Stepan Parunashvili

9

THX za to pytanie! Działa dobrze dla mnie we wszystkich popularnych przeglądarkach:

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();
}

3
Z MDN „Przestarzały Ta funkcja została usunięta ze standardów internetowych. Chociaż niektóre przeglądarki mogą ją nadal obsługiwać, jest w trakcie usuwania. Nie używaj jej w starych lub nowych projektach. Strony lub aplikacje internetowe, które ją używają, mogą się zepsuć w dowolnym momencie ”.
BaSsGaz

1

O ile dobrze pamiętam, jest to kontrolowane przez ustawienia przeglądarki. Innymi słowy: użytkownik może wybrać, czy chce otworzyć nową kartę w tle, czy na pierwszym planie. Mogą również wybrać, czy nowe wyskakujące okienko ma otwierać się w nowej karcie, czy po prostu ...

Na przykład w preferencjach Firefoksa:

Przykład instalacji Firefoksa

Zwróć uwagę na ostatnią opcję.


3
Dzięki, ale mam nadzieję na coś, co będę mógł kontrolować z poziomu witryny internetowej, ponieważ nie chcę, aby miało to wpływ na inne witryny. (również ctrl / cmd + klik robi to samo - używam go cały czas)
st-boost.

1
to nie jest dla javascript, tylko dla ustawień przeglądarki.
Lin

0

Zrobiłem dokładnie to, czego szukasz, w bardzo prosty sposób. Działa idealnie płynnie w Google Chrome i Opera, i prawie idealnie w Firefoksie i Safari. Nie testowane w IE.


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;
}

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

Objaśnienia:
Załóżmy, że istnieją okna A1 i B1 oraz strony internetowe A2 i B2.
Zamiast otwierać B2 w B1 i wracać do A1, otwieram B2 w A1 i ponownie otwieram A2 w B1.
(Inną rzeczą, która sprawia, że ​​to działa, jest to, że nie zmuszam użytkownika do ponownego pobierania A2, patrz wiersz 4)


Jedyne, co może Ci się nie spodobać, to to, że nowa karta otwiera się przed stroną główną.


1
Dziękuję, to sprytne podejście. Ma jednak wiele problemów, w tym blokowanie odbiorników zdarzeń, niewłaściwe wyrównanie historii przeglądarki, potencjalna zmiana typu dokumentu i odrzucanie atrybutów w elemencie html, nie wspominając o tym, że w rzeczywistości nie „otwiera nowej strony w innym patka".
st-boost

Dlaczego nie otwiera nowej strony w innej karcie?
Mageek

4
Technicznie rzecz biorąc, otwiera nową stronę w tej samej karcie i tę samą stronę w nowej karcie. Wiem, że to tylko gramatyka, która nie ma znaczenia - liczy się to, że powoduje to odłączenie strony od jej historii (zrywa przycisk Wstecz) i znacznie utrudnia chrome itp. Śledzenie hierarchii zakładek.
st-boost

-3

Oto kompletny przykład poruszania się po prawidłowym adresie URL na nowej karcie z fokusem.

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;
    }
}

Stworzyłem również bin z rozwiązaniem na http://codebins.com/codes/home/4ldqpbw


2
Dziękuję, ale myślę, że źle zrozumiałeś moje pytanie. Chcę, aby na końcu skupiała się strona otwieracza, a nie nowa karta - i pytanie brzmi, jak mogę uniknąć wyświetlania nowej karty choćby przez chwilę.
st-boost

Na dzień dzisiejszy i najnowszy Chrome wydaje się, że to w ogóle nic nie robi.
Mr Printer
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.