2013-03-03 10 views
5

私は次のようなHTMLがある場合:window.getSelection()HTMLタグのオフセット?

<div class="content"> 
Vivamus <span>luctus</span> urna sed urna ultricies ac tempor dui sagittis. 
</div> 

を私は選択したテキストの範囲を見mouseup上のイベントを実行します。

$(".content").on("mouseup", function() { 
    var start = window.getSelection().baseOffset; 
    var end = window.getSelection().focusOffset; 
    if (start < end) { 
     var start = window.getSelection().baseOffset; 
     var end = window.getSelection().focusOffset; 
    } else { 
     var start = window.getSelection().focusOffset; 
     var end = window.getSelection().baseOffset; 
    } 
    console.log(window.getSelection()); 
    console.log(start + ", " + end); 
}); 

をそして私は、コンテンツから単語Vivamusを選択し、それがこれは選択の範囲であるため、1, 8と記録されます。

場合は、しかし、私は言葉urnaを選択し、それが15, 20を記録しますが、アカウントにHTMLの<span>要素になりません。

テキストだけでなく、focusOffsetbaseOffsetもHTMLタグにカウントされますか?

+0

[本](http://stackoverflow.com/questions/4811822/get-a-ranges -start-and-end-offsets-parent-container/4812022#4812022)回答が役に立ちます –

+0

これは同じ問題を抱えています/私の問題に対処していません。しかし、リンクのためのあなた。 – Charlie

+0

あなたは何を達成しようとしていますか? – PetersenDidIt

答えて

5

更新

ライブ例:http://jsfiddle.net/FLwxj/61/

Using a clearSelection() functiona replace approach、私は望ましい結果を達成することができました。

var txt = $('#Text').html(); 
$('#Text').html(
    txt.replace(/<\/span>(?:\s)*<span class="highlight">/g, '') 
); 
clearSelection(); 

出典:


https://stackoverflow.com/a/6562764/1085891

  • アプローチを交換してください。コード効率の順に並べました。

    作業溶液

    • https://stackoverflow.com/a/8697302/1085891live example

      window.highlight = function() { 
          var selection = window.getSelection().getRangeAt(0); 
          var selectedText = selection.extractContents(); 
          var span = document.createElement("span"); 
          span.style.backgroundColor = "yellow"; 
          span.appendChild(selectedText); 
          span.onclick = function (ev) { 
          this.parentNode.insertBefore(
           document.createTextNode(this.innerHTML), 
           this 
          ); 
          this.parentNode.removeChild(this); 
          } 
          selection.insertNode(span); 
      } 
      
    • https://stackoverflow.com/a/1623974/1085891live example

      $(".content").on("mouseup", function() { 
          makeEditableAndHighlight('yellow'); 
      }); 
      
      function makeEditableAndHighlight(colour) { 
          sel = window.getSelection(); 
          if (sel.rangeCount && sel.getRangeAt) { 
          range = sel.getRangeAt(0); 
          } 
          document.designMode = "on"; 
          if (range) { 
          sel.removeAllRanges(); 
          sel.addRange(range); 
          } 
          // Use HiliteColor since some browsers apply BackColor to the whole block 
          if (!document.execCommand("HiliteColor", false, colour)) { 
          document.execCommand("BackColor", false, colour); 
          } 
          document.designMode = "off"; 
      } 
      
      function highlight(colour) { 
          var range, sel; 
          if (window.getSelection) { 
          // IE9 and non-IE 
          try { 
           if (!document.execCommand("BackColor", false, colour)) { 
           makeEditableAndHighlight(colour); 
           } 
          } catch (ex) { 
           makeEditableAndHighlight(colour) 
          } 
          } else if (document.selection && document.selection.createRange) { 
          // IE <= 8 case 
          range = document.selection.createRange(); 
          range.execCommand("BackColor", false, colour); 
          } 
      } 
      
    • https://stackoverflow.com/a/12823606/1085891live example

    他の人の解決策:多分

  • +0

    私は最初のオプションが好きですが、これは簡単です。唯一のことは、スパン要素の衝突を提供しないことです。私が意味することは、重複するとマージしないということです。それは実装が難しいと思いますか? – Charlie

    +0

    例えば、より大きな「スパン」内に「スパン」がある場合、私は2つをマージすることができます:http://jsfiddle.net/charlescarver/FLwxj/52/、しかし、私はそれを得る方法を理解できません開始点または終了点が選択範囲内のテキストと重複している場合は、テキストをマージします。 – Charlie

    +0

    どうすればいいですか:http://jsfiddle.net/FLwxj/53/?このソリューションを使用した:http://stackoverflow.com/a/12004367/1085891 – JSuar