2011-12-06 19 views
2

如何替換html textarea中的選定文本?如何替換我在jQuery中選擇的文本?

mardagz[b]mardagz[\b]

這裏是我的代碼,但將不會工作。

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

    return document.selection.createRange().text; 
}} 



function bbrep(start, end){ 
$("#pPost").val($("#pPost").val().replace(getSelectedText(), start + getSelectedText() + end))}; 

關鍵

$("#bbbold").click(function(){ 
      bbrep("[b]", "[/b]"); 
      return false;  
}) 

任何人有這樣的想法? :)

+0

通過查看'getSelectedText()'返回任何東西開始了。 – kba

+0

仍然相同... broo whheww – mardagz

+1

您的getSelectedText方法似乎不會在Google Chrome瀏覽器中返回任何內容。 –

回答

1

這工作:

function bbrep(start, end) { 
    var str = $("#pPost").val(); 
    var word = "bar";//getSelectedText(); 
    var re = new RegExp("(\\b" + word + "\\b)", "ig"); 
    $("#pPost").val(str.replace(re, start + "$1" + end)); 
}; 

但是我不得不硬編碼字符串,因爲你getSelectedText()方法不返回任何東西。

編輯:

而不是使用.click的,用.mousedown

的時候.click發生,文本不再被選中。

+0

yeahh這就是它現在即時通訊尋找功能來選擇文字... – mardagz

+0

我的編輯解決了我認爲的問題。 –

+0

反正iv'e添加這一個 '$(這).live( '鼠標鬆開',函數(){ 選擇= getSelectedText(); \t \t }); ' 有一個結果,但 '[b] [/ b] mardagz'而不是'[b] mardagz [/ b]' – mardagz

10

這裏一個完整的測試&工作示例

function getSelectedText() { 
    var len =$("#pPost").val().length; 
    var start = $("#pPost")[0].selectionStart; 
    var end = $("#pPost")[0].selectionEnd; 
    var sel = $("#pPost").val().substring(start, end); 
    return sel; 
} 


function bbrep(start, end){ 
var tmpVal = getSelectedText(); 
$("#pPost").val($("#pPost").val().replace(tmpVal, start + tmpVal + end)); 

}

$("#bbbold").click(function(){ 
     bbrep("[b]", "[/b]"); 
     return false;  

})

下面是HTML一小段代碼片段

<textarea rows="2" cols="20" id="pPost">mardagz 
</textarea> 
<input type="button" id="bbbold" value="clcikMe" /> 

這裏是的jsfiddle例子,我只是做了"it works"


另一個的jsfiddle,是以指數考慮過,jsfiddle.net/SU7wd/58 < - 工作是在這個第二一個

+0

是的夥計.. :)謝謝:) iv'e了它.. :) – mardagz

+0

它應該請注意,這將始終替代選定文本的第一次出現,而不一定是所選文本。 IE:嘗試替換mardagz中的第二個'a'或abracadbra中的許多'a'中的一個... –

+0

@ChrisKerekes,因爲你所要做的只是一個更好的替換,一個將考慮索引,看看http://jsfiddle.net/SU7wd/58/ < - 在那第二個也工作 – Daniel

1

好吧,我不得不重建這個一起工作我asp.net控件。認爲它儘可能簡單。這將取代選擇的內容,而不是其他內容中找到的第一個單詞。

只要確保你給它的文本框的ID。

您可以調用像這樣的函數makeBBCode(「[b]」,「[/ b]」)。我使用OnClientClick在一個asp圖像按鈕來調用它。 [例:的OnClientClick = 'makeBBCode( 「[B]」, 「[/ B]」)']

String.prototype.insertAt = function (index, string) { 
 
     return this.substr(0, index) + string + this.substr(index); 
 
    } 
 

 
    function makeBBCode(start, end) { 
 
     var txtBox = document.getElementById("Object_Id_Here") 
 
     txtBox.value = txtBox.value.insertAt(txtBox.selectionEnd, end).insertAt(txtBox.selectionStart, start); 
 
    }

1

萬一有人來這裏以後,我將分享我的解決辦法我經過一番研究後發現,基於上述內容。我一直在尋找一種解決方案來替代我要求替換的東西(而不是textarea中的相同子字符串),並且將焦點放在插入文本的末尾。

這是我來到了解決方案:

function text_with_insert(str, index, value) { 
    return str.substr(0, index) + value + str.substr(index); 
}  

function surround_sel_text(str_start, str_end) { 
    var el = $("#pPost"); 
    var focus_idx = el[0].selectionEnd + str_start.length + str_end.length; 

    var text_with_end_insert = text_with_insert(el.val(), el[0].selectionEnd, str_end); 
    el.val(text_with_insert(text_with_end_insert, el[0].selectionStart, str_start)); 
    el[0].selectionStart = focus_idx; 
    el[0].selectionEnd = focus_idx; 
} 

$("#bbbold").mousedown(function() { 
     surround_sel_text('[b]', '[/b]'); 
     return false;  
});