2014-02-21 26 views
1

演示:http://jsbin.com/caxuk/1/edit的Javascript`getSelection()getRangeAt(0)`不與標籤正常工作

我使用window.getSelection().getRangeAt(0)選擇一些文本操作。然而,當我選擇在<b>標籤,返回的範圍是1

我怎麼能夠得到適當的範圍內,無論是在什麼樣的方式標記\

代碼的完整性:?

<!DOCTYPE html> 
<html> 
<head> 
<script src="http://code.jquery.com/jquery-1.8.3.min.js"></script> 
    <meta charset="utf-8"> 
    <title>JS Bin</title> 
</head> 
<body> 
    <div id="text"> 
    <b>smfk</b> - osdnmfoaidsmnfoids 
    </div> 
</body> 
</html> 

$("#text").mouseup(function (evt) { 
    var selectionRange = window.getSelection().getRangeAt(0); 
    var range = selectionRange.endOffset - selectionRange.startOffset; 

    alert(range); 

}); 

突出smfksmfk -等返回1,2,3 ...爲範圍

編輯:我需要返回不含任何標籤的範圍...所以,如果我選擇smfk -,它應該返回0-4,不0-11

回答

1
$("#text").mouseup(function (evt) { 
    var selectionRange = window.getSelection().getRangeAt(0); 
    var start = selectionRange.startOffset; 
    var end = selectionRange.endOffset; 
    var length = window.getSelection().toString().length; 

    if (start === end || end < start || (end - start) !== length){ 
    end = start + length; 
    } 

    var range = end - start; 

    alert(range); 

}); 

只需添加一些驗證的計算。
演示:http://jsbin.com/caxuk/2/edit

+0

upvote for toString()...但爲什麼不只是alert(window.getSelection()。toString()。length)? – mauretto

+0

@mauretto,因爲我需要一個準確的'開始'和'結束'點.. – TheGeekZn

0

endOffset指endContainer (unbolded文本),startOffset指的是startContaner(粗體文本)。

這種情況的簡單解決方案: 如果啓動容器不等於結束容器,則啓動容器長度 - startOffset + endOffset,嘗試自己。

看看Range spec,特別是在[2.7。提取內容]部分。

+0

那麼我該如何解決?如果沒有解決方案,這應該是一個評論。 – TheGeekZn