Есть вот такой скрипт: https://github.com/ianoxley/open-selected-links/blob/master/open-selected-links.user.js Открывает в новых табах ссылки при их выделении с зажатым Ctrl. Судя по всему, предназначался для страницы поиска Гугла.
Большинство сайтов не любят, когда кто-то открывает десятки страниц одновременно. Поэтому между вызовами GM_openInTab в цикле в функции openSelectedLinks (строка 39) нужно сделать паузу несколько секунд.
Погуглил как делать паузу на джаваскрипте и запутался. Что такое async и await? Когда вызов setTimeout остановит скрипт, а когда — нет?
ОТВЕТ: Для паузы 10 с нужно заменить вызов GM_openInTab(selectedLinks[i].href) на setTimeout(_ => GM_openInTab(selectedLinks[i].href), 10000*(selectedLinks.length-i))
Пока получился такой скрипт:
// ==UserScript==
// @name open-selected-links
// @namespace http://tampermonkey.net/
// @version 2026-07-15
// @description Opens selected links in new tabs
// @author ianoxley
// @match *
// @grant GM_openInTab
// ==/UserScript==
(function() {
'use strict';
document.addEventListener('keydown', function(e) {
const ctrlKeyCode = 17;
const cmdKeyCode = 224;
if (e.keyCode == ctrlKeyCode || e.keyCode == cmdKeyCode) {
document.addEventListener('mouseup', openSelectedLinks, true);
}
}, true);
// Remove the mousedown handler so it doesn't open links just by selecting text *without* ctrl / cmd
document.addEventListener('keyup', function(e) {
document.removeEventListener('mouseup', openSelectedLinks, true);
}, true);
function openSelectedLinks(e) {
const selection = window.getSelection();
if (selection) {
const selectedLinks = selection.getRangeAt(0).cloneContents().querySelectorAll('a');
const n = selectedLinks.length;
for (let i = n-1; i >= 0; --i) {
setTimeout(_ => GM_openInTab(selectedLinks[i].href), 10000 * (n - i));
} // timers open new tabs once per 10 000 ms
}
}
})();
Нормально работает, если выделять текст с конца — снизу вверх справа налево. Если сверху вниз — иногда открывает ссылки в обратном порядке.






