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

64

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

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

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

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

w3schools.com/js/js_ex_browser.asp попробуйте любой из этих Code Spy
@ jolly.exe Спасибо, но никто из них не избегает моментального отображения новой страницы в Chrome. st-boost
@WillemJoosten спасибо за первый ответ, который фактически достиг цели. Но есть ли способ сделать это вне расширения? Преимущество настолько мало, что оно перевесит время, необходимое для установки расширения. st-boost
Кажется, дубликат этого вопросаstackoverflow.com/questions/6897430/… Решение - использовать API расширения Chrome. Willem Joosten

Ваш Ответ

6   ответов
-2

что вы ищете, очень простым способом. Он идеально плавный в 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/

Пояснения:
Допустим, есть окна А1 и В1 и сайты А2 и В2.
Вместо того, чтобы открыть B2 в B1 и затем вернуться к A1, я открываю B2 в A1 и заново открываю A2 в B1.
(Еще одна вещь, которая заставляет его работать, это то, что я не заставляю пользователя повторно загружать A2, см. Строку 4)

The only thing you may doesn't like is that the new tab opens before the main page.

Технически, он открывает новую страницу в той же вкладке и ту же страницу в новой вкладке. Я знаю, что это просто грамматика, которая не имеет значения - важно то, что она отделяет страницу от ее истории (ломает кнопку назад) и делает Chrome и т. Д. Намного сложнее отслеживать иерархию вкладок. st-boost
Спасибо, это умный подход. Однако у него есть ряд проблем, в том числе сглаживание прослушивателей событий, неправильное выравнивание истории браузера, потенциальное изменение типа документа и отбрасывание атрибутов в элементе html, не говоря уже о том, что он фактически не открывает новую страницу в другая вкладка & quot ;. st-boost
Почему он не открывает новую страницу в другой вкладке?
-3

усом.

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

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

UPDATE: By version 41 of Google Chrome, initMouseEvent seemed to have a changed behavior.

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

In action: играть на скрипке

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

проверено только на хром

Не работает в Firefox 28
Похоже, что это перестало работать с Google Chrome dev версии 41.0.2224.0, выпущенным 2014-11-20 (протестировано в Linux). Не удивительно, так как я предполагаю, что это была «непреднамеренная функциональность» Начнем с того, что раздражает, так как я широко использовал его в локальных приложениях. Стабильные и бета-каналы Chrome пока не будут затронуты, но, вероятно, скоро объединят изменения.
Еще одно примечание: это не будет работать с URL, которые имеют якорный текст, если вы не установитеa.target='_blank';. st-boost
Не работает в IE9 или FF17
Круто, я думаю, что мы получили это. Важное примечание: в OSX это значение metaKey, которое должно быть истинным. st-boost
7

рах:

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();
}
От MDN & quot; Устаревший Эта функция была удалена из веб-стандартов. Хотя некоторые браузеры все еще могут поддерживать его, он находится в процессе удаления. Не используйте его в старых или новых проектах. Страницы или веб-приложения, использующие его, могут сломаться в любое время. & Quot;
1

это контролируется настройками браузера. Другими словами: пользователь может выбрать, хочет ли он открыть новую вкладку в фоновом режиме или на переднем плане. Также они могут выбрать, следует ли открывать новое всплывающее окно в новой вкладке или просто ... всплывающее окно.

Например, в настройках Firefox:

Firefox setup example

Обратите внимание на последний вариант.

это не для JavaScript, а только для настройки браузера.
Спасибо, но я надеюсь, что что-то, что я смогу контролировать на веб-сайте, не хочу, чтобы это влияло на другие веб-сайты. (также ctrl / cmd + click делает то же самое - я использую это все время) st-boost
0

он также работал с расширением Chrome. Все вышеперечисленное не работает для меня.

chrome.tabs.create({ url: "http://www.google.com/", selected: false }); 
@Xerus ответ выше работает только в случае расширения Chrome. поэтому приведенное выше заявление будет работать на фоновой странице расширения Chrome. chrome.tabs.create - API-интерфейс расширения Chrome
давая мне эту ошибку:Uncaught TypeError: Cannot read property 'create' of undefined
код только для расширения Chrome, не работает для JS.

Похожие вопросы