difabor пишет3. Скроллинг без модификатора и без включения/отключения скроллинга - в "коридорах":
а) в правом вертикальном коридоре шириной 20рх (у правого края рабочей области) - вертикальный скроллинг
в) в нижнем горизонтальном коридоре шириной 20рх (у нижнего края рабочей области) - горизонтальный скроллингМожно ли установить задержку на включение этой функции (~1 сек)?
Вам нужна просто задержка, или фильтрация?
То есть, чтобы если Вы заскочили в "коридор" и быстро выскочили, чтобы вообще не было скроллинга?
Задержку я сделал. В не e10s работает. Теперь работаю над фильтрацией.
Как это будет в e10s проверю позже, когда сделаю фильтрацию. В e10s для меня куча сюрпризов, так что за e10s пока не ручаюсь.
Пока что - дайте мне знать, что Вам надо.
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
С фильтрацией - сложнее
Я над ней работаю. Как получится, дам знать.
Но задачку Вы мне поставили интересную Спасибо
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
Получил фильтрацию. Думаю, что получилось даже лучше, чем ожидал: сам скроллинг работает без задержек, но требуется порог нахождения в коридоре ~1 секунду, чтобы был скроллинг. Работает и в e10s
Подробное описание я дал в №12199. Ничего практически не изменилось кроме того, что добавлена фильтрация и я расширил коридоры до 30рх - раз случайных залётов можно избежать - сам коридор может быть и шире. Кому не понравится - может изменить: это переменные v=30 и h=30 - отдельно задаётся ширина вертикального и горизонтального коридоров. Длительность порога тоже можно менять: D=999 -> можете назначить другую длительность.
Здесь я приведу только код:
var rv=-1,tL=600,tO=3000,D=999,pw=1,pE=0,c=1,m=9999999,v=30,h=30; var B=0,mf,Mdn=[],EnS=[],V,H,X,Y; function cM(n,m){var x=(Date.now()-B>99)?(n+1)%m:n;B=Date.now();return(x)} function rM(n) {var x=(Date.now()-B>99) ? -n : n; B=Date.now();return(x)} function sp(base,pw) {return(base*Math.pow(Math.abs(base),pw))} addEventListener('keydown',e=>(!e.ctrlKey && e.altKey && e.shiftKey && (((e.keyCode==54)&&(rv=rM(rv)))||(e.keyCode==53)&&(pw=cM(pw,3)))),0,window); addEventListener("mousedown",(e)=>{if(Date.now()-B<99){B=Date.now();return} B=Date.now(); Mdn=[Date.now(),e.clientX,e.clientY,1]; if(Date.now()-EnS[1]>tO){pE=EnS[0]; EnS[0]=0}}, false, gBrowser); addEventListener("click",(e)=>{if(Date.now()-B<99) {B=Date.now();return} var udx=e.clientX-Mdn[1], udy=e.clientY-Mdn[2], trem=udx*udx+udy*udy; if (!e.button&&!e.altKey) { if (!e.ctrlKey&&!e.shiftKey&&(trem<9)&&(EnS[0]||pE)){EnS=[0,Date.now()]} if (!e.ctrlKey&&!e.shiftKey&&(Date.now()-Mdn[0]>tL)) { EnS[1]=Date.now();if(trem<9)EnS[0]=1 } if ( e.ctrlKey&&!e.shiftKey&&(Date.now()-Mdn[0]>tL)) custombuttons.editButton(this); if (!e.ctrlKey&& e.shiftKey&&(Date.now()-Mdn[0]>tL))gShowPopup(this); } Mdn[3]=0; B=Date.now(); pE=0;}, false, gBrowser); addEventListener("mousemove",(e)=>{ H=content.innerWidth-h,V=content.innerHeight-v,mf=e.ctrlKey&&!e.shiftKey&&!e.altKey; if (gBrowser.selectedBrowser.matches(":hover")){ if (mf||(((EnS[0]==1)&&(Date.now()-EnS[1]<=tO)) && (Mdn[3]==0))){ (EnS=((Date.now()-EnS[1]<=tO)&&EnS[0])?[1,Date.now()]:[0,0]); content.scrollBy(rv*sp(e.movementX,pw),rv*sp(e.movementY,pw))} else { setTimeout(()=>{X=e.clientX;Y=e.clientY},D); //Filter if (e.clientX >H && X>H && e.clientY >v && e.clientY < V ) /* Vertical aisle */ content.scrollBy(0,rv*sp(e.movementY,pw)); if (e.clientY >V && Y>V && e.clientX >h && e.clientX < H) /* Horizontal aisle */ content.scrollBy(rv*sp(e.movementY,pw),0); if (e.clientX<h&&X<h&&e.clientY<v&&Y<v)content.scrollBy(-m*c*rv,0); if (e.clientX<h&&X<h&&e.clientY>V&&Y>v)content.scrollBy( m*c*rv,0); if (e.clientX>H&&X>H&&e.clientY<v&&Y<v)content.scrollBy(0,-m*c*rv); if (e.clientX>H&&X>H&&e.clientY>V&&Y>V)content.scrollBy(0, m*c*rv); }}},false,gBrowser);
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%3EWheelLessScroll%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnJycGKioqCyYmJhEoKCgYKioqISkpJCceHhVUFRMkthsaIbQjIiZZKScqMykpKSkpKSkeKCgoEyYmJgwnJycHKSkpBS8vLgYsKy0DKCQpCx8eHTYbGjSQHBqB4R8Vr/8lPSH/LlwP3CQrH4QmJCYvKyolDS0tLAkpKSkKKSkpBiUlJQAjHycAGRwbNBUoA48VGTfmIhrP/yEd5f8bEcj/IkAZ/zeJAP81ewf/IDcc1BwWPHAhIRsYIyMfACcnJwAREhAeFzYLnyFhBOwodwD/GCJE/x0U2P8eGtP/GA/E/x49GP80fwD/M4IA/yVKG/8pI8H/JCWP0xcWKGsODQoLDBMIUShyBf8pfwD/JHQA/xggQv8eE97/HBfb/wwEof8OLA3/LnwC/zWFAP8kRhT/KSHE/zUz9f8sKZ77BwYFNxcvDE0lZwX/J3oA/yZ4AP8VIz7/CwCd/w4KV/8xMUb/Nioc/y83Bv8hYQT/IEYT/ysgxP82MOn/KSie9w8PHzodQAxMJmoD/yVwAP8ZSgD/EBcR/1lWYP+npaD/zM/W/31aP/+kUAD/bT8H/yQgCv8YEIj/Lynl/y0pqfobFTI8EiQATBYzA/8NKzj/ACV6/zI7VP/d19r/4t7o/8zO3P9vUzr/qVoA/8FpAf9pPAf/Ei0L/xoeTf8eFXb8GREzPgceUkwHOqT/Alf7/wBS+f80Q2f/1MnN/9fP2f/Ozdz/clQ8/6hYAP+1YwD/aDwI/yFeBf8ycAD/HzgK/hAQDkEENpZLAVTj/wBd//8ATev/NkNl/93U1P/b1dj/r7Gz/0k2KP+KQgD/umQA/24+Bf8cVAX/MnoE/y1iCP8cLA5DBDKMSwNO3P8AXP//AFH6/yM1W/+QjJP/Xl2D/zs5lP85N7D/KyRg/1QtGf9GIgD/G1QA/y93AP8lWgb/GSwNRQY5m04AUOH/AEbg/xE3kv8wJRf/HR1U/zxD3P9cXv//Xl///09R+P8qLpT/Kyo5/x86E/8QUwD/HVoB/xcyCUkHG0Y/MDVK95RjF//UhAD/7ZoA/8F7Av93RSj/QDF+/0s8lf+EeZz/ubjB//X29v/Z1dz/eoCA/x84Hf8JGQVFCwEABTQZAEGHWQKfzYcF7+CSB/+tjSj/YIxd/wyfmP8Yn53/g7Ov/+Dk5f/8+vr/0c3M8aeYlLFRPDleKRkVDA8FBAAZDAcAFxAJAB0SCiQ4Kh99BXKIzwDT3f8A////Ae7w/wu3vfE2ZW69X1FTczocCSdUNykAUz0xADcoHgAOBQQAHg8HACEWCAAZEgwALBkWAA4PJxINg49hDrzBrg2usog1bnI0REFGBEtBQwA5GQUAWj4xAFM+MwA1Jh0A/n8AAPgfAADgDwAAgAMAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAMADAAD4HwAA/n8AAA%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bvar%20rv%3D-1%2CtL%3D600%2CtO%3D3000%2CD%3D999%2Cpw%3D1%2CpE%3D0%2Cc%3D1%2Cm%3D9999999%2Cv%3D30%2Ch%3D30%3B%0Avar%20B%3D0%2Cmf%2CMdn%3D%5B%5D%2CEnS%3D%5B%5D%2CV%2CH%2CX%2CY%3B%0A%0Afunction%20cM%28n%2Cm%29%7Bvar%20x%3D%28Date.now%28%29-B%3E99%29%3F%28n+1%29%25m%3An%3BB%3DDate.now%28%29%3Breturn%28x%29%7D%0Afunction%20rM%28n%29%20%20%7Bvar%20x%3D%28Date.now%28%29-B%3E99%29%20%3F%20-n%20%3A%20n%3B%20B%3DDate.now%28%29%3Breturn%28x%29%7D%0Afunction%20sp%28base%2Cpw%29%20%7Breturn%28base*Math.pow%28Math.abs%28base%29%2Cpw%29%29%7D%0A%0AaddEventListener%28%27keydown%27%2Ce%3D%3E%28%21e.ctrlKey%20%26%26%20e.altKey%20%26%26%20e.shiftKey%20%26%26%0A%28%28%28e.keyCode%3D%3D54%29%26%26%28rv%3DrM%28rv%29%29%29%7C%7C%28e.keyCode%3D%3D53%29%26%26%28pw%3DcM%28pw%2C3%29%29%29%29%2C0%2Cwindow%29%3B%0A%0AaddEventListener%28%22mousedown%22%2C%28e%29%3D%3E%7Bif%28Date.now%28%29-B%3C99%29%7BB%3DDate.now%28%29%3Breturn%7D%0A%20%20B%3DDate.now%28%29%3B%20Mdn%3D%5BDate.now%28%29%2Ce.clientX%2Ce.clientY%2C1%5D%3B%0A%20%20if%28Date.now%28%29-EnS%5B1%5D%3EtO%29%7BpE%3DEnS%5B0%5D%3B%20EnS%5B0%5D%3D0%7D%7D%2C%20false%2C%20gBrowser%29%3B%0A%0AaddEventListener%28%22click%22%2C%28e%29%3D%3E%7Bif%28Date.now%28%29-B%3C99%29%20%7BB%3DDate.now%28%29%3Breturn%7D%0A%20%20var%20udx%3De.clientX-Mdn%5B1%5D%2C%20udy%3De.clientY-Mdn%5B2%5D%2C%20trem%3Dudx*udx+udy*udy%3B%0A%20%20if%20%28%21e.button%26%26%21e.altKey%29%20%7B%0A%20%20%20%20if%20%28%21e.ctrlKey%26%26%21e.shiftKey%26%26%28trem%3C9%29%26%26%28EnS%5B0%5D%7C%7CpE%29%29%7BEnS%3D%5B0%2CDate.now%28%29%5D%7D%0A%20%20%20%20if%20%28%21e.ctrlKey%26%26%21e.shiftKey%26%26%28Date.now%28%29-Mdn%5B0%5D%3EtL%29%29%20%20%20%20%20%20%20%20%20%7B%0A%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%20EnS%5B1%5D%3DDate.now%28%29%3Bif%28trem%3C9%29EnS%5B0%5D%3D1%20%20%20%7D%0A%20%20%20%20if%20%28%20e.ctrlKey%26%26%21e.shiftKey%26%26%28Date.now%28%29-Mdn%5B0%5D%3EtL%29%29%0A%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%20%20%20%20%20%20%20custombuttons.editButton%28this%29%3B%0A%20%20%20%20if%20%28%21e.ctrlKey%26%26%20e.shiftKey%26%26%28Date.now%28%29-Mdn%5B0%5D%3EtL%29%29gShowPopup%28this%29%3B%0A%20%20%7D%20%20Mdn%5B3%5D%3D0%3B%20B%3DDate.now%28%29%3B%20pE%3D0%3B%7D%2C%20false%2C%20gBrowser%29%3B%0A%0AaddEventListener%28%22mousemove%22%2C%28e%29%3D%3E%7B%0A%20%20H%3Dcontent.innerWidth-h%2CV%3Dcontent.innerHeight-v%2Cmf%3De.ctrlKey%26%26%21e.shiftKey%26%26%21e.altKey%3B%0A%20%20if%20%28gBrowser.selectedBrowser.matches%28%22%3Ahover%22%29%29%7B%0A%20%20%20%20%20if%20%28mf%7C%7C%28%28%28EnS%5B0%5D%3D%3D1%29%26%26%28Date.now%28%29-EnS%5B1%5D%3C%3DtO%29%29%20%26%26%20%28Mdn%5B3%5D%3D%3D0%29%29%29%7B%0A%20%20%20%20%20%20%20%20%28EnS%3D%28%28Date.now%28%29-EnS%5B1%5D%3C%3DtO%29%26%26EnS%5B0%5D%29%3F%5B1%2CDate.now%28%29%5D%3A%5B0%2C0%5D%29%3B%0A%20%20%20%20%20%20%20%20content.scrollBy%28rv*sp%28e.movementX%2Cpw%29%2Crv*sp%28e.movementY%2Cpw%29%29%7D%0A%20%20%20%20%20else%20%7B%20setTimeout%28%28%29%3D%3E%7BX%3De.clientX%3BY%3De.clientY%7D%2CD%29%3B%20//Filter%0A%20%20%20%20%20%20if%20%28e.clientX%20%3EH%20%26%26%20X%3EH%20%26%26%20e.clientY%20%3Ev%20%26%26%20e.clientY%20%3C%20V%20%29%0A%20%20%20%20%20%20%20%20/*%20Vertical%20%20%20aisle%20*/%20content.scrollBy%280%2Crv*sp%28e.movementY%2Cpw%29%29%3B%0A%20%20%20%20%20%20if%20%28e.clientY%20%3EV%20%26%26%20Y%3EV%20%26%26%20e.clientX%20%3Eh%20%26%26%20e.clientX%20%3C%20H%29%0A%20%20%20%20%20%20%20%20/*%20Horizontal%20aisle%20*/%20content.scrollBy%28rv*sp%28e.movementY%2Cpw%29%2C0%29%3B%0A%20%20%20%20%20%20if%20%28e.clientX%3Ch%26%26X%3Ch%26%26e.clientY%3Cv%26%26Y%3Cv%29content.scrollBy%28-m*c*rv%2C0%29%3B%0A%20%20%20%20%20%20if%20%28e.clientX%3Ch%26%26X%3Ch%26%26e.clientY%3EV%26%26Y%3Ev%29content.scrollBy%28%20m*c*rv%2C0%29%3B%0A%20%20%20%20%20%20if%20%28e.clientX%3EH%26%26X%3EH%26%26e.clientY%3Cv%26%26Y%3Cv%29content.scrollBy%280%2C-m*c*rv%29%3B%0A%20%20%20%20%20%20if%20%28e.clientX%3EH%26%26X%3EH%26%26e.clientY%3EV%26%26Y%3EV%29content.scrollBy%280%2C%20m*c*rv%29%3B%0A%7D%7D%7D%2Cfalse%2CgBrowser%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 (23-09-2017 22:00:25)
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
difabor
По горизонтали в коридоре не прокручивает, только чуть-чуть дёргается, по вертикали нормально. В предыдущей версии всё нормально.
Исправил. Там была банальная описка - было e.movementY а должно было быть e.movementX
var rv=-1,tL=600,tO=3000,D=999,pw=1,pE=0,c=1,m=9999999,v=30,h=30; var B=0,mf,Mdn=[],EnS=[],V,H,X,Y; function cM(n,m){var x=(Date.now()-B>99)?(n+1)%m:n;B=Date.now();return(x)} function rM(n) {var x=(Date.now()-B>99) ? -n : n; B=Date.now();return(x)} function sp(base,pw) {return(base*Math.pow(Math.abs(base),pw))} addEventListener('keydown',e=>(!e.ctrlKey && e.altKey && e.shiftKey && (((e.keyCode==54)&&(rv=rM(rv)))||(e.keyCode==53)&&(pw=cM(pw,3)))),0,window); addEventListener("mousedown",(e)=>{if(Date.now()-B<99){B=Date.now();return} B=Date.now(); Mdn=[Date.now(),e.clientX,e.clientY,1]; if(Date.now()-EnS[1]>tO){pE=EnS[0]; EnS[0]=0}}, false, gBrowser); addEventListener("click",(e)=>{if(Date.now()-B<99) {B=Date.now();return} var udx=e.clientX-Mdn[1], udy=e.clientY-Mdn[2], trem=udx*udx+udy*udy; if (!e.button&&!e.altKey) { if (!e.ctrlKey&&!e.shiftKey&&(trem<9)&&(EnS[0]||pE)){EnS=[0,Date.now()]} if (!e.ctrlKey&&!e.shiftKey&&(Date.now()-Mdn[0]>tL)) { EnS[1]=Date.now();if(trem<9)EnS[0]=1 } if ( e.ctrlKey&&!e.shiftKey&&(Date.now()-Mdn[0]>tL)) custombuttons.editButton(this); if (!e.ctrlKey&& e.shiftKey&&(Date.now()-Mdn[0]>tL))gShowPopup(this); } Mdn[3]=0; B=Date.now(); pE=0;}, false, gBrowser); addEventListener("mousemove",(e)=>{ H=content.innerWidth-h,V=content.innerHeight-v,mf=e.ctrlKey&&!e.shiftKey&&!e.altKey; if (gBrowser.selectedBrowser.matches(":hover")){ if (mf||(((EnS[0]==1)&&(Date.now()-EnS[1]<=tO)) && (Mdn[3]==0))){ (EnS=((Date.now()-EnS[1]<=tO)&&EnS[0])?[1,Date.now()]:[0,0]); content.scrollBy(rv*sp(e.movementX,pw),rv*sp(e.movementY,pw))} else { setTimeout(()=>{X=e.clientX;Y=e.clientY},D); //Filter if (e.clientX >H && X>H && e.clientY >v && e.clientY < V ) /* Vertical aisle */ content.scrollBy(0,rv*sp(e.movementY,pw)); if (e.clientY >V && Y>V && e.clientX >h && e.clientX < H) /* Horizontal aisle */ content.scrollBy(rv*sp(e.movementX,pw),0); if (e.clientX<h&&X<h&&e.clientY<v&&Y<v)content.scrollBy(-m*c*rv,0); if (e.clientX<h&&X<h&&e.clientY>V&&Y>v)content.scrollBy( m*c*rv,0); if (e.clientX>H&&X>H&&e.clientY<v&&Y<v)content.scrollBy(0,-m*c*rv); if (e.clientX>H&&X>H&&e.clientY>V&&Y>V)content.scrollBy(0, m*c*rv); }}},false,gBrowser);
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%3EWheelLessScroll%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnJycGKioqCyYmJhEoKCgYKioqISkpJCceHhVUFRMkthsaIbQjIiZZKScqMykpKSkpKSkeKCgoEyYmJgwnJycHKSkpBS8vLgYsKy0DKCQpCx8eHTYbGjSQHBqB4R8Vr/8lPSH/LlwP3CQrH4QmJCYvKyolDS0tLAkpKSkKKSkpBiUlJQAjHycAGRwbNBUoA48VGTfmIhrP/yEd5f8bEcj/IkAZ/zeJAP81ewf/IDcc1BwWPHAhIRsYIyMfACcnJwAREhAeFzYLnyFhBOwodwD/GCJE/x0U2P8eGtP/GA/E/x49GP80fwD/M4IA/yVKG/8pI8H/JCWP0xcWKGsODQoLDBMIUShyBf8pfwD/JHQA/xggQv8eE97/HBfb/wwEof8OLA3/LnwC/zWFAP8kRhT/KSHE/zUz9f8sKZ77BwYFNxcvDE0lZwX/J3oA/yZ4AP8VIz7/CwCd/w4KV/8xMUb/Nioc/y83Bv8hYQT/IEYT/ysgxP82MOn/KSie9w8PHzodQAxMJmoD/yVwAP8ZSgD/EBcR/1lWYP+npaD/zM/W/31aP/+kUAD/bT8H/yQgCv8YEIj/Lynl/y0pqfobFTI8EiQATBYzA/8NKzj/ACV6/zI7VP/d19r/4t7o/8zO3P9vUzr/qVoA/8FpAf9pPAf/Ei0L/xoeTf8eFXb8GREzPgceUkwHOqT/Alf7/wBS+f80Q2f/1MnN/9fP2f/Ozdz/clQ8/6hYAP+1YwD/aDwI/yFeBf8ycAD/HzgK/hAQDkEENpZLAVTj/wBd//8ATev/NkNl/93U1P/b1dj/r7Gz/0k2KP+KQgD/umQA/24+Bf8cVAX/MnoE/y1iCP8cLA5DBDKMSwNO3P8AXP//AFH6/yM1W/+QjJP/Xl2D/zs5lP85N7D/KyRg/1QtGf9GIgD/G1QA/y93AP8lWgb/GSwNRQY5m04AUOH/AEbg/xE3kv8wJRf/HR1U/zxD3P9cXv//Xl///09R+P8qLpT/Kyo5/x86E/8QUwD/HVoB/xcyCUkHG0Y/MDVK95RjF//UhAD/7ZoA/8F7Av93RSj/QDF+/0s8lf+EeZz/ubjB//X29v/Z1dz/eoCA/x84Hf8JGQVFCwEABTQZAEGHWQKfzYcF7+CSB/+tjSj/YIxd/wyfmP8Yn53/g7Ov/+Dk5f/8+vr/0c3M8aeYlLFRPDleKRkVDA8FBAAZDAcAFxAJAB0SCiQ4Kh99BXKIzwDT3f8A////Ae7w/wu3vfE2ZW69X1FTczocCSdUNykAUz0xADcoHgAOBQQAHg8HACEWCAAZEgwALBkWAA4PJxINg49hDrzBrg2usog1bnI0REFGBEtBQwA5GQUAWj4xAFM+MwA1Jh0A/n8AAPgfAADgDwAAgAMAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAMADAAD4HwAA/n8AAA%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bvar%20rv%3D-1%2CtL%3D600%2CtO%3D3000%2CD%3D999%2Cpw%3D1%2CpE%3D0%2Cc%3D1%2Cm%3D9999999%2Cv%3D30%2Ch%3D30%3B%0Avar%20B%3D0%2Cmf%2CMdn%3D%5B%5D%2CEnS%3D%5B%5D%2CV%2CH%2CX%2CY%3B%0A%0Afunction%20cM%28n%2Cm%29%7Bvar%20x%3D%28Date.now%28%29-B%3E99%29%3F%28n+1%29%25m%3An%3BB%3DDate.now%28%29%3Breturn%28x%29%7D%0Afunction%20rM%28n%29%20%20%7Bvar%20x%3D%28Date.now%28%29-B%3E99%29%20%3F%20-n%20%3A%20n%3B%20B%3DDate.now%28%29%3Breturn%28x%29%7D%0Afunction%20sp%28base%2Cpw%29%20%7Breturn%28base*Math.pow%28Math.abs%28base%29%2Cpw%29%29%7D%0A%0AaddEventListener%28%27keydown%27%2Ce%3D%3E%28%21e.ctrlKey%20%26%26%20e.altKey%20%26%26%20e.shiftKey%20%26%26%0A%28%28%28e.keyCode%3D%3D54%29%26%26%28rv%3DrM%28rv%29%29%29%7C%7C%28e.keyCode%3D%3D53%29%26%26%28pw%3DcM%28pw%2C3%29%29%29%29%2C0%2Cwindow%29%3B%0A%0AaddEventListener%28%22mousedown%22%2C%28e%29%3D%3E%7Bif%28Date.now%28%29-B%3C99%29%7BB%3DDate.now%28%29%3Breturn%7D%0A%20%20B%3DDate.now%28%29%3B%20Mdn%3D%5BDate.now%28%29%2Ce.clientX%2Ce.clientY%2C1%5D%3B%0A%20%20if%28Date.now%28%29-EnS%5B1%5D%3EtO%29%7BpE%3DEnS%5B0%5D%3B%20EnS%5B0%5D%3D0%7D%7D%2C%20false%2C%20gBrowser%29%3B%0A%0AaddEventListener%28%22click%22%2C%28e%29%3D%3E%7Bif%28Date.now%28%29-B%3C99%29%20%7BB%3DDate.now%28%29%3Breturn%7D%0A%20%20var%20udx%3De.clientX-Mdn%5B1%5D%2C%20udy%3De.clientY-Mdn%5B2%5D%2C%20trem%3Dudx*udx+udy*udy%3B%0A%20%20if%20%28%21e.button%26%26%21e.altKey%29%20%7B%0A%20%20%20%20if%20%28%21e.ctrlKey%26%26%21e.shiftKey%26%26%28trem%3C9%29%26%26%28EnS%5B0%5D%7C%7CpE%29%29%7BEnS%3D%5B0%2CDate.now%28%29%5D%7D%0A%20%20%20%20if%20%28%21e.ctrlKey%26%26%21e.shiftKey%26%26%28Date.now%28%29-Mdn%5B0%5D%3EtL%29%29%20%20%20%20%20%20%20%20%20%7B%0A%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%20EnS%5B1%5D%3DDate.now%28%29%3Bif%28trem%3C9%29EnS%5B0%5D%3D1%20%20%20%7D%0A%20%20%20%20if%20%28%20e.ctrlKey%26%26%21e.shiftKey%26%26%28Date.now%28%29-Mdn%5B0%5D%3EtL%29%29%0A%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%20%20%20%20%20%20%20custombuttons.editButton%28this%29%3B%0A%20%20%20%20if%20%28%21e.ctrlKey%26%26%20e.shiftKey%26%26%28Date.now%28%29-Mdn%5B0%5D%3EtL%29%29gShowPopup%28this%29%3B%0A%20%20%7D%20%20Mdn%5B3%5D%3D0%3B%20B%3DDate.now%28%29%3B%20pE%3D0%3B%7D%2C%20false%2C%20gBrowser%29%3B%0A%0AaddEventListener%28%22mousemove%22%2C%28e%29%3D%3E%7B%0A%20%20H%3Dcontent.innerWidth-h%2CV%3Dcontent.innerHeight-v%2Cmf%3De.ctrlKey%26%26%21e.shiftKey%26%26%21e.altKey%3B%0A%20%20if%20%28gBrowser.selectedBrowser.matches%28%22%3Ahover%22%29%29%7B%0A%20%20%20%20%20if%20%28mf%7C%7C%28%28%28EnS%5B0%5D%3D%3D1%29%26%26%28Date.now%28%29-EnS%5B1%5D%3C%3DtO%29%29%20%26%26%20%28Mdn%5B3%5D%3D%3D0%29%29%29%7B%0A%20%20%20%20%20%20%20%20%28EnS%3D%28%28Date.now%28%29-EnS%5B1%5D%3C%3DtO%29%26%26EnS%5B0%5D%29%3F%5B1%2CDate.now%28%29%5D%3A%5B0%2C0%5D%29%3B%0A%20%20%20%20%20%20%20%20content.scrollBy%28rv*sp%28e.movementX%2Cpw%29%2Crv*sp%28e.movementY%2Cpw%29%29%7D%0A%20%20%20%20%20else%20%7B%20setTimeout%28%28%29%3D%3E%7BX%3De.clientX%3BY%3De.clientY%7D%2CD%29%3B%20//Filter%0A%20%20%20%20%20%20if%20%28e.clientX%20%3EH%20%26%26%20X%3EH%20%26%26%20e.clientY%20%3Ev%20%26%26%20e.clientY%20%3C%20V%20%29%0A%20%20%20%20%20%20%20%20/*%20Vertical%20%20%20aisle%20*/%20content.scrollBy%280%2Crv*sp%28e.movementY%2Cpw%29%29%3B%0A%20%20%20%20%20%20if%20%28e.clientY%20%3EV%20%26%26%20Y%3EV%20%26%26%20e.clientX%20%3Eh%20%26%26%20e.clientX%20%3C%20H%29%0A%20%20%20%20%20%20%20%20/*%20Horizontal%20aisle%20*/%20content.scrollBy%28rv*sp%28e.movementX%2Cpw%29%2C0%29%3B%0A%20%20%20%20%20%20if%20%28e.clientX%3Ch%26%26X%3Ch%26%26e.clientY%3Cv%26%26Y%3Cv%29content.scrollBy%28-m*c*rv%2C0%29%3B%0A%20%20%20%20%20%20if%20%28e.clientX%3Ch%26%26X%3Ch%26%26e.clientY%3EV%26%26Y%3Ev%29content.scrollBy%28%20m*c*rv%2C0%29%3B%0A%20%20%20%20%20%20if%20%28e.clientX%3EH%26%26X%3EH%26%26e.clientY%3Cv%26%26Y%3Cv%29content.scrollBy%280%2C-m*c*rv%29%3B%0A%20%20%20%20%20%20if%20%28e.clientX%3EH%26%26X%3EH%26%26e.clientY%3EV%26%26Y%3EV%29content.scrollBy%280%2C%20m*c*rv%29%3B%0A%7D%7D%7D%2Cfalse%2CgBrowser%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 (23-09-2017 23:54:20)
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
difabor
Теперь нормально. Да, кнопочка знатная получилась, кручу - верчу, куда хочу. Спасибо Вам за труды.
Вот зум 300% или 30% - тогда да - можно ощутить.
Думаю не стоит, кто в таких пределах будет работать.
Отредактировано villa7 (23-09-2017 23:57:36)
Лучше спросить у знающих - чем лезть не зная.
Отсутствует
difabor
Теперь нормально. Да, кнопочка знатная получилась, кручу - верчу, куда хочу. Спасибо Вам за труды.Вот зум 300% или 30% - тогда да - можно ощутить.
Думаю не стоит, кто в таких пределах будет работать.
Я отлаживал горизонтальный скроллинг при зуме 300%
И то - не у всех сайтов появлялся горизонтальный скроллбар
А в предпоследней версии (с опиской) - поленился - и вот результат
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
Ребят, никто не сталкивался с проблемой: не могу скопировать код кнопки СВ
методом КОПИРОВАТЬ КОД В БУФЕР
Был такой глюк. Тебе нужно обновить Custom Buttons, может на 20-09-2017 10:21:58
Отсутствует
Наконец-то выложили бету 57.0b3 и она нехорошая.
Даже подписанный Custom Buttons не устанавливается ни при каких настройках.
Нужен новый код для конфигурационного файла.
Неподписанный CB 0.0.5.8.9.5pre2 (custom_buttons-0.0.5.8.9-fixed6pre2.xpi)
установился и работает.
Внимание! Будте осторожны. Не устанавливайте Legacy расширения,
которые не прошли специальную адаптацию под Firefox 57.
// try {(code => { var {classes: Cc, interfaces: Ci, utils: Cu} = Components; var jsval, evl = true, re = e => Cu.reportError(e), imp = name => {try { return Cu.import(`resource://gre/modules/addons/${name}.jsm`, {}); } catch(ex) {}} if ((jsval = imp("AddonSettings"))) { jsval.AddonSettings = {ADDON_SIGNING: false, REQUIRE_SIGNING: false, ALLOW_LEGACY_EXTENSIONS: true}; try {evl = jsval.eval("this") === jsval;} catch(ex) {evl = false;} } lockPref("extensions.allow-non-mpc-extensions", true); var jsvals = ["XPIProvider", "XPIInstall"].map(imp).filter(i => i); if (evl) return jsvals.forEach(jsval => {try {jsval.eval(code);} catch(ex) {re(ex);}}); var sl = Cc["@mozilla.org/moz/jssubscript-loader;1"].getService(Ci.mozIJSSubScriptLoader); Cu.importGlobalProperties(["URL", "Blob"]); var url = URL.createObjectURL(new Blob([(code)])); jsvals.forEach(jsval => {try {sl.loadSubScript(url, jsval);} catch(ex) {re(ex);}}); })(String.raw` try {SIGNED_TYPES.clear();} catch(ex) {}; "verifyZipSignedState" in this && (signedState => { var re = /\x06\x03U\x04\x03\x14[\s\S](\{[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\}|[a-z0-9-\._]*\@[a-z0-9-\._]+)0\x82\x02"0\r\x06\t/i; var getUUID = () => { var gen = Cc["@mozilla.org/uuid-generator;1"].getService(Ci.nsIUUIDGenerator); return (getUUID = () => gen.generateUUID().toString())(); } var getURI = file => { var jsval = Cu.import("resource://gre/modules/addons/XPIProvider.jsm", {}); return (getURI = file => jsval.getURIForResourceInFile(file, "META-INF/mozilla.rsa"))(file); } var getId = file => { var result, is = {close() {}}, sis = {close() {}}; try { is = Services.io.newChannelFromURIWithLoadInfo(getURI(file), null).open(); sis = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream); sis.init(is); var str = sis.readBytes(sis.available()); var match = str.match(re); if (match) result = match[1]; } catch(ex) {} sis.close(); is.close(); return result || getUUID(); } verifyZipSignedState = function verifyZipSignedState(aFile, aAddon) { if (aAddon.id || aAddon._installLocation.name == KEY_APP_TEMPORARY) return Promise.resolve({signedState, cert: null}); var root = !AppConstants.MOZ_REQUIRE_SIGNING && Services.prefs.getBoolPref(PREF_XPI_SIGNATURES_DEV_ROOT, false) ? Ci.nsIX509CertDB.AddonsStageRoot : Ci.nsIX509CertDB.AddonsPublicRoot; return new Promise(resolve => { var callback = {openSignedAppFileFinished(rv, zipReader, cert) { zipReader && zipReader.close(); resolve({signedState, cert: cert || {commonName: getId(aFile)}}); }}; gCertDB.openSignedAppFileAsync(root, aFile, callback.wrappedJSObject = callback); }); } })(AddonManager.SIGNEDSTATE_NOT_REQUIRED); `)} catch(err) {Components.utils.reportError(err);}
Отредактировано Dumby (26-09-2017 00:26:52)
Отсутствует
Ultima2m пишетdifabor пишет: Получил фильтрацию. Думаю, что получилось даже лучше, чем ожидалВсе отлично. Спасибо за кнопку.
итоговый код можно?
Он приведён в №12206
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
Как делается скроллинг отдельно в текстовом поле (TEXTAREA) и вообще в подполях контента, а не во всём контенте?
Может, вместо content.scrollBy можно поставить что-то другое?
Dumby, bunda1, Infocatcher, вы корифеи - может подскажете что-то?
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
Обнаружил интереснейшее поведение кнопки Блокнот в вкладке в режиме е10s.
При включении е10s иконка кнопки мутная - типа проблемы с компиляцией.
Открываю "редактировать", ничего не меняю и жму "ОК". Кнопка начинает прекрасно работать...
Делаю рестарт - та же картина: кнопка мутная, но после "ОК" - становится нормальной и начинает работать.
Это только у меня такой феномен или ещё у кого-то?
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
Обнаружил интереснейшее поведение кнопки Блокнот в вкладке в режиме е10s.
При включении е10s иконка кнопки мутная - типа проблемы с компиляцией.
Вроде исправил: Блокнот в вкладке
Добавлено 27-09-2017 19:20:15
Как делается скроллинг отдельно в текстовом поле (TEXTAREA) и вообще в подполях контента, а не во всём контенте?
Может, вместо content.scrollBy можно поставить что-то другое?
Dumby, bunda1, Infocatcher, вы корифеи - может подскажете что-то?
Может надо получить текстовое поле (TEXTAREA) через click или mousedown или mousemove и запустить TEXTAREA.scrollBy
Отредактировано bunda1 (27-09-2017 19:20:15)
Отсутствует
difabor пишетОбнаружил интереснейшее поведение кнопки Блокнот в вкладке в режиме е10s.
При включении е10s иконка кнопки мутная - типа проблемы с компиляцией.Вроде исправил: Блокнот в вкладке
Спасибо, но у Вас есть объяснение описанному мной феномену?
Я обнаружил ещё один парадокс: если делать рестарт в e10s, когда находишься на вкладке about:addons, то старый Блокнот в вкладке тоже в порядке (кнопка не мутная и он работает).
ИМХО, понять причину этого феномена важнее, чем исправить кнопку. Она может вообще крыться в аддоне Custom Buttons.
У меня есть ещё одна кнопка, на которой я тренируюсь - она не несёт какого-либо осмысленного кода, но тоже так себя ведёт!
Что заставляет её так себя вести?
Уважаемый bunda1, Вам удалось воспроизвести описанный мной феномен?
Добавлено 27-09-2017 19:20:15
difabor пишетКак делается скроллинг отдельно в текстовом поле (TEXTAREA) и вообще в подполях контента, а не во всём контенте?
Может, вместо content.scrollBy можно поставить что-то другое?
Dumby, bunda1, Infocatcher, вы корифеи - может подскажете что-то?Может надо получить текстовое поле (TEXTAREA) через click или mousedown или mousemove и запустить TEXTAREA.scrollBy
Дело в том, что я именно начинал с TEXTAREA.scrollBy - меня просто интересовало - будет кнопка как-то реагировать? - Никак не реагировала! Ни в TEXTAREA, ни вне!
Такое впечатление, что код вообще не воспринимает команду TEXTAREA.scrollBy
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
Дело в том, что я именно начинал с TEXTAREA.scrollBy - меня просто интересовало - будет кнопка как-то реагировать? - Никак не реагировала! Ни в TEXTAREA, ни вне!
Такое впечатление, что код вообще не воспринимает команду TEXTAREA.scrollBy
А как ты получил TEXTAREA?
Добавлено 27-09-2017 21:10:04
bunda1 пишетdifabor пишетОбнаружил интереснейшее поведение кнопки Блокнот в вкладке в режиме е10s.
При включении е10s иконка кнопки мутная - типа проблемы с компиляцией.Вроде исправил: Блокнот в вкладке
Спасибо, но у Вас есть объяснение описанному мной феномену?
Не знаю почему, но старая кнопка при старте не выдела content.window.location и content.location. Заменил на gBrowser.currentURI.spec
Добавлено 27-09-2017 21:16:12
Кстати, вот так работает content.document.getElementsByTagName("textarea")[0].scrollBy(34, 3500); в Блокноте в вкладке.
Добавлено 27-09-2017 21:17:41
Уважаемый bunda1, Вам удалось воспроизвести описанный мной феномен?
Да.
Отредактировано bunda1 (27-09-2017 21:17:41)
Отсутствует
difabor пишетДело в том, что я именно начинал с TEXTAREA.scrollBy - меня просто интересовало - будет кнопка как-то реагировать? - Никак не реагировала! Ни в TEXTAREA, ни вне!
Такое впечатление, что код вообще не воспринимает команду TEXTAREA.scrollByА как ты получил TEXTAREA?
Я даже вопроса Вашего не понял
e.target.nodeName: TEXTAREA, ну, я и написал: TEXTAREA.scrollBy
Я же в этом профан . Наверное вообще глупость написал. Но Вы не сердитесь
Сейчас буду "играться" с content.document.getElementsByTagName("textarea")[0].scrollBy(34, 3500);
Я же всё через "тыки" делаю - базовых знаний - ноль целых, ноль десятых, а желание есть...
В моём возрасте учиться уже трудно...
Отредактировано difabor (27-09-2017 21:27:17)
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
Уважаемый bunda1,
мне удалось скроллить в textarea без колёсика!!!
Но я обнаружил следующее:
На этом сайте и ещё на многих других это обеспечивается content.document.getElementsByTagName("textarea")[0].scrollBy
но есть сайты, где требуется content.document.getElementsByTagName("textarea")[1].scrollBy
Как узнать, где нужно 0, а где 1?
Кроме того, на этом сайте, на этой странице есть поле PRE - там ни 0, ни 1, ни 2, ни 3 не помогают.... А это поле - код под спойлером...
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
difabor пишет: Как узнать, где нужно 0, а где 1?
getElementsByTagName выдаёт массив элементов с указанным тэгом
цифра это номер элемента в том массиве.
я помню те времена когда обновления программ убирали проблемы и исправляли баги, а не добавляли их.
toxID:05AB9B827D896AACEE7FF4573A02FB8F025F46ADC856B98F65BC1BA9BD21A81DC98BA9C36CE3
Отсутствует
difabor пишет: Как узнать, где нужно 0, а где 1?
getElementsByTagName выдаёт массив элементов с указанным тэгом
цифра это номер элемента в том массиве.
Я понимаю, но вот как узнать этот номер?
Та же textarea как тэг может быть у нескольких элементов. Как узнать (напр. из e.target или e.originalTarget или ещё как-то) какой по счёту этот конкретный элемент (по "click", например, это элемент, 0-й, 1-й или ещё какой-то)?
Или элемент 'PRE' - там где приведён код?
Допустим, по "click" я могу узнать что-то о том элементе. Что мне надо "выудить" по "click", чтобы проскроллить, например, "pre"? Я-то вообще узнал, что эта штука называется "pre" по e.target.nodeName по аналогии с e.target.nodeName в текстовом поле - там e.target.nodeName называется textarea (всё - заглавными буквами)...
Отредактировано difabor (28-09-2017 08:43:09)
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
Уважаемый 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. Не знаю какой вариант лучше.
Добавлено 28-09-2017 09:10:43
e.target.nodeName называется textarea (всё - заглавными буквами)...
Используй .localName и будет без заглавных букв.
Добавлено 28-09-2017 09:31:35
Кстати, оказывается textarea можно легко получить из content.document.activeElement . Типа:
var el = content.document.activeElement.localName; if ( el.localName = 'textarea' ) el.scrollBy();
Но с pre это не работает.
Отредактировано bunda1 (28-09-2017 09:31:35)
Отсутствует