为什么笑脸禁用 REGEXP 会导致无法编辑文本?
Why smiley disabling REGEXP causes editing of text impossible?
我使用了以下 RegExp
来禁用文本框中的笑脸符号。它工作正常。
title = title.replace(/[^a-zA-Z 0-9.~`!@#$%^&*()_+-={}|:;<>,.?\/'"\[\]]+/g,'');
但是当我这样做的时候,我遇到了一个问题。如果我尝试编辑该文本框中的文本,光标将移至文本末尾。
假设 "How are you?" 是在文本框中输入的文本。如果我尝试在 'how' 和 'are' 之间添加 'old',光标将移动到文本的末尾。
jQuery('#topic_title').bind('input propertychange', function(e) {
title = jQuery("#topic_title").val();
title = title.replace(/[^a-zA-Z 0-9.~`!@#$%^&*()_+-={}|:;<>,.?\/'"\[\]]+/g,'');
jQuery("#topic_title").val(title); });
当我删除 RegExp 时,可以进行编辑。我希望这个问题与 RegExp 有关。请帮我找到解决办法。
发生这种情况是因为每次更改(每次按键)后都会进行替换。
您可以将 bind('input propertychange'
替换为 bind('blur'
。这将在输入框失去焦点后删除表情符号。
或者您需要在替换文本之前存储光标位置,然后将光标设置到原始位置。
这是一个如何做的例子
jQuery('#topic_title').bind('input propertychange', function(e) {
title = jQuery("#topic_title").val();
var caretPosition = getCaret(this);
title = title.replace(/[^a-zA-Z 0-9.~`!@#$%^&*()_+-={}|:;<>,.?\/'"\[\]]+/g,'');
jQuery("#topic_title").val(title);
setCaretToPos(this, caretPosition);
});
function getCaret(node) {
if (node.selectionStart) {
return node.selectionStart;
} else if (!document.selection) {
return 0;
}
var c = "[=10=]1",
sel = document.selection.createRange(),
dul = sel.duplicate(),
len = 0;
dul.moveToElementText(node);
sel.text = c;
len = dul.text.indexOf(c);
sel.moveStart('character',-1);
sel.text = "";
return len;
}
function setSelectionRange(input, selectionStart, selectionEnd) {
if (input.setSelectionRange) {
input.focus();
input.setSelectionRange(selectionStart, selectionEnd);
}
else if (input.createTextRange) {
var range = input.createTextRange();
range.collapse(true);
range.moveEnd('character', selectionEnd);
range.moveStart('character', selectionStart);
range.select();
}
}
function setCaretToPos (input, pos) {
setSelectionRange(input, pos, pos);
}
我使用了以下 RegExp
来禁用文本框中的笑脸符号。它工作正常。
title = title.replace(/[^a-zA-Z 0-9.~`!@#$%^&*()_+-={}|:;<>,.?\/'"\[\]]+/g,'');
但是当我这样做的时候,我遇到了一个问题。如果我尝试编辑该文本框中的文本,光标将移至文本末尾。
假设 "How are you?" 是在文本框中输入的文本。如果我尝试在 'how' 和 'are' 之间添加 'old',光标将移动到文本的末尾。
jQuery('#topic_title').bind('input propertychange', function(e) {
title = jQuery("#topic_title").val();
title = title.replace(/[^a-zA-Z 0-9.~`!@#$%^&*()_+-={}|:;<>,.?\/'"\[\]]+/g,'');
jQuery("#topic_title").val(title); });
当我删除 RegExp 时,可以进行编辑。我希望这个问题与 RegExp 有关。请帮我找到解决办法。
发生这种情况是因为每次更改(每次按键)后都会进行替换。
您可以将 bind('input propertychange'
替换为 bind('blur'
。这将在输入框失去焦点后删除表情符号。
或者您需要在替换文本之前存储光标位置,然后将光标设置到原始位置。 这是一个如何做的例子
jQuery('#topic_title').bind('input propertychange', function(e) {
title = jQuery("#topic_title").val();
var caretPosition = getCaret(this);
title = title.replace(/[^a-zA-Z 0-9.~`!@#$%^&*()_+-={}|:;<>,.?\/'"\[\]]+/g,'');
jQuery("#topic_title").val(title);
setCaretToPos(this, caretPosition);
});
function getCaret(node) {
if (node.selectionStart) {
return node.selectionStart;
} else if (!document.selection) {
return 0;
}
var c = "[=10=]1",
sel = document.selection.createRange(),
dul = sel.duplicate(),
len = 0;
dul.moveToElementText(node);
sel.text = c;
len = dul.text.indexOf(c);
sel.moveStart('character',-1);
sel.text = "";
return len;
}
function setSelectionRange(input, selectionStart, selectionEnd) {
if (input.setSelectionRange) {
input.focus();
input.setSelectionRange(selectionStart, selectionEnd);
}
else if (input.createTextRange) {
var range = input.createTextRange();
range.collapse(true);
range.moveEnd('character', selectionEnd);
range.moveStart('character', selectionStart);
range.select();
}
}
function setCaretToPos (input, pos) {
setSelectionRange(input, pos, pos);
}