【问题标题】:Editable Div not firing "KeyUp" event/ Removing Highlighting可编辑的 Div 未触发“KeyUp”事件/删除突出显示
【发布时间】: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 for this problem

我 JSFiddle 尝试从突出显示的非 ascii 字符直接输入.....我希望新输入的字符不突出显示....目前第一次输入它工作正常(虽然新输入的字符改变了位置,但会有看看这个)...但是如果再次输入代码不起作用(keyup 事件不会触发)...

【问题讨论】:

  • 如果我没记错的话,您需要在 div 中添加一个 tabindex 属性,以便某些浏览器触发这些事件。
  • 您检查控制台是否有错误?
  • 看来问题出在keyup 或任何事件上。这是关于高亮添加元素,如果用户更改突出显示的文本,您需要删除它们。
  • @MelanciaUK:是的,我正在做同样的事情......如果用户删除了高亮显示的 nonascii 字符,我将删除整个跨度......但如果他尝试在不删除突出显示的字符的情况下键入,我是将新输入的字符与突出显示的 nonascii 字符分开,这样他就不会看到突出显示的新输入的字符...这适用于第一个键盘输入...但之后如果我尝试输入事件不会触发...
  • 你能创建一个jsFiddle 让我们看看它的工作原理吗?

标签: javascript jquery highlight contenteditable jquery-events


【解决方案1】:

问题是因为内部 .highlight 跨度也是可编辑的。

您需要将spannode2 设置为contenteditable="false",在创建spannode2 元素后添加此行。

spannode2.setAttribute('contenteditable', 'false');

确保将初始 .highlight 设置为 contenteditable="false"

简而言之,所有的.highlight span 都必须有contenteditable="false"

jsfiddle

【讨论】:

  • 我将不得不看看这是否可以实现......因为突出显示跨度是由第三方 jquery 库创建的......我要试试这个......谢谢你的回复:)跨度>
  • 无论如何,你可以在插件创建跨度后$('.highlight').attr('contenteditable','false');这样做。
  • 我在 IE 中遇到问题,当我在突出显示的跨度文本后单击时使跨度不可编辑后,光标会自动向前移动,并且它不允许我删除内容。它在 Chrome 中工作正常...请告知
  • 我无法在 IE 上进行测试。但是在Firefox中发生了类似的事情。我不得不点击突出显示后的下一个字符,但我还不知道如何修复它。
【解决方案2】:

它实际上是 Firefox 中的错误,当 "" 嵌套在其他元素集 contenteditable "true" 中时,它会忽略删除和退格事件...

您可以通过此链接检查错误 :) https://bugzilla.mozilla.org/show_bug.cgi?id=685452

【讨论】:

  • 这个问题的解决方案是什么...同样的事情发生在 IE 中
【解决方案3】:

我得到了这个问题的解决方案,并想与你们分享,以便它可以帮助其他人。

添加到 rogelio 的解决方案,即使 span contenteditable="false",我在每个突出显示 span 的末尾添加了 "Zero Width Space"("​"),从而解决了问题。

JS Fiddle For the Solution

    <div class="editableDiv"  contenteditable="true">sdtgssdrsdrtyy
<span class="highlight" contenteditable="false">╚</span>&#8203;asasasarrstssdertrtyrtyrrty
<span class="highlight" contenteditable="false">☻</span>&#8203;aaaaaaaaaaaaaadaafsdsf4n</div>

希望对你有所帮助。

【讨论】:

  • 为您找到的解决方案准备,但尝试复制并粘贴 ASCI char,然后从 asci char 旁边开始输入,它将突出显示所有 char i 类型...您有任何解决方案吗? !
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-14
  • 2020-11-12
  • 2023-03-19
  • 2012-02-08
  • 1970-01-01
  • 1970-01-01
  • 2010-11-29
相关资源
最近更新 更多