我正在尝试创建一个降价编辑器。现在在这个函数中,我正在使用B
(粗体)按钮进行切换。应该注意的是,我使用this库从textarea获取/设置突出显示的文本。
这是我的功能:(它也可以,一切都很好)
function toggleText(before, after) {
var $textarea = $('#qandatextarea');
var textarea = $textarea[0];
var sel = $textarea.getSelection();
var val = textarea.value;
var posStart = sel.start;
var posEnd = posStart + sel.length;
var posBefore = posStart - before.length;
if (val.substr(posBefore, before.length) == before && val.substr(sel.end, after.length) == after) {
textarea.value = val.slice(0, posBefore) + sel.text + val.slice(sel.end + after.length);
$textarea.setSelection(posBefore, posBefore + sel.length);
} else {
$textarea.surroundSelectedText(before, after);
while(val.substr(posStart, 1) == ' ') {
posStart++;
$textarea.val( textarea.value.replaceAt(posStart + 1, "*").replaceAt(posStart - 1, " ") );
}
while(val.substr(posEnd - 1, 1) == ' ') {
$textarea.val( textarea.value.replaceAt(posEnd + 1, "*").replaceAt(posEnd + after.length + 1, " ") );
posEnd--;
}
// set new highlighted-text
$textarea.setSelection(posStart + before.length, posEnd + before.length);
} // else
} // function
因此,为了使其更优化,我在循环中使用赋值而不是$textarea.val(
,但现在它无法正常工作,它会替换错误的字符并严重处理空格。
.
.
.
else {
var txtval;
$textarea.surroundSelectedText(before, after);
while(val.substr(posStart, 1) == ' ') {
posStart++;
txtval = textarea.value.replaceAt(posStart + 1, "*").replaceAt(posStart - 1, " ");
}
while(val.substr(posEnd - 1, 1) == ' ') {
txtval = textarea.value.replaceAt(posEnd + 1, "*").replaceAt(posEnd + after.length + 1, " ");
posEnd--;
}
// set textarea value
$textarea.val(txtval);
$textarea.setSelection(posStart + before.length, posEnd + before.length);
}
.
.
.
答案 0 :(得分:1)
您的代码似乎存在两个问题:
1)如果字符(“index,1”或“index - 1,1”)不是空格,则绕过/跳过while循环,不再进行更换。
2)您永远不会更新textarea的值或指定的变量(“val”),这意味着您使用相同的字符串而不实际替换任何内容。你可能应该在你的while循环中使用“val = ...
”代替“txtval = ...
”,并在最后的“set textarea value”中使用$textarea.val(val);
// ... code ...
while(val.substr(posStart, 1) == ' ') {
posStart++;
val = val.replaceAt(posStart + 1, "*").replaceAt(posStart - 1, " ");
}
while(val.substr(posEnd - 1, 1) == ' ') {
val = val.replaceAt(posEnd + 1, "*").replaceAt(posEnd + after.length + 1, " ");
posEnd--;
}
// set textarea value
$textarea.val(val);
// ... code...