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

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

于 2011-06-02T02:29:02.270 回答
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);
        }
    }
}

此外,该GetSelected函数不正确(尽管它在这种情况下巧合地确实有效),因为它在 IE < 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;
}

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

于 2011-06-02T08:33:15.733 回答