Уважаемый bunda1
На этом сайте и ещё на многих других это обеспечивается content.document.getElementsByTagName("textarea")[0].scrollByНу я же писал что работает в Блокноте в вкладке, а там только одна textarea. А так okkamas_knife прав.
Кроме того, на этом сайте, на этой странице есть поле PRE - там ни 0, ни 1, ни 2, ни 3 не помогают.... А это поле - код под спойлером.
Да, на этой странице 5 PRE, вот как это можно узнать alert(content.document.getElementsByTagName("PRE").length);. Для того что бы передвигать PRE нужно узнать на каком по счёту PRE находится фокус или курсор и использовать content.document.getElementsByTagName("textarea")[?].scrollBy. Или как я уже писал получить textarea или PRE по клику из e.target. Не знаю какой вариант лучше.
Вот я и спрашиваю - как получить его из e.target по клику (или не из e.target - но по клику).
Я хочу по клику:
1) Узнать скроллится ли этот элемент отдельно (есть у него типа overflow) или нет. Наверное есть какое-то свойство, которое об этом говорит. Можно ли его получить по клику или нет?
2) Если этот элемент скроллится отдельно, мне надо его отдельно проскроллить не колёсиком, если не скроллится отдельно - то как сейчас - проскролить весь контент.
3) Допустим, я узнал - и оно отдельно скроллится (у него есть типа overflow). Я могу узнать как называется нужный элемент (напр. если у него есть ID (e.target.id - я его могу получить, а потом - по getElementById, если нет ИД, то могу узнать e.target.nodeName)
4) Скорее всего - у него нет ИД, я получаю e.target.nodeName - как по этому имени узнать нужный мне номер? Число элементов PRE не поможет, мне надо знать конкретный index для кликнутого элемента.
5) Вот как это сделать?
а) узнать скроллится или нет -> б)если скроллится -> получить его по getElement... -> в) проскроллить.
Добавлено 28-09-2017 09:44:10
Добавлено 28-09-2017 09:31:35
Кстати, оказывается textarea можно легко получить из content.document.activeElement . Типа:Выделить кодКод:
var el = content.document.activeElement.localName; if ( el.localName = 'textarea' ) el.scrollBy();Но с pre это не работает.
Спасибо. Но мне ещё надо узнать скроллится ли эта textarea или нет - если там пусто или всего 2-3 короткие строки - она отдельно скроллиться не будет.
Отредактировано difabor (28-09-2017 09:55:50)
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
1) Узнать скроллится ли этот элемент отдельно (есть у него типа overflow) или нет. Наверное есть какое-то свойство, которое об этом говорит. Можно ли его получить по клику или нет?
Я не знаю как узнать скроллится ли этот элемент отдельно и мне кажется это не нужным, пусть ползователь сам смотрит можно ли передвигать textarea или pre.
Вот я и спрашиваю - как получить его из e.target по клику (или не из e.target - но по клику).
addEventListener("click", (e, trg = e.target)=>{ if ( trg.localName == 'pre' ) alert('pre'); if ( trg.localName == 'textarea' ) alert('textarea'); }, false, gBrowser);
Добавлено 28-09-2017 11:24:09
trg и будет pre или textarea
Отредактировано bunda1 (28-09-2017 11:24:09)
Отсутствует
difabor
Во первых вам уже сказали что это для не e10s...
потому что вызов content из chrome скрипта вернёт null в e10s
и не только content
gBrowser.contentDocument; // null
gBrowser.selectedBrowser.contentWindow; // null
window.content; // null
content; // null
Узнать скроллится ли этот элемент отдельно (есть у него типа overflow) или нет.
Я бы как-то так сделал для frame скрипта https://developer.mozilla.org/en-US/Fir … d_lifetime
но должно работать и из chrome (с не e10s)
var Click_Event_Handler = { scrollable: null, scrolldir: null, init: function() { addEventListener("click", this, false); }, handleEvent: function(e) { this.find_ScrollableElement(e.target); if (!this.scrollable) return; if (this.scrolldir == "NS") //прокрутка по вертикали this.scrollable.scrollBy(0, 50); else if (this.scrolldir == "EW") //прокрутка по горизонтали this.scrollable.scrollBy(50, 0); else if (this.scrolldir == "NSEW") //прокрутка по вертикали и горизонтали this.scrollable.scrollBy(50, 50); }, find_ScrollableElement(aNode) { const scrollingAllowed = ["scroll", "auto"]; for (this.scrollable = aNode; this.scrollable; this.scrollable = this.scrollable.parentNode) { if (!(this.scrollable instanceof content.HTMLElement) || ((this.scrollable instanceof content.HTMLSelectElement) && !this.scrollable.multiple)) continue; var overflowx = this.scrollable.ownerGlobal.getComputedStyle(this.scrollable).getPropertyValue("overflow-x"); var overflowy = this.scrollable.ownerGlobal.getComputedStyle(this.scrollable).getPropertyValue("overflow-y"); var scrollVert = this.scrollable.scrollTopMax && (this.scrollable instanceof content.HTMLSelectElement || scrollingAllowed.indexOf(overflowy) >= 0); if (!(this.scrollable instanceof content.HTMLSelectElement) && this.scrollable.scrollLeftMin != this.scrollable.scrollLeftMax && scrollingAllowed.indexOf(overflowx) >= 0) { this.scrolldir = scrollVert ? "NSEW" : "EW"; break; } else if (scrollVert) { this.scrolldir = "NS"; break; } } if (!this.scrollable) { this.scrollable = aNode.ownerGlobal; if (this.scrollable.scrollMaxX != this.scrollable.scrollMinX) { this.scrolldir = this.scrollable.scrollMaxY != this.scrollable.scrollMinY ? "NSEW" : "EW"; } else if (this.scrollable.scrollMaxY != this.scrollable.scrollMinY) { this.scrolldir = "NS"; } else if (this.scrollable.frameElement) { this.find_ScrollableElement(this.scrollable.frameElement); } else { this.scrollable = null; } } }, destroy: function() { removeEventListener("click", this, false); } }; Click_Event_Handler.init(); addEventListener("unload", function unload() { removeEventListener("unload", unload, false); Click_Event_Handler.destroy(); }, false);
Отредактировано Vitaliy V. (28-09-2017 17:06:44)
Отсутствует
Во первых вам уже сказали что это для не e10s...
потому что вызов content из chrome скрипта вернёт null в e10s
и не только content
Во-первых, большое спасибо, Vitaliy V. - и за разъяснение и за код. Постараюсь имплементировать что смогу (что позволит моя скудная квалификация).
Во-вторых, поскольку я дилетант, то для меня очень важно понять. У меня нет сомнения, что если корифей пишет, что это не для e10s, то так оно и есть.
Но когда я вижу, что в e10s оно работает, возникает естественный вопрос - почему?
Я, повторяю, не знаток, чтобы знать, что вызов content (и не только content ) из chrome скрипта вернёт null в e10s - теперь буду знать.
А то что у вас пока работает - это прокладки совместимости которые уже удалены в новых
Vitaliy V., вполне возможно, что в будущих новых предложенная СВ не будет работать и не в e10s - мало кнопок СВ отвалилось?
Я - человек простой, что вижу - то пою, как говорится. А вижу я, что в моей версии 52.3.0 ESR работает - откуда же мне знать, что это благодаря прокладкам совместимости?
Но безотносительно всего этого - ещё раз большое спасибо за разъяснение и за код.
Пользуясь случаем, хочу уяснить для себя: почему в коде анализируется отдельно горизонтальное, вертикальное и оба направления:
if (this.scrolldir == "NS") //прокрутка по вертикали this.scrollable.scrollBy(0, 50); else if (this.scrolldir == "EW") //прокрутка по горизонтали this.scrollable.scrollBy(50, 0); else if (this.scrolldir == "NSEW") //прокрутка по вертикали и горизонтали this.scrollable.scrollBy(50, 50);
Почему нельзя сразу дать this.scrollable.scrollBy(50, 50), даже если есть только одно из направлений? Вместо скроллинга убежит фокус или другая какая-то причина?
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
почему в коде анализируется отдельно горизонтальное, вертикальное и оба направления: ... Почему нельзя сразу дать this.scrollable.scrollBy(50, 50), даже если есть только одно из направлений?
Так это пример для наглядности, и может что ещё понадобится сделать или отменить по этим условиям.
Отредактировано Vitaliy V. (28-09-2017 19:40:00)
Отсутствует
difabor пишетпочему в коде анализируется отдельно горизонтальное, вертикальное и оба направления: ... Почему нельзя сразу дать this.scrollable.scrollBy(50, 50), даже если есть только одно из направлений?
Так это пример для наглядности, и может что ещё понадобится сделать или отменить по этим условиям.
Спасибо
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
немного оживил DOM Inspector: dom_inspector-2.0.16-fixed.xpi
Предположительно снова сломали (пустые панели).
document.querySelector(":-moz-devtools-highlighted"); на 57.0b4 возвращает null,
а на 58.0a1 (2017-09-29) образует ошибку
SyntaxError: ':-moz-devtools-highlighted' is not a valid selector
Возможно как-то связано с этим.
Закомментировал соответствующую строку и панели появились,
и, вроде, даже Flasher работает.
function Flasher(aColor, aThickness, aDuration, aSpeed, aInvert) { //document.querySelector(HIGHLIGHTED_PSEUDO_CLASS);
function Flasher(aColor, aThickness, aDuration, aSpeed, aInvert) { //document.querySelector(HIGHLIGHTED_PSEUDO_CLASS); try { document.querySelector(HIGHLIGHTED_PSEUDO_CLASS); } catch(ex) { if (ex.message != "'" + HIGHLIGHTED_PSEUDO_CLASS + "' is not a valid selector") throw ex; }
Отредактировано Dumby (30-09-2017 15:13:04)
Отсутствует
А как в 2.48 можно сохранить скрин видимой области страницы - без запроса, в папку загрузок. Если файл с таким именем уже существует - то перезаписать.
Поискал в готовых - не скринится что-то ни одна кнопка, только PDF-ица.
Отсутствует
Поделитесь кнопкой(когда-то видел, не нужна была) щас понадобилась - немогу найти.
Кнопка с таким действием: "Не закрывать меню GreaseMonkey при вкл\выкл скриптов"
...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation
Отсутствует
Отсутствует
Есть прога AdvOR. С ярлыка на рабочем столе запускаю с такой командой --QuickStart "Maxthon" Как это можно запускать через кнопку запуска приложений, тыкал - мыкал, никак не могу прикрутить эту команду в кнопку. Или сделать чтобы запускался не .exe файл, а ярлык на рабочем столе, в нём команда уже прописана.
Лучше спросить у знающих - чем лезть не зная.
Отсутствует
Обнаружил, что этот код Dumby
((listener, popup = document.getElementById("greasemonkey-tbb").firstChild) => ["mousedown", "popuphiding"].forEach(type => addEventListener(type, listener, false, popup)) )({handleEvent(e) { if (e.type != "popuphiding") this.flag = e.target.script && !e.button; else if (this.flag) e.preventDefault(setTimeout(obj => obj.flag = false, 50, this)); }});
ведёт себя по-разному, в зависимости от того, на каком тулбаре размещена иконка greasemonkey-tbb
1) Если на nav-bar - всё ОК, меню остаётся открытым после включения/отключения скрипта на этом меню Левой Кнопкой Мыши (ЛКМ).
2) Если на PersonalToolbar или menubar- то после первого клика меню не закрывается, а после второго - закрывается, как правило. После этого, оно открывается лишь после второго клика на дропмаркер.
3) Если на других тулбарах - меню закрывается после первого же клика ЛКМ по менюитему и затем оно тоже открывается лишь после второго клика на дропмаркер.
"Игрался" с задержками, менял mousedown на mouseup, добавлял mouseup - ничего не помогает...
Причём поведение на всех тулбарах, кроме nav-bar трудно назвать консистентным - иногда меню закрывалось после клика ЛКМ на менюитем, а потом снова открывалось. Это случалось крайне редко.
Может Dumby посмотрит в чём дело и вынесет окончательный вердикт?
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
сделать чтобы запускался не .exe файл, а ярлык на рабочем столе, в нём команда уже прописана
За Windows NT 5.1 не скажу, но у меня на Win7, вроде, так работает
Components.Constructor("@mozilla.org/file/local;1", "nsIFile", "initWithPath") ("C:\\Users\\Admin\\Desktop\\ярлык.lnk").launch();
Если на PersonalToolbar
Поставил Greasemonkey 3.16 на Firefox 52.0, и, действительно, вижу такое.
Чудеса какие-то. Попробовал переделать. Тоже не конфета, но, надеюсь, чуть получше.
(listener => { if (listener.init() || !("CustomizableUI" in window)) return; var widget = CustomizableUI.getWidget("greasemonkey-tbb"); if (!widget || widget.areaType != "menu-panel") return; var panel = document.getElementById("PanelUI-popup"); panel && addEventListener("popupshown", function func() { removeEventListener("popupshown", func, false, panel); listener.init(); }, false, panel); })({ ts: 0, handleEvent(e) {this[e.type](e);}, init() { var btn = document.getElementById("greasemonkey-tbb"); if (!btn || !btn.firstChild) return false; for(var type of ["mousedown", "popuphiding"]) addEventListener(type, this, false, this.popup = btn.firstChild); return true; }, getNode() { var node = this.popup.querySelector("menuitem[_moz-menuactive]:hover"); return node && node.script && node; }, popuphiding(e) { e.target == this.popup && this.getNode() && Cu.now() - this.ts < 400 && e.preventDefault(); }, mousedown(e) { if (e.button) return this.ts = 0; var node = this.getNode(); if (node) node.setAttribute("closemenu", "none"), this.ts = Cu.now(); } });
Отсутствует
difabor пишетЕсли на PersonalToolbar
Поставил Greasemonkey 3.16 на Firefox 52.0, и, действительно, вижу такое.
Чудеса какие-то. Попробовал переделать. Тоже не конфета, но, надеюсь, чуть получше.
Большущее спасибо! Работает везде!
Почему не конфетка? Конфетка!
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
Позаимствовал ещё одну функцию из расширений: DisableBackspaceNavigation
Вкратце - в чём суть.
В Мозилле клавиша Backspace выполняет двойную роль: в текстовых полях она стирает символ слева от курсора, а в полях, где можно только читать делает операцию Back, то есть то же, что и стрелка "Назад".
Казалось бы логично: стирать нечего - зачем же добру пропадать?
Но представьте себе, что вы набирали какой-то текст в текстовом поле, затем нечаянно сдвинули мышку за пределы и, думая, что вы еще в текстовом поле - хотите стереть символ, нажимая Backspace.
И вместо этого вы переходите на предыдущий сайт/страницу этой вкладки... Сюрприз не из приятных.
Короче, эта функция Back иногда выходит боком...
Код, который я привожу блокирует эту функцию Back. Он полностью взят из расширения по ссылке.
function DisableBackspaceNavigation (){this.removeKey=function(keyset){ var keys = keyset.getElementsByTagName ("key"); for (var n = 0; n < keys.length; n++) { var key = keys[n]; if (key.tagName != "key") {continue;} if (key.getAttribute("keycode")!="VK_BACK"){continue;} if (key.getAttribute("command")!="cmd_handleBackspace"){continue} key.removeAttribute ("command"); key.removeAttribute ("keycode"); } } this.traverseKeysets = function () { var keysets = document.getElementsByTagName ("keyset"); for (var n = 0; n < keysets.length; n++){ var keyset = keysets[n]; if (keyset.tagName != "keyset"){continue;} if (keyset.getAttribute ("id") != "mainKeyset") {continue;} this.removeKey (keyset); } } this.traverseKeysets (); } var disableBackspaceNavigation = new DisableBackspaceNavigation ();
custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EDisableBackSpace4Back%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEADAwAAAEAGAAlAgAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAMAAAADAgGAAAAVnVc5wAAAexJREFUKJE9kL1PU2Echd/BUahxYBFiKBgpRltEWj8SBxIn48Yf4NBidOhVEyXGycGoXSQxLiYmJn6QKCbQSm+LGBwcSEShvb181gjhI6mAFWupxfv+HodLGM5whnPynKPqe9J4jCS1RhJP1MQTNakxhvBEk9TfSPNqbBlBIwiCRu2NmqjuOCoSR0UGUZcSqHCCmivv6B3Js1V1EHEQ0WgR1D4jiYokUN0JNxAeRF18S9udj3xZ+IWI7Egj4qBqDdNtDyfYExmguec9D4fzLKyVeZDKM18oISLoyhYbr/t3AuE4B66lud5nYS1v4jiCIw7zhRL3Ut+YXCyy/vQZ0yfPojxRk87YJ74uFl1eBIRdlNXCT950XSZ35Dh2IIjabyS5b+bR4qBFqGy740QEcf6xFuvFrmsg423Bbguh6owUj0YX0KJZ+f2XAatApeq+Up6YwG4/RabRR6aplZw/hGq4OkT/+CrlbYfk1AZLxS20FnS5zNLNW2QbW8h6W8l6fUz5O1D+26OMfS9izq3zo1TdRfnzeRz7aAdZr49J72Emm1uxAiFU+IXF2OImKzN5NodHWH/ZR+HxE+YudJE5eIhMk4+s15V17ATq+YcZZu/GmD13Hqv9NHZbCNsfxPZ3kAsEyQWCrg8EmT7TyX9ES6TdDpzxSQAAAABJRU5ErkJggg%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*Initialization%20Code*/%0Afunction%20DisableBackspaceNavigation%20%28%29%7Bthis.removeKey%3Dfunction%28keyset%29%7B%0A%09%09var%20keys%20%3D%20keyset.getElementsByTagName%20%28%22key%22%29%3B%0A%09%09for%20%28var%20n%20%3D%200%3B%20n%20%3C%20keys.length%3B%20n++%29%09%7B%09var%20key%20%3D%20keys%5Bn%5D%3B%0A%09%09%09if%20%28key.tagName%20%21%3D%20%22key%22%29%09%7Bcontinue%3B%7D%0A%09%09%09if%20%28key.getAttribute%28%22keycode%22%29%21%3D%22VK_BACK%22%29%7Bcontinue%3B%7D%0A%09%09%09if%20%28key.getAttribute%28%22command%22%29%21%3D%22cmd_handleBackspace%22%29%7Bcontinue%7D%0A%0A%09%09%09key.removeAttribute%20%28%22command%22%29%3B%0A%09%09%09key.removeAttribute%20%28%22keycode%22%29%3B%20%20%20%20%20%7D%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%09this.traverseKeysets%20%3D%20function%20%28%29%20%20%20%20%20%20%20%20%20%7B%0A%09%09var%20keysets%20%3D%20document.getElementsByTagName%20%28%22keyset%22%29%3B%0A%09%09for%20%28var%20n%20%3D%200%3B%20n%20%3C%20keysets.length%3B%20n++%29%7B%0A%09%09%09var%20keyset%20%3D%20keysets%5Bn%5D%3B%0A%09%09%09if%20%28keyset.tagName%20%21%3D%20%22keyset%22%29%7Bcontinue%3B%7D%0A%09%09%09if%20%28keyset.getAttribute%20%28%22id%22%29%20%21%3D%20%22mainKeyset%22%29%09%7Bcontinue%3B%7D%0A%09%09%09this.removeKey%20%28keyset%29%3B%20%20%20%20%20%20%20%20%20%20%20%09%09%7D%09%7D%0A%09this.traverseKeysets%20%28%29%3B%0A%7D%0A%0Avar%20disableBackspaceNavigation%20%3D%20new%20DisableBackspaceNavigation%20%28%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%0Acustombuttons.editButton%28this%29%3B%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E
Отредактировано difabor (03-10-2017 04:19:08)
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
А че с custom buttons будет в дальнейшем при переходе на 57 firefox?
Будет? Могу показать что есть на бете 57.0b5
А что будет, это знают только провидцы и инсайдеры.
Вот смотри, на предпоследних отсюда трёх страницах
предоставлен config.js и предоставлено четыре варианта CB.
Кто-нибудь из тех, кто мог бы быть заинтересован,
но пока не готов справиться сам, попробовал и отписался?
Поблагодарил? Выразил недоумение? Отругал?
Никто. Всем пофиг. Вот так оно и будет.
Несомненно только одно: Custom Buttons прекратит своё существование.
Весь вопрос в том когда. Сверхнадежда — дотащить до 59 ESR.
Отсутствует
Скорей всего с 56 такое(давно не смотрел):
Отсутствует
tom911 пишетА че с custom buttons будет в дальнейшем при переходе на 57 firefox?
Будет? Могу показать что есть на бете 57.0b5
А что будет, это знают только провидцы и инсайдеры.Вот смотри, на предпоследних отсюда трёх страницах
предоставлен config.js и предоставлено четыре варианта CB.Кто-нибудь из тех, кто мог бы быть заинтересован,
но пока не готов справиться сам, попробовал и отписался?
Поблагодарил? Выразил недоумение? Отругал?
Никто. Всем пофиг. Вот так оно и будет.Несомненно только одно: Custom Buttons прекратит своё существование.
Весь вопрос в том когда. Сверхнадежда — дотащить до 59 ESR.
1. Надо как-то квалифицированно выразить своё недовольство. Квалифицированно и аргументировано.
Лучше всего имхо - если корифеи предложат типа шаблона такого протеста и скажут куда его отправить. Если протест будет массовым, это может и сыграет роль.
Но протест должен быть конструктивным, т.е. обосновывающим что СВ могут ужиться с основными требованиями WE, если в WE отказаться от того-то и того-то и подстроиться под то-то и то-то.
Иными словами, постараться обосновать, что security и performance можно добиться даже расширив рамки WE до такого (конкретного) уровня.
Дело в том, что практически все авторы расширений, совместимых с WE твердят в один голос, что пришлось отказаться от многих функций. Но ещё ни один (из того, что я читал) не отметил, что WE у него что-то улучшило.
2. Найти альтернативную платформу под СВ. Если это возможно - такое может подстегнуть команду мозиллы.
Сейчас они уповают на безысходность юзеров. А если перед юзерами забрезжит выход, не очень приемлемый для мозиллы и грозящий уходом юзеров, их команда может и задумается...
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
Уважаемый, bunda1
Не могли бы Вы поправить кнопку Feed-button в адресной стоке для 57 версии.Она в ней не работает, появляется не в адресной строке, а на панели.
Отредактировано rubel (09-10-2017 09:55:24)
Отсутствует