Невозможно отменить выделение выделения в 2 разных абзацах с помощью библиотеки Rangy

JSfiddle для справки: https://jsfiddle.net/9jp346r4/20/

Я пытаюсь создать функциональность, которая позволяет пользователю выделять выделенный текст при нажатии кнопки и отменять выделение выделенного текста при щелчке правой кнопкой мыши.

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

Когда я выделяю текст в двух разных параграфах, он выделяется успешно.

Проблема возникает, когда я хотел бы вернуться позже и не выделить оба абзаца.

Ожидаемое поведение: я щелкаю правой кнопкой мыши по любому выделенному тексту независимо от того, выделен он или нет, и он не выделяет весь рядом выделенный текст, даже если он разделен тегом абзаца или сильным тегом.

Текущее поведение таково: оно только выделяет текст в абзаце, который я щелкнул.

Для повторного создания: 1) Выберите текст, который перекрывает первый и второй абзацы, и нажмите кнопку "Нажмите".

2) Отмените выделение выделенного текста, щелкнув где-нибудь еще на экране.

3) Щелкните правой кнопкой мыши любой выделенный текст. Обратите внимание, что только один из абзацев не выделяется.

Если что-то неясно, не стесняйтесь задавать вопросы. Буду признателен за помощь.

Вот мой HTML:

<div id="content">
<p>
Paragraph 1
</p>
<p>
Paragraph 2
</p>
</div>
<div id="divId">
   <input id="myBtn" type="button" value="Press" onclick = "javascript:toggleItalicYellowBg()"/>
</div>

Вот мой JavaScript:

function coverAll() {
  var ranges = [];
  for(var i=0; i<window.getSelection().rangeCount; i++) {
    var range = window.getSelection().getRangeAt(i);
    while(range.startContainer.nodeType == 3
          || range.startContainer.childNodes.length == 1)
      range.setStartBefore(range.startContainer);
    while(range.endContainer.nodeType == 3
          || range.endContainer.childNodes.length == 1)
      range.setEndAfter(range.endContainer);
    ranges.push(range);
  }
  window.getSelection().removeAllRanges();
  for(var i=0; i<ranges.length; i++) {
    window.getSelection().addRange(ranges[i]);
  }
  return true;
}

function getSelectedText() {
  if (window.getSelection) {
    return window.getSelection().toString();
  } else if (document.selection) {
    return document.selection.createRange().text;
  }
  return '';
}

var italicYellowBgApplier;

function toggleItalicYellowBg() {
  italicYellowBgApplier.toggleSelection();
}

window.onload = function() {
  $(document).on("contextmenu", ".italicYellowBg", function(e){
    if(coverAll()) {
      italicYellowBgApplier.undoToSelection();
      return false;
    }
  });
  rangy.init();


  // Enable buttons
  var classApplierModule = rangy.modules.ClassApplier;

  // Next line is pure paranoia: it will only return false if the browser has no support for ranges,
  // selections or TextRanges. Even IE 5 would pass this test.
  if (rangy.supported && classApplierModule && classApplierModule.supported) {

    italicYellowBgApplier = rangy.createClassApplier("italicYellowBg",       {
      tagNames: ["span", "a", "b", "img"]
    });
  }
};

0 ответов

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

Другие вопросы по тегам