Как выполнить в 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');
.. новая вкладка по-прежнему получает фокус.
Действия по воспроизведению:
let winStacko;
setTimeout(() => { winStacko = open('https://www.stackoverflow.com'); }, 30 * 1000);
setTimeout(() => winStacko.close(), 2 * 60 * 1000);
ЖЕЛАЕМОЕ поведение:
@ fsinisi90 да, я знаю. Использование узла решило бы проблему, но мне пришлось бы переписывать систему с нуля. Это в моем списке дел, но только тогда, когда текущее решение выйдет из строя. Что касается причины безопасности, да, я знаю об этом, но плагин все равно это делает. Только он оставляет фокус на другой вкладке (фактически последней использованной, а не той, которая запустила новую вкладку). Спасибо, в любом случае
Что дает вам открытие новой вкладки? Например, можете ли вы вместо этого открыть iframe на текущей вкладке? То, что вы ищете, может быть невозможно только с помощью Javascript, но это может быть выполнено с помощью чего-то, что выполняет сценарии ОС, например AutoHotKey.
Если вам нужна фоновая обработка, используйте веб-воркеров. Открывать скрытые вкладки в фоновом режиме всегда пытаются вредоносные приложения. Я ненавижу это, когда это происходит, и закрываю их как можно скорее, как только я вижу мерцание открывающейся вкладки.
@CertainPerformance нет, я думал о решении iframe, но у меня это не сработает. За что спасибо, возьму на AutoHotKey.
@Tschallacka да, это было бы правильным решением, если бы скрипту не приходилось взаимодействовать с пользовательским интерфейсом ..
Вот почему вы должны написать логику, которая будет запрашивать данные, а затем возвращать данные для того, что должно происходить визуально.
@Tschallacka проблема в том, что и вкладка, которая выполняет скрипт, и вкладка, открытая программно, должны взаимодействовать с пользовательским интерфейсом. В моем случае не сработает. Спасибо, в любом случае! :)
Я ЧАСТИЧНО решил с помощью плагина Chrome: Force Background Tab
Используя эту надстройку, вкладка открывается в фоновом режиме без фокуса. Единственная проблема заключается в том, что последняя использованная вкладка окна (может отличаться от вкладки, которая запускает новую вкладку) по-прежнему появляется перед любым другим используемым приложением.
Использование расширения не рекомендуется, поскольку оно не удобно для клиента, вы не можете сказать каждому клиенту, чтобы он загружал расширение.
@BarrJ Я не против, я единственный пользователь. Это для личного пользования.
Раньше это можно было сделать, используя такие вещи, как:
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();
Я называю эту стратегию "Опрокидывание окна".
Красиво, но это больше похоже на "Закатание глаз" со всеми этими перенаправлениями и нагрузками.
@Anthony Я видел, как некоторые веб-сайты используют такой метод. Я написал это давным-давно, поэтому не уверен, работает ли это сейчас. Однако я думаю, что тестировал это раньше.
Вы можете попробовать что-то вроде всплывающего окна, где вы открываете тот же 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 - Используйте расширение в хроме
Load Unpacked
, чтобы выбрать папку расширения.
Зачем тебе это нужно? Я спрашиваю об этом, потому что, возможно, то, что вы пытаетесь сделать (может быть, некоторая фоновая обработка?), Может быть достигнуто путем выполнения кода javascript с помощью Node.js. Обычно браузеры не позволяют открывать вкладки таким образом из соображений безопасности / спама.