Открыть новую вкладку в фоновом режиме?

79

Используя javascript, я хочу открыть новую страницу на другой вкладке, но при этом сосредоточиться на текущей вкладке. Я знаю, что могу сделать это так:

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

Однако, когда я делаю это в хроме, новая вкладка на мгновение мигает, прежде чем переключиться обратно на текущую вкладку. Я хочу этого избежать.

Приложение представляет собой персональный букмарклет, поэтому оно должно работать только в последней версии Chrome.

St-Boost
источник
w3schools.com/js/js_ex_browser.asp попробуйте любой из них
Code Spy
1
@ jolly.exe Спасибо, но никто из них не избегает моментального отображения новой страницы в Chrome.
st-boost
3
Кажется, дубликат этого вопроса stackoverflow.com/questions/6897430/… Решение - использовать api расширения Chrome.
Виллем Йустен,
@WillemJoosten благодарит за первый ответ, который действительно достиг цели. Но есть ли способ сделать это вне расширения? Выгода настолько мала, что ее перевесит время, необходимое для установки расширения.
st-boost
Возможный дубликат Prevent window.open from
focusing

Ответы:

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
Это очень помогает. Ты
классный
25
Похоже, это перестало работать с выпуском Google Chrome dev 41.0.2224.0, выпущенным 2014-11-20 (проверено в 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();
}
user2837849
источник
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 05
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

гауранг171
источник
2
Спасибо, но я думаю, вы неправильно поняли мой вопрос. Я хочу, чтобы в конечном итоге фокусировалась открывающая страница, а не новая вкладка - и вопрос в том, как я могу избежать отображения новой вкладки хотя бы на мгновение.
st-boost
На сегодняшний день и в последней версии Chrome это, похоже, вообще ничего не делает.
Мистер Принтер