Как расширить область выбора пользователя

#javascript #html

Вопрос:

В настоящее время я разрабатываю веб-приложение, состоящее из различных панелей и областей. Одна панель содержит огромную таблицу, другая панель содержит поле описания и т. Д.

Обычно пользователи могут перетащить мышь и выбрать любой диапазон текста внутри html-страницы. Я хочу, чтобы пользователь мог выбирать текст только внутри одной панели или до барьера.

Например, когда таблица находится в фокусе, выделение текста с помощью мыши или нажатие клавиши Ctrl-A должно выделять только текст внутри нее. Не каждый выбираемый текст на странице.

 <div id="application">
   <p>Not this text</p>
   <div id="another-panel">Nor that</div>
   <div id="special-panel-including-big-table">
       Hitting Ctrl-A here should only select THIS text
   </div>
</div>
 

Мне нужно каким-то образом определить барьер на родительском элементе (например, на панели таблицы), который не позволяет расширить выделение дальше по дереву DOM.


Я консультировался https://developer.mozilla.org/en-US/docs/Web/API/Selection и https://w3c.github.io/selection-api/

Я пытался использовать stopPropagation() для событий перетаскивания, но это, похоже, не возымело никакого эффекта.

Ответ №1:

Вы можете запретить выбор по умолчанию e.preventDefault() и вместо этого создать свой собственный выбор.

Если ваша таблица содержит входные элементы, которые могут привлечь внимание, вы можете создать дополнительную проверку для этого. Это не входит в мой пример.

 document.addEventListener('keydown', (e) => {
  if(e.ctrlKey amp;amp; e.key === 'a') {
    //Prevent the default select all
    e.preventDefault();

    //Select only the contents of div#special-panel-including-big-table
    var targetEl = document.getElementById('special-panel-including-big-table');
    var range;
    if (window.getSelection amp;amp; document.createRange) {
        var selection = window.getSelection();
        range = document.createRange();
        range.selectNodeContents(targetEl);
        selection.removeAllRanges();
        selection.addRange(range);
    } 
  }
}); 
 <div id="application">
   <p>Not this text</p>
   <div id="another-panel">Nor that</div>
   <div id="special-panel-including-big-table">
       Hitting Ctrl-A here should only select THIS text
   </div>
</div>