Открывать ссылки в новой вкладке длинным кликом (Firefox24+)
Автор: bunda1, Dumby
Версия: от 20.06.2016.
Описание: Код даёт возможность открывать ссылки или ссылки-изображения в новой фоновой или активной вкладке удержанием левой клавиши мыши на ссылке, по умолчанию ссылки открывается в фоновой вкладке и рядом с текущей вкладкой. Время удержания и варианты открытия вкладки можно изменить в начале кода.
Проблемы: Возможно код не будет работать если у вас установлено расширение Link Status Redux,
// Открывать ссылки длинным кликом, от 20.06.2016. .................... (function func() { var time = 500; // время удержания в мс var background = true; // открывать в фоновой вкладке var nextToCurrent = true; // открывать рядом с текущей вкладкой function handleLongPress(e) { window.clearTimeout(func.timer); setTimeout(()=> { try { func.removeListener() } catch(e) {} }, 0); var lab = XULBrowserWindow.overLink; if ( e.button || !lab || lab.startsWith("javascript") ) return; if ( e.type == "mousedown" && !e.target.className.startsWith("ui-slider-handle") ) { func.timer = setTimeout(()=> { function c(e) { e.preventDefault(); e.stopPropagation() }; addEventListener('click', c, true); func.removeListener =()=> { removeEventListener('click', c, true) }; gBrowser.loadOneTab(lab, {relatedToCurrent: nextToCurrent, inBackground: background, referrerURI: makeURI(content.location.href)}); }, time); } else clearTimeout(func.timer); }; ["mouseup", "mousedown", "dragstart"] .forEach(type=> { addEventListener(type, handleLongPress, true, gBrowser) }); })();
Отредактировано bunda1 (30-01-2014 21:51:17)
Отсутствует
bunda1
А как сделать, чтобы вкладки открывались не в конце списка, а после текущей вкладки.
Почему на Последние новости мира и России онлайн - Росбалт.ру при попытке открыть комментарии к статье, открывается главная страница?
И ещё, из каких соображений const time = 500;, на мой взгляд достаточно 200, удобней. ИМХО. Понимаю, что каждый правит под себя, но просто интересно.
Отсутствует
А как сделать, чтобы вкладки открывались не в конце списка, а после текущей вкладки.
на
Отредактировано 2k1dmg (07-09-2013 13:26:21)
Отсутствует
Почему на Последние новости мира и России онлайн - Росбалт.ру при попытке открыть комментарии к статье, открывается главная страница?
Потому что не передаётся реферрер. // А ещё было бы неплохо фильтровать ссылки с протоколом javascript:
Отсутствует
Почему на Последние новости мира и России онлайн - Росбалт.ру при попытке открыть комментарии к статье, открывается главная страница?
И ещё, из каких соображений const time = 500;, на мой взгляд достаточно 200, удобней. ИМХО. Понимаю, что каждый правит под себя, но просто интересно.
Комментарии к статье открывается не правильно потому что код берет адрес от сплывающей подсказки которая появляется у панели расширений. И похоже что эта подсказка не правильно показывает адрес. Пока не знаю как с этим справится без полной переделки кода, буду думать.
Добавлено 07-09-2013 13:56:29
А вот time = 500 случаен.
Отредактировано bunda1 (07-09-2013 13:56:29)
Отсутствует
Пока не знаю как с этим справится без полной переделки кода, буду думать.
Ну если это нигде больше не проявляется, и никому больше не мешает, то можешь и не заморачиваться. Я всё равно открываю там комментарии в текущей вкладке, а ошибку просто обнаружил, когда кнопку тестировал.
Отсутствует
bunda1
Например так: gBrowser.loadOneTab( lab, {relatedToCurrent: true, inBackground: true, referrerURI: makeURI(content.location.href)} );
voqabuhe
А почему не Right links где это работает?
Отсутствует
Например так: gBrowser.loadOneTab( lab, {relatedToCurrent: true, inBackground: true, referrerURI: makeURI(content.location.href)} );
Вот спасибо, оказалось что это просто.
// А ещё было бы неплохо фильтровать ссылки с протоколом javascript:
Ok.
Добавлено 07-09-2013 14:31:18
Исправил Открывать ссылки в новой вкладке длинным кликом
Отредактировано bunda1 (07-09-2013 14:39:35)
Отсутствует
Открывать ссылки и закладки в новой вкладке длинным кликом ( Firefox 17+ )
Автор: Dumby
Версия: от 03.12.2013.
Описание: Код даёт возможность открывать ссылки, ссылки-изображения и закладки( из боковой панели не открывает ) в новой фоновой или активной вкладке удержанием левой клавиши мыши. Ссылки или закладки по умолчанию открывается в фоновой вкладке и рядом с текущей вкладкой. Изменить время удержания и варианты открытия вкладки или отключить длинный клик для закладок можно в начале кода.
Проблемы: Возможно код не будет работать если у вас установлено расширение Link Status Redux,
на:
var lab = XULBrowserWindow.statusTextField.label.split(' '); lab = (lab.length > 1) ? lab[1] : lab[0];
// Открывать ссылки и закладки в новой вкладке длинным кликом, от 03.12.2013. ................................ (function() { const time = 500, referrer = true, bookmarks = true, background = true; related_to_current = true; function hahdleMouseEvent(e) { e.preventDefault(); e.stopPropagation(); e.type == "mouseup" && closeMenus(e.target); } var timeout, node; if (background) var type; if (bookmarks) var trg, xe, bookmark; function handleLongPress(e) { if (e.button) return; var lab = XULBrowserWindow.statusTextField.label; if (bookmarks) { trg = e.target; xe = trg instanceof XULElement; bookmark = trg._placesNode && !trg.hasAttribute("container") && xe; if (xe && !bookmark) return; if (bookmark) lab = trg._placesNode.uri; } if (!lab || lab.startsWith("javascript") || gBrowser.webProgress.isLoadingDocument) return; if (e.type == "mousedown") { timeout = setTimeout(function() { node = e.target; var ref, doc = node.ownerDocument; if (background) { type = bookmarks && bookmark && node.nodeName == "menuitem" ? "mouseup" : "click"; node.addEventListener(type, hahdleMouseEvent, true); } if (referrer && !xe && doc.location.protocol.startsWith("http")) ref = makeURI(doc.location, doc.charsetSet); gBrowser.loadOneTab(lab, { referrerURI: ref, inBackground: background, relatedToCurrent: related_to_current }); timeout = null; }, time); } else { if (timeout) timeout = clearTimeout(timeout); if (node && background) node = !setTimeout(function(node) node.removeEventListener(type, hahdleMouseEvent, true), 50, node); } } ["mouseup", "mousedown", "dragstart"] .forEach(function(type) addEventListener(type, handleLongPress, true, bookmarks ? window : gBrowser)); })();
Отредактировано bunda1 (09-02-2015 20:12:13)
Отсутствует
bunda1
Исправлены ошибки: Длинный клик произвольно срабатывал на страницах которые загружается.
Вот спасибо, хорошая новость.
Отредактировано villa7 (03-12-2013 18:03:44)
Лучше спросить у знающих - чем лезть не зная.
Отсутствует
bunda1
Сегодня обновил, ни на 24 ни на 26 не пашет. CB 0.0.5.7pre3
У меня вроде работает, а старая версия кода как работает:
// Открывать ссылки в новой вкладке длинным кликом, от 16.10.2013. ................................ (function func() { const time = 500; // время удержания в мс const background = false; // открывать в фоновой вкладке const nextToCurrent = true; // открывать рядом с текущей вкладкой function handleLongPress(e) { setTimeout(function() { try { func.removeListener() } catch(e){} }, 0) var lab = XULBrowserWindow.statusTextField.label; if ( e.button || !lab || lab.startsWith("javascript") ) return; if ( e.type == "mousedown" && !e.target.className.startsWith("ui-slider-handle") ) { func.timer = setTimeout(function() { function c(e) { e.preventDefault(); e.stopPropagation() }; addEventListener('click', c, true); func.removeListener = function() { removeEventListener('click', c, true) }; gBrowser.loadOneTab( lab, {relatedToCurrent: nextToCurrent, inBackground: background, referrerURI: makeURI(content.location.href)} ); }, time ); } else clearTimeout( func.timer ); }; ["mouseup", "mousedown", "dragstart"] .forEach(function(type) { addEventListener(type, handleLongPress, true, gBrowser) }); })();
Отсутствует
bunda1
Да, старый код работает отлично, обновлялся чисто из за этого
Исправлены ошибки: Длинный клик произвольно срабатывал на страницах которые загружается.
Может СВ 0.0.5.7pre3 не той версии.
P.S. Проверил на чистой 25-ой, старый код работает, новый не хочет.
Отредактировано villa7 (03-12-2013 21:04:53)
Лучше спросить у знающих - чем лезть не зная.
Отсутствует
villa7
// Открывать ссылки в новой вкладке длинным кликом, от 03.12.2013. ................................ (function func() { const time = 500; // время удержания в мс const background = false; // открывать в фоновой вкладке const nextToCurrent = true; // открывать рядом с текущей вкладкой function handleLongPress(e) { setTimeout(function() { try { func.removeListener() } catch(e){} }, 0) var lab = XULBrowserWindow.statusTextField.label; if ( e.button || !lab || lab.startsWith("javascript") || lab.slice(0,4) !== "http" ) return; if ( e.type == "mousedown" && !e.target.className.startsWith("ui-slider-handle") ) { func.timer = setTimeout(function() { function c(e) { e.preventDefault(); e.stopPropagation() }; addEventListener('click', c, true); func.removeListener = function() { removeEventListener('click', c, true) }; gBrowser.loadOneTab( lab, {relatedToCurrent: nextToCurrent, inBackground: background, referrerURI: makeURI(content.location.href)} ); }, time ); } else clearTimeout( func.timer ); }; ["mouseup", "mousedown", "dragstart"] .forEach(function(type) { addEventListener(type, handleLongPress, true, gBrowser) }); })();
Отсутствует
bunda1
Неа, ни в 24 ни в 25 чистой не хочет работать, уже и СВ менял отсюда
http://mozdev.oregonstate.edu/custombut … -0-5-7pre/
Лучше спросить у знающих - чем лезть не зная.
Отсутствует
// Открывать ссылки в новой вкладке длинным кликом, от 03.12.2013. ................................ (function func() { const time = 500; // время удержания в мс const background = false; // открывать в фоновой вкладке const nextToCurrent = true; // открывать рядом с текущей вкладкой function handleLongPress(e) { setTimeout(function() { try { func.removeListener() } catch(e){} }, 0) var lab = XULBrowserWindow.statusTextField.label; if ( e.button || !lab || lab.startsWith("javascript") || gBrowser.webProgress.isLoadingDocument ) return; if ( e.type == "mousedown" && !e.target.className.startsWith("ui-slider-handle") ) { func.timer = setTimeout(function() { function c(e) { e.preventDefault(); e.stopPropagation() }; addEventListener('click', c, true); func.removeListener = function() { removeEventListener('click', c, true) }; gBrowser.loadOneTab( lab, {relatedToCurrent: nextToCurrent, inBackground: background, referrerURI: makeURI(content.location.href)} ); }, time ); } else clearTimeout( func.timer ); }; ["mouseup", "mousedown", "dragstart"] .forEach(function(type) { addEventListener(type, handleLongPress, true, gBrowser) }); })();
Отсутствует
Мистика однако.
Нет мистики
Дело в том, что открывать вкладку в бэкграунде "чисто" не получится на "mousedown", если сам сайт предполагает открытие в текущей вкладке...
И даже referrerURI: makeURI(content.location.href) не поможет.
Что происходит при открытии линка в бэкгроунде на "mousedown" с таймаутом?
1. Линк таки да открывается в бэкгроунде и там где нужно.
2. Но!!! Когда "mousedown" проходит, то сайт который этот линк выставил пытается сделать то, что этим сайтом задумывалось - открыть линк в текущей вкладке.
Почему при этом referrerURI: makeURI(content.location.href) не помогает - есть тому масса причин - никто не знает как сайт построен.
Поэтому имхо, либо надо смириться с тем, что длинным кликом вкладки открывать в форграунде, либо попытаться проделать трюк:
а) на "mousedown" с таймаутом не открывать вкладку, а подготовить всё для её открытия и установить флаг типа "NotDefault".
б) на "mouseup"/"click" если установлен "NotDefault" сделать то, что теперь делается на "mousedown" и сбросить флаг "NotDefault" - тогда может удастся "передавить" действия самого сайта. Но я не знаю насколько "железно" будет передаваться флаг (и всё остальное, что заготовлено) из "mousedown" в "mouseup"/"click" ...
-----------------------------------------------------------
Ещё один нюанс.
Вначале, когда я установил "Открывать ссылки в новой вкладке длинным кликом, от 03.12.2013. ..", то столкнулся со следующим феноменом:
одни ссылки открывались длинным кликом, а другие давали вкладку с сообщением типа "невозможно открыть, неверный тип адреса" или подобное.
При этом обычным кликом эти ссылки открывались.
Более того, некоторые ссылки сначала открывались, а потом переставали, как будто им надоедало
Я долго ломал голову над этим феноменом, пока наконец, не понял в чём дело.
У меня установлен аддон "Link Status Redux", который подсказывает мне в статусной строке при ховеринге ссылки, посещал ли я ранее эту ссылку или нет и если да, то когда, есть ли она у меня в закладках и т.д.
Эта кнопка тоже пользуется этим статусом в var lab = XULBrowserWindow.statusTextField.label. Естественно, когда lab получал только линк, было всё ОК.
Но если lab получал типа "✩ http://forum.mozilla-russia.org/post.php?tid=60215&qid=635286 (2 minutes ago)", то сами понимаете, что браузер на такое ругался .
Поскольку тот аддон был для меня полезен и даже важен, я немного поменял код кнопки:
var lab = XULBrowserWindow.statusTextField.label.split(' ');
lab = (lab.length > 1) ? lab[1] : lab[0];
Конечно, если сам url не дай бог содержит пробелы - это работать не будет, но отключать тот аддон я не хочу...
Если у кого-то он установлен - учтите этот нюанс.
А если для определения url можно было бы использовать не XULBrowserWindow.statusTextField.label а что-то ей эквивалентное, но которое тот аддон не меняет, было бы лучше...
Отредактировано difabor (15-12-2013 12:03:27)
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
Дело в том, что открывать вкладку в бэкграунде "чисто" не получится на "mousedown", если сам сайт предполагает открытие в текущей вкладке...
Пример не помешал бы!
Добавлено 15-12-2013 16:30:57
Спасибо за информацию насчёт Link Status Redux, я это укажу в описании кода.
Отредактировано bunda1 (15-12-2013 16:30:57)
Отсутствует
difabor пишетДело в том, что открывать вкладку в бэкграунде "чисто" не получится на "mousedown", если сам сайт предполагает открытие в текущей вкладке...
Пример не помешал бы!
Добавлено 15-12-2013 16:30:57
Спасибо за информацию насчёт Link Status Redux, я это укажу в описании кода.
Я не совсем понял, что подразумевается под примером.
На всякий случай даю сайт.
Там "Из первого мира в третий" - это линк. Он у меня открывается только в форграунде при длинном клике.
Если сделать "background = true" в коде, то он таки да будет открываться в бэкграунде при длинном клике, но при отпускании мышки, исходный сайт будет также загружаться этим линком.
Если же Вы под примером имели в виду другое - детализируйте пожалуйста, я чесслово не совсем понял.
---------------------------------------------------------------
P.S. Я таки да нашёл способ как открывать такие вкладки в бэкграунде:
1. Длинное нажатие на ЛКМ
2. Не отпуская ЛКМ уводите её с линка
3. Отпускаете ЛКМ
Тогда исходный сайт "не замечает" клика и не делает ерунду
Отредактировано difabor (15-12-2013 17:07:48)
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
Я не совсем понял, что подразумевается под примером.
На всякий случай даю сайт.
Там "Из первого мира в третий" - это линк. Он у меня открывается только в форграунде при длинном клике.
Ты правильно понял насчёт примера но у меня длинный клик твой пример открывает в фоновой вкладке без проблем
Добавлено 15-12-2013 17:22:03
Проверил на чистом профиле и тот же результат.
Отредактировано bunda1 (15-12-2013 17:23:11)
Отсутствует