@andrei2019

Как сделать прокрутку к выделенному слову (без JQuery)?

Есть локальные html файлы, куда я могу внедрять скрипт подсветки нужных слов. Следующий код работает (спасибо StalkerRED вопрос закрыт):

<?php
  session_start();
  $phrase = $_SESSION['phrase']; // Подсвечиваемая фраза

// --- begin script ---
$script = "
<script>

  function scrollReset() {
    currentElem = 0;
    positions = [];
    document.removeEventListener('keydown', searchNavigationHandler);
  }

  function myScroll(evt, direction){
    evt.preventDefault();
    if (direction === 'prev' && currentElem > 0) currentElem--;
    if (direction === 'next' && currentElem < positions.length) currentElem++;
    window.scroll({ top: positions[currentElem], behavior: 'instant' });
  }

  function searchNavigationHandler(evt) {
    key = evt.which ? evt.which : evt.keyCode;
    switch (key) {
      case 38:  myScroll(evt, 'prev');     break;
      case 40:  myScroll(evt, 'next');     break;
      case 27:  scrollReset();  break;
    }
  }

  function HighLight(phrase) {
    scrollReset();
    re = new RegExp(phrase, 'gi');
    document.body.innerHTML = document.body.innerHTML.replace(re, '<span class=highlight>'+phrase+'</span>');
    eL = document.body.innerHTML;
    positions = [...document.body.querySelectorAll('.highlight')].map(eL=>eL.offsetTop);
    document.addEventListener('keydown', searchNavigationHandler);
    window.scroll({top: positions[0], behavior: 'instant' });
  }

   window.onload = HighLight($phrase);
</script>
"; //--- end script ---

  $html            = file_get_contents($path_html_title);
  $script_html     = str_replace('</body>', $script. '</body>', $html);
  $script_html     = str_replace('</head>', '<style type="text/css">.highlight{background:orange;}</style></head>', $script_html);
  echo $script_html;
?>
  • Вопрос задан
  • 111 просмотров
Решения вопроса 1
Stalker_RED
@Stalker_RED
Обработчики кнопок делаются так:
window.addEventListener('keypress', searchNavigationHandler)


function searchNavigationHandler(evt) {
  let key = evt.which ? evt.which : evt.keyCode;

  switch (key) {
    case 38:
      prev();
      break;
    case 40:
      next();
      break;
    case 27:
    	window.removeEventListener('keypress', searchNavigationHandler)
      break;
  }
}

jsfiddle.net/0yz37qkr

Плавный скролл так:
window.scroll({
  top: 1000, // координата якоря по высоте
  behavior: "smooth"
});


Нужная вам координата при помощи jQuery добывается легко: $(якорь).position().top
Как это сделать БЕЗ jQuery, и чтобы оно не глючило - я не знаю, но уверен вы найдете решение.

P.S.:
eval('/'+phrase+'/gi')
Поздравляем, у вас XSS и ваших посетителей уже ломают, а антивирусы и браузеры помечают ваш сайт как вредоносный. В общем с eval'ом поосторожнее, нужно тщательно фильтровать фразу.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы