2015-03-30 75 views
0

我用這段JavaScript代碼搶字立即插入符號前面:(恩「字」)的Javascript:文本選擇包括特殊字符

sel = window.getSelection() 
var selectedRange = sel.getRangeAt(0); 
sel.collapseToStart(); 
sel.modify("move", "backward", "word"); 
sel.modify("extend", "forward", "word"); 

這得到的話,即使沒有結尾的空白,但省略字末尾的特殊字符(例如,而不是「字:」只得到「字」)。

如果我在一個詞的內部包含冒號,比如「wo:rd」,它會得到全部5個字符。

雖然我確實需要獲得特殊字符。我怎樣才能做到這一點?

+0

很好的問題,我工作的一個解決方案 - 它似乎是我們要尋找的輸出是一個「選擇」而不是「範圍」,我們需要獲取修改過的選擇的值,然後將正則表達式匹配到父節點的nodeValue,如/ value + [^ A-Za-z0-9]/ig – iamwhitebox 2015-03-30 22:57:50

+1

' Selection.modify()'在瀏覽器之間不一致地實現,IE並沒有實現。另一種方法是[Rangy的TextRange模塊](https://github.com/timdown/rangy/wiki/Text-Range-Module)(免責聲明:由我撰寫),它在瀏覽器中始終如一地執行此操作,並允許使用正則表達式來指定構成一個詞。 – 2015-03-31 08:33:28

+0

很酷的 – iamwhitebox 2015-03-31 17:04:24

回答

0

我得到了它,我的示例代碼的草率道歉,但在這裏它是:jsFiddle

var i = 0; 

function getBeforeSelection() { 
    var sel = window.getSelection(), 
     selectedRange = sel.getRangeAt(0), 
     sel2, 
     res, 
     finalValue, 
     regexObj; 

    sel.collapseToStart(); 
    sel.modify("move", "backward", "word"); 
    sel.modify("extend", "forward", "word"); 

    finalValue = sel.toString(); 

    regexObj = new RegExp(finalValue + '[^A-Za-z0-9\s\b]*'); 

    res = sel.focusNode.nodeValue.trim().match(regexObj); 

    alert(res); 

} 

// added for sake of example, calls getBeforeSelection on double click 
// (when selection is made) 
document.addEventListener('click', function (e) { 
    i++; 

    if (i > 1) { 
     getBeforeSelection(); 
     i = 0; 
    } 
}); 
+0

在Firefox中不起作用。 'Selection.modify()'在瀏覽器之間不一致。 – 2015-03-31 08:31:24