0

テキストを選択して、複数回出現する場合にその選択を置き換えるのに苦労しています。常に最初に出現したものに戻り、それを置き換えます。

これが私が使用しているスクリプトであり、選択が一度だけ表示される場合、私は完全です。複数回出現する場合は、最初のものを取得します。

var self=$('#textarea');
GetSelected={};
GetSelected=function(){
    var txt='';
    if(window.getSelection){
        txt=window.getSelection();
    }
    else if(document.getSelection){
        txt=document.getSelection();
    }
    else if(document.selection){
        txt=document.selection.createRange().text;
    }
    return txt;
}

self.html(self.html().replace(selection, '<b>' + selection + '</b>'));

どの選択を置き換えるかを知っている、私が見逃しているものはありますか?

4

3 に答える 3

0

テキストを見つけようとするのではなく、選択自体に基づいて行動する必要があります。これはブラウザによって異なります。

var t = $("#textarea")[0];
if (t.setSelectionRange)
{
    var selStart = t.selectionStart;
    var selEnd = t.selectionEnd;
    var val = t.value;
    var startVal = val.substring(0, selStart);
    var selectedVal = val.substring(selStart, selEnd);
    var endVal = val.substring(selEnd);
    var bold = selectedVal.bold();
    t.value = startVal + bold + endVal;
}
else if (document.selection && document.selection.createRange)
{
    var selection = document.selection.createRange();
    selection.text = selection.text.bold();
}
于 2011-06-02T17:18:27.800 に答える
0

ここでの主な問題は、HTML を文字列として扱い、その一部をあなたが行っているように置き換えることは非常に脆弱なアプローチであることです (一部がすでに太字になっているテキストの一部を一致させるか、選択したものと一致する属性値を含むと考えてください)。テキストなど)。代わりに、組み込みのブラウザー動作を使用して、一致するテキストを見つけることができます。あなたのケースに合わせたその質問の関数は次のとおりです。

function doSearch(text) {
    if (window.find && window.getSelection) {
        document.designMode = "on";
        var sel = window.getSelection();
        sel.collapse(document.body, 0);

        while (window.find(text)) {
            document.execCommand("Bold", false, null);
            sel.collapseToEnd();
        }
        document.designMode = "off";
    } else if (document.body.createTextRange) {
        var textRange = document.body.createTextRange();
        while (textRange.findText(text)) {
            textRange.execCommand("Bold", false, null);
            textRange.collapse(false);
        }
    }
}

また、 IE < 9 では文字列を返し、他のブラウザではオブジェクトをGetSelected返すという点で、この関数は正しくありません (この場合は偶然にも機能しますが) 。また、変数Selectionを宣言していません。GetSelectedよりシンプルで優れた代替品を次に示します。

function GetSelected() {
    var txt = ""
    if (window.getSelection) {
        txt = window.getSelection().toString();
    } else if (document.selection && document.selection.type == "Text") {
        txt = document.selection.createRange().text;
    }
    return txt;
}

私の提案したアプローチを使用する場合、この関数はまったく必要ないことに注意してください。

于 2011-06-02T08:33:15.733 に答える
0

すべてのオカレンスを置き換えるには、 を使用する必要があります/g。してみてくださいself.html(self.html().replace('/' +selection+'/g', '<b>' + selection + '</b>'));

于 2011-06-02T02:29:02.270 に答える