Открыть новую вкладку в фоновом режиме, оставив фокус на текущей вкладке - Chrome

Как выполнить в JavaScript CTRL + щелчок по ссылке, которая работает в последней версии Chrome (v68)?

Контекст - я запускаю сценарий JavaScript, который открывает определенную вкладку в определенные часы дня (и закрывает ее через несколько минут). Я пытаюсь заставить его открыть вкладку в фоновом режиме, оставляя фокус на текущей вкладке, которую я использую.

Вкладка, открытая программно, заставляет Chrome всплывать даже в свернутом виде, что очень мешает.

Эти старые решения, которые я нашел здесь, в Stack Overflow, не работают с последней версией Chrome.

Вручную CTRL + щелчок по ссылке дает желаемый эффект (вкладка открывается в фоновом режиме). Можно ли это сделать программно в последней версии Chrome?


Следующий код больше не работает с последней версией Chrome.

const openNewBackgroundTab = (url) => {
  const anchor = document.createElement("a");
  anchor.href = url;
  document.body.appendChild(anchor);
  const 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
  );
  anchor.dispatchEvent(evt);
}
openNewBackgroundTab('https://stackoverflow.com');

.. новая вкладка по-прежнему получает фокус.


Действия по воспроизведению:

  • Откройте окно 1 и в консоли выполните:

let winStacko; setTimeout(() => { winStacko = open('https://www.stackoverflow.com'); }, 30 * 1000); setTimeout(() => winStacko.close(), 2 * 60 * 1000);

  • Открыть окно 2 в течение 30 секунд после выполнения скрипта

ЖЕЛАЕМОЕ поведение:

  • Окно 2 находится в фокусе все время, пока открывается и закрывается фоновая вкладка.

Зачем тебе это нужно? Я спрашиваю об этом, потому что, возможно, то, что вы пытаетесь сделать (может быть, некоторая фоновая обработка?), Может быть достигнуто путем выполнения кода javascript с помощью Node.js. Обычно браузеры не позволяют открывать вкладки таким образом из соображений безопасности / спама.

fsinisi90 14.08.2018 20:22

@ fsinisi90 да, я знаю. Использование узла решило бы проблему, но мне пришлось бы переписывать систему с нуля. Это в моем списке дел, но только тогда, когда текущее решение выйдет из строя. Что касается причины безопасности, да, я знаю об этом, но плагин все равно это делает. Только он оставляет фокус на другой вкладке (фактически последней использованной, а не той, которая запустила новую вкладку). Спасибо, в любом случае

Gabe 14.08.2018 21:53

Что дает вам открытие новой вкладки? Например, можете ли вы вместо этого открыть iframe на текущей вкладке? То, что вы ищете, может быть невозможно только с помощью Javascript, но это может быть выполнено с помощью чего-то, что выполняет сценарии ОС, например AutoHotKey.

CertainPerformance 19.08.2018 00:46

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

Tschallacka 21.08.2018 13:20

@CertainPerformance нет, я думал о решении iframe, но у меня это не сработает. За что спасибо, возьму на AutoHotKey.

Gabe 21.08.2018 19:57

@Tschallacka да, это было бы правильным решением, если бы скрипту не приходилось взаимодействовать с пользовательским интерфейсом ..

Gabe 21.08.2018 19:57

Вот почему вы должны написать логику, которая будет запрашивать данные, а затем возвращать данные для того, что должно происходить визуально.

Tschallacka 21.08.2018 20:02

@Tschallacka проблема в том, что и вкладка, которая выполняет скрипт, и вкладка, открытая программно, должны взаимодействовать с пользовательским интерфейсом. В моем случае не сработает. Спасибо, в любом случае! :)

Gabe 22.08.2018 06:59
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
23
8
20 320
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Я ЧАСТИЧНО решил с помощью плагина Chrome: Force Background Tab

https://chrome.google.com/webstore/detail/force-background-tab/gidlfommnbibbmegmgajdbikelkdcmcl/related?hl=en

Используя эту надстройку, вкладка открывается в фоновом режиме без фокуса. Единственная проблема заключается в том, что последняя использованная вкладка окна (может отличаться от вкладки, которая запускает новую вкладку) по-прежнему появляется перед любым другим используемым приложением.

Использование расширения не рекомендуется, поскольку оно не удобно для клиента, вы не можете сказать каждому клиенту, чтобы он загружал расширение.

Barr J 14.08.2018 19:39

@BarrJ Я не против, я единственный пользователь. Это для личного пользования.

Gabe 14.08.2018 22:26

Раньше это можно было сделать, используя такие вещи, как:

if (window.focus == false)
{
    this.focus();
}


Теперь вам нужно использовать дополнительные плагины, из-за обидчиков. Решение: опрокидывание окна:
Решение - создать другую страницу. Когда вы щелкаете ссылку, окно закрывается, оно переключается на страницу, которая открывает только что закрытое окно, и меняет его местоположение на новую страницу.
Код страницы 1:

document.getElementById("myId").onclick = function(){window.open("page2.html");window.close()}

Код страницы 2:

window.open("previouspage.html");
window.location = "newpage.html";
//close the page
window.close();

Я называю эту стратегию "Опрокидывание окна".

Красиво, но это больше похоже на "Закатание глаз" со всеми этими перенаправлениями и нагрузками.

BaSsGaz 21.04.2019 14:41

@Anthony Я видел, как некоторые веб-сайты используют такой метод. Я написал это давным-давно, поэтому не уверен, работает ли это сейчас. Однако я думаю, что тестировал это раньше.

bluninja1234 11.07.2020 07:35

Вы можете попробовать что-то вроде всплывающего окна, где вы открываете тот же URL-адрес в новой вкладке, а затем меняете location.href текущей вкладки на желаемый новый URL-адрес.

window.open(window.location.href);
window.location.href = 'http://www.google.com';
Ответ принят как подходящий

Поскольку вы хотите использовать это в личных целях и не возражаете против использования расширения, вы можете написать свое собственное.

Написать расширение Chrome для достижения требуемого поведения на самом деле очень просто. Все, что вам нужно знать, это как открывать / закрывать вкладки из расширения. На следующей странице описан весь API

Вот пример:

1 - Создайте файл manifest.json и запросите разрешение tabs

{
  "name": "blabla",
  "version": "0.1",
  "permissions": ["tabs"],
  "background": {
    "persistent": false,
    "scripts": ["background.js"]
  },
  "browser_action": {
    "default_title": "Open a background tab every x time"
  },
  "manifest_version": 2
}

2 - Создайте скрипт background.js в той же папке

const INTERVAL = 5000;
setTimeout(function(){
    chrome.tabs.create({url: "https://www.stackoverflow.com", active: false }, tab =>{
        setTimeout(function(){
            chrome.tabs.remove(tab.id);
        },INTERVAL);
    }); 
},INTERVAL);

Вы также можете скачать его отсюда

Note: Please note the active parameter here , it defines whether the tab should become the active tab in the window. Does not affect whether the window is focused

3 - Используйте расширение в хроме

  1. Если вы пользуетесь ссылкой для скачивания, то распакуйте архив
  2. Переход из меню Chrome к расширениям
  3. Включите режим разработчика в правом верхнем углу
  4. Нажмите кнопку Load Unpacked, чтобы выбрать папку расширения.
  5. Расширение запустится автоматически

Другие вопросы по теме