как отловить выход строки за экран
Привет всем и с Новым 2026 годом!
Строю на основе таблицы некое подобие меню. Данные различной длины, поэтому таблица - самое то! Да еще чередование цветом и выделение активной строки. Есть маленький скрипт, придающий табличке схожесть с меню по нажатию клавиш. Есть такая проблема: выполнив переход на следующую строку, могу оказаться за краем окна. Мышом прокрутил - все нормально. Как определить, что строка уходит "за горизонт" <!DOCTYPE html> <html> <head> <meta http-equiv=Content-Type content="text/html; charset=windows-1251"> <!--script type=text/javascript src=scaner.js> </script--> <style> .odd {background:#ffffcc;} .ord {background:#c1ff80;} .sel {background:#b300b3;} .des {color:gray;} table {overflow: hidden; } </style> </head> <body onkeypress="KBpress();" onkeydown="KBdown();" onclick="Click();" > <div id=Service style="display:none;position:absolute;top:-200px;right:2000px;"> <p id="KEYBOARD" /> </div> <table id=tbl > <tbody> <tr id=1> <td width=80% >Базовая ставка </td> <td>нет </td> </tr> <tr class=des> <td>Кроме: </td> <td> </td> </tr> <!-- input type=text maxlength=50 style="width:30em;border:none;" value="--> <tr id=2 class="odd" orig="odd" > <td > Бесшовные трубы из коррозионностойкой (нержавеющей) стали диаметром до 426 мм включительно , происходящих из Украины для прочих предприятий </td> <td>18.96 % </td> </tr> <tr id="3" class="ord" orig="ord" > <td > Бесшовные трубы из коррозионностойкой (нержавеющей) стали диаметром до 426 мм включительно , происходящих из Украины для предприятия: частное акционерное общество "Сентравис Продакшн Юкрейн" (53201, Украина, Днепропетровская область, г. Никополь, проспект Трубников, 56) </td> <td> 4.32 % </td> </tr> <tr id=4 class="odd" orig="odd"> <td > Бесшовные трубы из коррозионностойкой (нержавеющей) стали диаметром до 426 мм включительно , происходящих из Украины для предприятия: общество с ограниченной ответственностью "Интерпайп Нико Тьюб" (53201, Украина, Днепропетровская область, г. Никополь, проспект Трубников, 56) </td> <td>4.32 % </td> </tr> <tr id=5 class="ord" orig="ord"> <td > Бесшовные трубы из коррозионностойкой (нержавеющей) стали диаметром до 426 мм включительно , происходящих из Украины для предприятия: общество с ограниченной ответственностью "Производственное объединение "ОСКАР" (49044, Украина, г. Днепропетровск, бульвар Екатеринославский, д. 2, офис 500) </td> <td>18.96 % </td> </tr> <tr class="odd" orig="odd" id=6 > <td >нефтепроводные, газопроводные и горячедеформированные трубы общего назначения: все диаметром до 820 миллиметров включительно, страной происхождения которых является Украина, при наличии сертификата производителя </td> <td> </td> </tr> <tr class="ord" orig="ord" id=7> <td>нефтепроводные, газопроводные и горячедеформированные трубы общего назначения: все диаметром до 820 миллиметров включительно, страной происхождения которых является Украина </td> <td> </td> </tr> <tr class="odd" orig="odd" id=8 > <td>нефтепроводные, газопроводные и горячедеформированные трубы общего назначения: все диаметром до 820 миллиметров включительно для ОАО "Днепропетровский трубный завод" (49068, Украина, г. Днепропетровск, ул. Маяковского, д. 31) </td> <td> </td> </tr> <tr class="ord" orig="ord" id=9 > <td id=9>нефтепроводные, газопроводные и горячедеформированные трубы общего назначения: все диаметром до 820 миллиметров включительно для ОАО "ИНТЕРПАЙП Нико Тьюб" (53201, Украина, Днепропетровская область, г. Никополь, пр. Трубников, д. 56) </td> <td> </td> </tr> <tr class="odd" orig="odd" id=10> <td>нефтепроводные, газопроводные и горячедеформированные трубы общего назначения: все диаметром до 820 миллиметров включительно для публичного акционерного общества "ИНТЕРПАЙП Нижнеднепровский трубопрокатный завод" (ПАО "ИНТЕРПАЙП НТЗ"), (49081, Украина, г. Днепропетровс ул. Столетова, д. 21) </td> <td> </td> </tr> <tr class="ord" orig="ord" id=11> <td>нефтепроводные, газопроводные и горячедеформированные трубы общего назначения: все диаметром до 820 миллиметров включительно для публичного акционерного общества "ИНТЕРПАЙП Новомосковский трубопрокатный завод" (ПАО "ИНТЕРПАЙП НМТЗ"), (51200, Украина, Днепропетровская область, г. Новомосковск, ул. Сучкова, д. 115) </td> <td> </td> </tr> <tr class="odd" orig="odd" id=12> <td>Бесшовные трубы круглого поперечного сечения из коррозионностойкой стали наружным диаметром до 650 мм включительно, изготовленные методом горячей деформации, происходящие из КНР </td> <td> </td> </tr> <tbody> </table> <script > var CurrId=2; var MaxId=12; var direct; SetFocus(CurrId); // var oNew= document.getElementById(cId); // status = oNew.innerHTML; // function KillFocus( ){ var oNew= document.getElementById(CurrId); if( oNew) {oNew.className = oNew.orig;}; }; // function document.onmousemove(){ // var tag=document.elementFromPoint( event.clientX,event.clientY); // status=tag.innerHTML; // if (tag.tagName=="TR") // { alert(tag.tagName); tag.style.color='red'; } // }; // function document.onkeydown(){ function KBdown(){ var event=window.event; var key= event.keyCode; var cNext=CurrId; switch ( key ){ case 38 : //up if ( cNext >1 ){ direct =true; SetFocus(--cNext); }; dropkey(event); break; case 40 : //down if ( cNext < MaxId ){ direct =false; SetFocus(++cNext); }; dropkey(event); break; }; }; function KBpress(){ /* only Chars key*/ var event=window.event; var key= event.keyCode; status=key; }; function Click(){ var e = e ? e : window.event; var tag =document.elementFromPoint( e.clientX,e.clientY).parentElement; status=tag.id; if(tag.id) { SetFocus(tag.id); }; }; function dropkey(event){ try { event.keyCode =0; event.charCode =0; event.which =0; event.key =''; window.event.returnValue = false; /*alert('Dropkey');*/ } catch( err) {}; return false; } function SetFocus( cId ){ KillFocus( ); var oNew= document.getElementById(cId); var Parent = oNew.parentElement; var CurrTop = oNew.offsetTop; var CurrH = oNew.clientHeight; var offHeight = oNew.offsetHeight ; //var offHeight = oNew.offsetTop ; // alert( CurrTop +' '+CurrH+' '+' '+offHeight); // oNew.scrollIntoView(direct); // status = oNew.innerHTML; oNew.className = oNew.className +' sel'; CurrId = cId; }; </script> </body> |
Как-то так, если правильно понял:
function isPartiallyOutOfViewport(el) {
const r = el.getBoundingClientRect();
return (
r.top < 0 ||
r.left < 0 ||
r.bottom > window.innerHeight ||
r.right > window.innerWidth
);
}
if (isPartiallyOutOfViewport(oNew)) {
oNew.scrollIntoView();
}
Если нужна не проверка по действую, а постоянное отслеживание, то можно IntersectionObserver использовать. |
Удовлетворен частично!
r.top < 0 работает
Но уже r.bottom=undefined! window.innerHeight=undefined! Можно и window.clientHeight. но он такой же! Пока версия SetFocus такая: function SetFocus( cId ){ KillFocus( ); var oNew= document.getElementById(cId); var CurrTop = oNew.offsetTop; var CurrH = oNew.clientHeight; oNew.className = oNew.className +' sel'; var r = oNew.getBoundingClientRect(); // YES! alert(r.top+' '+r.height+' '+ r.bottom+' '+window.innerHeight ); if ( r.top<0 ) { oNew.scrollIntoView() } // NO! if ( CurrH +r.bottom > window.innerHeight) { oNew.scrollIntoView(true) } CurrId = cId; }; |
Где ты отыскал ie < 9?)
Впрочем, в нём можно использовать: document.documentElement.offsetHeight // вместо window.innerHeight document.documentElement.offsetWidth // вместо window.innerWidth (r.left + r.width) // вместо r.right *проверил, в ie должен работать r.bottom/r.right, а вот r.height/r.width может и не быть. Однако если окружение чуть слегка живое, то попробуй сначала прописать в <head>: <meta http-equiv="X-UA-Compatible" content="IE=edge">Возможно у тебя доступен более свежий движок, просто не включён. |
Да, старенькое
Юзаем то что пока есть на всех пользовательских компах и в Вин11
Что в замен - пока не ясно, но завязано на это уже очень многое! #define HTML_PROGID "Shell.Explorer.2" В принципе неудобств не очень много, хотя много вкусностей HTML5 CSS3 не видать! Буду пробовать завтра, счас уже сгорел - болею (( |
В win 11 у всех уже есть msedge, он же хром. Та всё современное.
Но если нужен ie то при указании meta - там будет движок от ie11, а не ie6, что всяко лучше. |
Получилось так
Последняя версия, которая на моем движке работает прекрасно
function SetFocus( cId ){ KillFocus( ); var oNew= document.getElementById(cId); var CurrH = oNew.clientHeight; oNew.className = oNew.className +' sel'; var r = oNew.getBoundingClientRect(); if ( r.top<0 ) { oNew.scrollIntoView(); } if ( CurrH +r.top > document.documentElement.offsetHeight) { oNew.scrollIntoView(false); } CurrId = cId; }; Что касается Меты, то видимо, действительно грузится другой движок, который удаляется только снятием приложения! Видимо, придется учить, что нового в нем. Пока страшно применять, так как на данный двиг уже многое заточено! Всем Огромное СПАСИБО! Я получил, что хотел! |
В win 11 у всех уже есть msedge, он же хром. Та всё современное.
В догонку
"В win 11 у всех уже есть msedge, он же хром. Та всё современное." Нигде не нашел, чтобы его можно было вызывать как ActiveX Alaska ( на которой мы работаем) продемонстрировала первичное подключение к нему, но за покупку новых версий заломила для России немыслимый ценник, который наша контора не потянет никогда! Канада, мать её (( Есть ли ссылочки, как работать с msedge через ActiveX ? |
Цитата:
|
Спасибо! "Будем искать"
Спасибо!
|
| Часовой пояс GMT +3, время: 14:05. |