【问题标题】:strange behavior of html tags inside contenteditable divcontenteditable div中html标签的奇怪行为
【发布时间】:2013-05-08 15:55:36
【问题描述】:

在我的项目中,我尝试将 HTML 标记字母(<>)动态添加到 contenteditable div。每当用户按下字母数字字符时,我都会附加一个空的 span 元素,用于计算插入符在 contenteditable div 中的位置。

问题是当我输入一些类似以下的词时:

when <

然后按b 之类的字母数字字符(它调用一个函数来附加一个span 元素),contenteditable div 只显示when 而不是when &lt;b

当我检查元素时,我发现 contenteditable div 有以下内容:

when <b<span class="spanPos"></b<span>
                              ^  strange that span is holding '</b' instead of being empty

这是一个例子JSFiddle

我不确定这是怎么发生的。请告诉我应该怎么做才能避免这个问题。

PS:这里我尝试添加&lt;&gt;,而不是像&lt;b&gt;&lt;/b&gt; 这样的HTML 元素。

【问题讨论】:

    标签: javascript jquery cross-browser


    【解决方案1】:

    问题实际上是,每当用户在 contenteditable div 中键入内容以获取插入符号的位置时,我都会在文本中附加一个 span 元素。像这样的

    Hello I am he|re
                 ^ Caret position
    

    然后我使用.html() 在该文本之间添加一个span 元素,类似这样

    Hello I am he<span></span>re
    

    现在,每当我添加任何代表 Html 的字母(如 &lt;&gt;)时,它都会合并跨度内的一些文本(如我在上面的帖子中所示)。

    所以,当我通过span 元素获得位置后,我通过删除它来解决它。我按照以下步骤为用户按下的每个字母解决了这个问题。

    //Store the .text() in a variable.
    //Replace Html letters inside the contenteditable div with alphabets which has same width. (for exact positioning).
    //add span to the modified text through .html()
    //get the offset position of the span 
    //Do something with that offset position
    //Remove span
    //Replace the .text() inside the contenteditable div with the text which was stored in a variable.
    

    我做了很多事情来解决这个问题,因为我在项目代码中的其他任何地方都使用了.text()。如果我把它改成.html(),那我肯定重写了完整的代码,也可能无法完成项目。

    显然,我无法完成其他回复帖子中提到的事情。我希望这会对某人有所帮助。

    【讨论】:

      【解决方案2】:

      我访问了您的代码,发现 JS 中有一个 &lt;b 不知道您是否在使用它。

      使用下面的代码:

      $('#btnContent').click(function(){
          $('#content').html("when" + "<span class='spanPos'></span>");
      });
      

      通过删除&lt;b 标签,您将不会得到这个。或者您应该适当地靠近它以使代码正确。

      已编辑:

      访问您的新代码后,我得到了解决方案,您应该使用以下代码:

      $('#btnContent').click(function(){
          $('#content').html("when &lt;b");
          $('#content').html($('#content').html()  + "<span class='spanPos'></span>");
      });
      

      如果您需要详细信息,请告诉我。

      【讨论】:

      • 我正在使用&lt;b,因为我需要这样做。请再次阅读问题。
      • 您的陈述是正确的,但第三行中的.text() 是必要的。这就是我遇到这个问题的原因。有什么解决办法吗?
      • @Mr_Green 为什么你想要 .text() 这个标签你不能得到 html 部分,这就是为什么你不能得到 &lt;b 标签。
      【解决方案3】:

      正如您所说,您正在尝试添加一个可以解释为 HTML 的符号。您需要对其进行转义或使用不同的方式将其表示为 ISO 实体:

      $('#btnContent').click(function(){
          $('#content').html("when &lt;b" + "<span class='spanPos'></span>");
      });
      

      http://jsfiddle.net/Dekku/jXeVW/1/

      【讨论】:

      • 我以前试过这个。它不起作用。 (不是在小提琴中,而是在我的项目中,也许问题是别的)。谢谢,我会检查的。 :)
      • 不客气。然后,您可以尝试在另一个小提琴上重现该问题。也许它会帮助你理解和解决问题。
      • 请检查这个小提琴。这就是我的项目中实际发生的事情。jsfiddle.net/nPt6B/3
      • 由于text() 返回未转义的&lt;,并且html() 不会将其转义(文本会),因此您又回到了起点。在这种情况下,使用$().append() 添加跨度会更简单。
      • 我应该清楚地解释这个问题。问题是用户在 contenteditable div 的任何地方都输入了一个字母。所以,这里没有办法使用 append 。我不能使用html 代替text,因为还有许多与text 相关的功能正在发生。无论如何,感谢您的帮助。 :) 如果您想提出任何建议,请给它 :) 我迫切需要它。
      猜你喜欢
      • 1970-01-01
      • 2018-08-19
      • 1970-01-01
      • 1970-01-01
      • 2012-01-07
      • 2020-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多