Відкрити нову вкладку у фоновому режимі?


79

Використовуючи javascript, я хочу відкрити нову сторінку на іншій вкладці, але зосереджуватись на поточній вкладці. Я знаю, що можу зробити це так:

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

Однак, коли я роблю це в chrome, на мить блимає нова вкладка, перш ніж повернутися до поточної вкладки. Я хочу цього уникнути.

Додаток - це особистий закладка, тому він повинен працювати лише в найновішій версії Chrome.


w3schools.com/js/js_ex_browser.asp спробуйте будь-що з цього
Code Spy

1
@ jolly.exe Дякую, але ніхто з них не уникає миттєвого відображення нової сторінки в chrome.
st-boost

3
Здається, дублікат цього питання stackoverflow.com/questions/6897430/ ... Рішення полягає у використанні API розширення Chrome.
Willem Joosten

@WillemJoosten дякую за першу відповідь, яка насправді досягла мети. Але чи є спосіб зробити це поза розширенням? Вигода настільки мала, що за час встановлення розширення його було б переважено.
st-boost

Можливий дублікат
вікна

Відповіді:


102

ОНОВЛЕННЯ: До версії 41 Google Chrome, initMouseEvent здавалося, змінилася поведінка.

це можна зробити, імітуючи ctrl+ click(або будь-яку іншу комбінацію клавіш / подія, що відкриває фонову вкладку) для динамічно сформованого aелемента з hrefатрибутом, встановленим на потрібнийurl

В дії: скрипка

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

перевірено лише на хромі


8
Чудово, я думаю, у нас це вийшло. Важливе зауваження: на OSX значення metaKey має бути істинним.
st-boost

4
Ще одне зауваження: це не працюватиме з URL-адресами, які мають прив’язний текст, якщо ви не встановите a.target='_blank';.
st-boost

1
Це дуже допомагає. Ви чудові: D
iAnuj

25
Здається, це припинило роботу з розробником Google Chrome 41.0.2224.0, випущеним 20.11.2014 (протестовано на Linux). Не дивно, оскільки, мабуть, для початку це була «ненавмисна функціональність», але дратує, оскільки я її чудово використовував у локальних додатках. Стабільні та бета-канали Chrome поки що не повинні впливати, але, ймовірно, незабаром вони об’єднають зміни.
Даніель Андерссон,

5
@ maggot092 використовуючи MouseEvent('click', {view: window, ctrlKey: true, metaKey: true});, щойно відкрита вкладка все одно краде фокус. Мені чогось не вистачає?
Степан Парунашвілі

9

THX за це питання! Для мене добре працює у всіх популярних браузерах:

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
З MDN "Застаріла" Ця функція була вилучена із веб-стандартів. Хоча деякі веб-переглядачі все ще можуть її підтримувати, вона перебуває в стадії видалення. Не використовуйте її у старих або нових проектах. Сторінки або веб-програми, які її використовують у будь-який час ".
BaSsGaz

1

Наскільки я пам’ятаю, це контролюється налаштуваннями браузера. Іншими словами: користувач може вибрати, чи бажає він відкривати нову вкладку у фоновому режимі або на передньому плані. Також вони можуть вибрати, чи відкриватиметься нове спливаюче вікно в новій вкладці, або просто ... спливаюче.

Наприклад, у налаштуваннях Firefox:

Приклад налаштування Firefox

Зверніть увагу на останній варіант.


3
Дякую, але я сподіваюся на щось, чим я можу керувати з веб-сайту, оскільки не хочу, щоб це впливало на інші веб-сайти. (також ctrl / cmd + click робить те саме - я постійно ним користуюся)
st-boost

1
це не для javascript, а лише для налаштування браузера.
Лін

0

Я зробив саме те, що ви шукаєте, дуже просто. Це ідеально гладко в Google Chrome та Opera, і майже ідеально у Firefox та Safari. Не перевірено в 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;
}

Скрипка: http://jsfiddle.net/tFCnA/show/

Пояснення:
Скажімо, є вікна A1 та B1 та веб-сайти A2 та B2.
Замість того, щоб відкрити B2 в B1, а потім повернутися до A1, я відкриваю B2 в A1 і знову відкриваю A2 в B1.
(Ще одна річ, завдяки якій це працює, полягає в тому, що я не змушую користувача повторно завантажувати A2, див. Рядок 4)


Єдине, що вам може не сподобатися, це те, що нова вкладка відкривається перед головною сторінкою.


1
Дякую, це розумний підхід. Однак у нього є низка проблем, включаючи обмеження прослуховувачів подій, неправильне вирівнювання історії браузера, потенційну зміну типу документа та відкидання атрибутів елемента html, не кажучи вже про те, що він фактично не "відкриває нову сторінку в іншому вкладка ".
st-boost

Чому це не відкриває нову сторінку на іншій вкладці?
Mageek

4
Ну технічно він відкриває нову сторінку в тій же вкладці і ту саму сторінку в новій вкладці. Я знаю, що це лише граматика, яка не має значення - важливо те, що це від’єднує сторінку від її історії (ламає кнопку «Назад») і набагато важче відслідковувати ієрархію вкладок для chrome тощо.
st-boost

-3

Ось повний приклад навігації по дійсній URL-адресі на новій вкладці з фокусом.

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

Я також створив смітник із рішенням на http://codebins.com/codes/home/4ldqpbw


2
Дякую, але я думаю, ви неправильно розумієте моє запитання. Я хочу, щоб сторінка, що відкриває, була зосереджена в кінці, а не на новій вкладці - і питання полягає в тому, як я можу уникнути відображення нової вкладки навіть на мить.
st-boost

На сьогодні та найновіший Chrome, здається, це взагалі нічого не робить.
Містер Принтер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.