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.

st-boost
źródło
w3schools.com/js/js_ex_browser.asp wypróbuj dowolne z nich
Code Spy
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

Amro
źródło
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();
}
user2837849
źródło
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ę.

demee
źródło
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ą.

Mageek
źródło
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

gaurang171
źródło
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