2013-03-01 61 views
4

我有以下的代碼選擇元素的全部內容:用Javascript選擇特定詞?

function selectElement(element) { 
    var sel = window.getSelection(); 
    sel.removeAllRanges(); 
    var range = document.createRange(); 
    range.setStart(element, 0); 
    range.setEnd(element, 1); 
    sel.addRange(range); 
    console.log(range); 
} 

我稱之爲通過:

selectElement(document.getElementById("input")); 

如果#input看起來是這樣的:

<div id="input"> 
Lorem Ipsum Dolor Sit 
</div> 

哪有我選擇字符0-7,以便選擇:

<div id="input"> 
[Lorem I]psum Dolor Sit 
</div> 

我想設置setStartsetEnd會工作,但我只能從0-1設置它。

我可以選擇節點內的文本,而不是節點本身嗎?

+0

你可以使用你的函數來選擇整個HTML。然後使用正則表達式來解析你想要的字符串。 – geniuscarrier 2013-03-01 18:09:39

+0

不,我需要通過window.getSelection()實際選擇瀏覽器中的文本。setRange()' – Charlie 2013-03-01 18:10:21

回答

2

你傳遞整個DIV節點setStart/setEnd,這就是爲什麼你0和1之間,您必須通過div的firstChild代替,這是一個文本節點只能選擇。例如,選擇「文字」:

range.setStart(element.firstChild, 7); 
range.setEnd(element.firstChild, 12); 

http://jsfiddle.net/JJ86n/

注:處理範圍的跨瀏覽器一直是一個爛攤子。這已經有一段時間了,因爲我沒有處理它,但上次我檢查它似乎是個好主意,讓像rangy這樣的圖書館能夠照顧到令人討厭的細節。

+0

你知道我怎麼能用rangy做同樣的事嗎? – Charlie 2013-03-01 18:16:47

+1

我不知道,但它可能在他們的文檔上。 – bfavaretto 2013-03-01 18:19:03

1

您需要從元素內的文本節點中選擇它。

range.setStart(element.childNodes[0], 0); 
range.setStart(element.childNodes[0], 7); 
0

您正在處理的是整個元素,它是具有不同對象作爲屬性的對象。要處理字符串,您必須首先獲取字符串(文本)子元素。您可以通過從元素子節點數組獲取子節點來完成此操作。嘗試直接在Selection對象上使用JavaScript String屬性或方法(如length或substr)會導致錯誤,如果它沒有該屬性或方法,並且可能會返回意外結果。