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.
javascript
google-chrome
st-boost
źródło
źródło
Odpowiedzi:
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 generowanyma
elemencie zhref
atrybutem 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
źródło
a.target='_blank';
.MouseEvent('click', {view: window, ctrlKey: true, metaKey: true});
, nowo otwarta karta nadal kradnie fokus. Czy coś mi brakuje?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(); }
źródło
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:
Zwróć uwagę na ostatnią opcję.
źródło
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ą.
źródło
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" /> <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
źródło