Javascript 修改文本导致出现重复文本时出现问题

Javascript 修改文本导致出现重复文本时出现问题,javascript,jquery,Javascript,Jquery,好的,基本上我有一个带有textarea的表单,用户可以在其中添加内容并对所选文本应用一些bbcode 现在,我使用此函数获取所选文本: selection_get: function() { var text = ""; if (window.getSelection) { text = window.getSelection().toString(); } else if (document.selection && document.

好的,基本上我有一个带有
textarea
的表单,用户可以在其中添加内容并对所选文本应用一些bbcode

现在,我使用此函数获取所选文本:

selection_get: function() {
    var text = "";
    if (window.getSelection) {
        text = window.getSelection().toString();
    } else if (document.selection && document.selection.type != "Control") {
        text = document.selection.createRange().text;
    }
    return text;
}
这是正常的,唯一的问题是如果有重复的内容,例如:

你什么,你什么…

现在,假设我从上面的字符串中选择第二个
youwhat
,并通过如下方式运行它:

// get the selected text
var text = selection_get();
var original_text = $('textarea').val();
var newtext = '[b]you what[/b]';

$(container).val(original_text.replace(text, newtext));
现在,
newtext
将是应用bbcode的所选代码(在本例中,我们将其设置为
[b]you what[/b]

问题是
replace()
将替换所选
文本的第一次出现。如何将实际选定的文本替换到其设置位置

注意:请询问我是否需要进一步澄清,问题相当模糊:-( 干杯。

使用和属性并在两端添加您的BBcode

获得所选文本后,通过从textarea内容的开头到selectionStart点获取substr,并从selectionEnd到textarea内容的结尾获取选择后的追加文本,来获取前置文本

然后像这样设置textarea的值(psuedo):

此方法实际上是执行您建议的操作的唯一方法,因为它针对您选择的文本的确切部分,而不是执行
replace()
在匹配文本上,如您所述,它将替换第一次出现的内容,而不是您选择的内容。在类似
hello
的文本块中,如果您选择第四个
hello
则您的代码将替换第一个
hello

编辑:用一个例子来说明这个想法:

function getSelected() {
    var editor = $('textarea');

    var u     = editor.val();
    var start = editor.get(0).selectionStart;
    var end   = editor.get(0).selectionEnd;

    return [u.substring(0, start), u.substring(end), u.substring(start, end)];
}

$('#ButtonToAddBBCode').click(function(e) {
    e.preventDefault();
    var bits = getSelected();
    var bb = ['[b]', '[/b]']; // your example BB code
    $('textarea').val(bits[0] + bb[0] + bits[2] + bb[1] + bits[1]);
});

你肯定想看看这个。用一个直接的
替换
是不够健壮的。几乎完全是你想要的。Tim Down在这里的某个地方,如果你在你的问题中添加Rangy作为标签,他可能会评论…

谢谢你花时间回答这个问题。这正是我需要的:)
function getSelected() {
    var editor = $('textarea');

    var u     = editor.val();
    var start = editor.get(0).selectionStart;
    var end   = editor.get(0).selectionEnd;

    return [u.substring(0, start), u.substring(end), u.substring(start, end)];
}

$('#ButtonToAddBBCode').click(function(e) {
    e.preventDefault();
    var bits = getSelected();
    var bb = ['[b]', '[/b]']; // your example BB code
    $('textarea').val(bits[0] + bb[0] + bits[2] + bb[1] + bits[1]);
});