Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый Сегодня, 16:56
Интересующийся
Отправить личное сообщение для varjaginm Посмотреть профиль Найти все сообщения от varjaginm
 
Регистрация: 12.10.2018
Сообщений: 23

как отловить выход строки за экран
Привет всем и с Новым 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>
Ответить с цитированием
  #2 (permalink)  
Старый Сегодня, 18:41
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,612

Как-то так, если правильно понял:
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 использовать.
__________________
29375, 35
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как найти индекст строки по кусочку этой строки? dilolo Элементы интерфейса 2 09.08.2020 00:30
Из полноэкранного режима произведён выход, так как в фокусе был windowed-плагин waropank Firefox/Mozilla 0 13.10.2016 00:33
Как из строки достать все числа? miusov jQuery 9 29.08.2016 10:53
Как отловить узкий экран либо экран ставший узким после поворота девайса? borus Мобильный JavaScript 4 09.06.2016 06:54
Как кроссбраузерно расположить фоновую картинку на весь экран? ligisayan Internet Explorer 1 10.01.2016 14:58