多次出现文本的getSelection替换第一次出现而不是正确的选择

时间:2011-06-02 00:10:35

标签: javascript jquery getselection

我很难选择文本并在多次出现时替换该选择。它总是恢复到第一次出现并替换它。

这是我正在使用的脚本,如果选择只出现一次我是完美的。当它出现不止一次时,就抓住了第一个。

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>'));

是否有我遗漏的东西,知道要替换哪个选择?

3 个答案:

答案 0 :(得分:0)

要替换所有需要使用的/g。请尝试self.html(self.html().replace('/' +selection+'/g', '<b>' + selection + '</b>'));

答案 1 :(得分:0)

这里的主要问题是将HTML视为字符串并将其部分替换为正在进行的操作是一种非常脆弱的方法(考虑匹配的文本部分,其中部分已经是粗体,或者包含属性值例如,匹配所选文本)。相反,您可以使用built-in browser behaviour to find matching text。以下是适合您案例的问题的功能:

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);
        }
    }
}

此外,GetSelected函数不正确(尽管在这种情况下巧合地起作用),因为它在IE中返回一个字符串&lt; 9和其他浏览器中的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;
}

请注意,如果您使用我建议的方法,则根本不需要此功能。

答案 2 :(得分: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();
}