【发布时间】:2014-11-21 16:50:35
【问题描述】:
我正在使用可编辑的 div:
<div class="editableDiv" contenteditable="true">
sdtgssdrsdrtyy ╚asasasarrstssdertrtyrtyrrty ☻aaaaaaaaaaaaaaaaadaafsdsf4n
</div>
我的任务是向用户显示非 ascii 字符,突出显示非 ascii 字符我使用了突出显示的 jQuery 库,该库通过添加带有“highlight”类的 span 来突出显示非 ascii 字符。 innerHTML 如下:
<span class="highlight">╚</span>asasasarrstssdertrtyrtyrrty
<span class="highlight">☻</span>aaaaaaaaaaaaaadaafsdsf4n
突出显示效果很好,但唯一的问题是,当用户删除非 ascii 字符并从该位置开始输入时,输入的字符也会突出显示,当我检查 innerHTML 时,它显示新输入的字符也进入了跨度标记如下:
<span class="highlight">☻aaa</span>aaaaaaaaaaaaaadaafsdsf4n
为了解决这个问题,我在可编辑的 div 上使用了 KeyUp 事件,在这种情况下,我将跨度与非 ascii 字符和新键入的字符分开,并将它们放入新的跨度标签并替换旧标签。这适用于第一个“keyup”,新输入的字符也没有突出显示,但之后当我再次输入时,这个事件不会触发。
我不知道是什么原因造成的?这是因为我已经明确更改了 div 的 innerHTML 吗?请帮忙。
下面是keyup函数:
$(document).on('keyup', ".editableDiv", function () {
var hilighterSpans = $(this).children(".highlight");
hilighterSpans.each(function (x, y) {
var spanText = $(y).text().trim();
if (spanText == "") {
$(y).remove();
}
else {
var regex = new RegExp("[^\u0020-\u007E]+");
var nonasciiChar = regex.exec(spanText);
if (nonasciiChar != "") {
var asciiChars = spanText.replace(nonasciiChar, '');
var spannode1 = document.createElement('span');
var spannode2 = document.createElement('span');
spannode2.className = 'highlight';
spannode2.innerHTML=nonasciiChar;
if (spanText.indexOf(nonasciiChar) == 0) {
$(spannode1).append(spannode2);
$(spannode1).append(asciiChars);
}
else {
$(spannode1).append(asciiChars);
$(spannode1).append(spannode2);
}
$(this).replaceWith(spannode1);
}
}
});
});
替换的innerHTML如下:
<span><span class="highlight">╚</span>assd</span>
<span><span class="highlight">☻</span>aaa</span>
这会导致问题吗?
我 JSFiddle 尝试从突出显示的非 ascii 字符直接输入.....我希望新输入的字符不突出显示....目前第一次输入它工作正常(虽然新输入的字符改变了位置,但会有看看这个)...但是如果再次输入代码不起作用(keyup 事件不会触发)...
【问题讨论】:
-
如果我没记错的话,您需要在 div 中添加一个
tabindex属性,以便某些浏览器触发这些事件。 -
您检查控制台是否有错误?
-
看来问题出在
keyup或任何事件上。这是关于高亮添加元素,如果用户更改突出显示的文本,您需要删除它们。 -
@MelanciaUK:是的,我正在做同样的事情......如果用户删除了高亮显示的 nonascii 字符,我将删除整个跨度......但如果他尝试在不删除突出显示的字符的情况下键入,我是将新输入的字符与突出显示的 nonascii 字符分开,这样他就不会看到突出显示的新输入的字符...这适用于第一个键盘输入...但之后如果我尝试输入事件不会触发...
-
你能创建一个
jsFiddle让我们看看它的工作原理吗?
标签: javascript jquery highlight contenteditable jquery-events