【问题标题】:editable div: text-cursor gets set inside a tag可编辑的 div:文本光标设置在标签内
【发布时间】:2014-02-14 01:40:52
【问题描述】:

我有一个可编辑的 div。该 div 的内容看起来例如像这样:

This is a <ins>new</ins> chapter.

(标签不可见,它们用于样式) 如果您将文本光标设置在“新”前面,一切都很好。但是如果将文本光标设置在“new”后面,则光标在 -tag 内,并且新键入的文本也在 tag 内:

This is a <ins>new and very interesting</ins> chapter.

但它应该是这样的:

This is a <ins>new</ins> and very interesting chapter.

如何将文本光标设置在标签后面并防止新文本写入标签内?

【问题讨论】:

  • 这是一个可用性问题。另一方面,如果有人试图在“new”之后写一些东西,但在 内,他必须在这里写:ne...w,删除最后一个 w,并在“ne”之后写回。所以我认为这没问题。我会考虑如何省略它。你能写出这个“黑客”的应用程序吗?
  • 不,这不是可用性问题。不允许用户在 -tag 内写入。文本框与检查新词和删除词的算法相连。但这里的问题是防止文本光标设置在标签内。
  • +1 表示有趣的问题。下面我的一点帮助。希望对您有所帮助,如果您有任何问题,请随时写。最好的问候。

标签: javascript tags contenteditable


【解决方案1】:

好的。第一个想法是制作

<ins contenteditable="false">new</ins>

在 contenteditable="true" 元素内。进一步阅读 (contenteditable=false inside contenteditable=true block is still editable in IE8) 表明这在 IE 中并不总是被解释得很好。在这篇文章中有一个 hack 答案 (https://stackoverflow.com/a/7522910/1125465) 但我真的不同意。这只是一个错误,可能会在下一个版本的浏览器中修复。

接下来我点击了这个链接 (HTML contenteditable with non-editable islands),但我没有得到好消息。没有办法阻止ins标签编辑这么简单。首先要注意一点:

如果这不是附加功能,您必须确保它可以正常工作。正如您所写的那样不允许用户在 -tag 内写入 ,所以所有选项:

  • 几乎所有浏览器中工作...
  • 正在处理一个错误...
  • 工作但是如果有人...

必须被拒绝。因此,如果有人关闭了 javascript,它也应该可以工作。在这种情况下,我得出了第一个结论(一如既往):服务器端验证必须完成。 这将防止用户破坏您的数据库并做他不能做的事情。

在服务器端验证后(当然,如果出现问题,也会显示通知),这将是附加功能。所以我们现在应该尽我们所能,让它发挥作用(但现在没有义务)。

精彩的讲座:) https://stackoverflow.com/a/7232871/1125465 http://jsfiddle.net/X6Ab8/

**解决方案**

我提出类似...我知道这听起来有点像过去的 milion 标签,但实际上这会奏效并且会很棒。 在 ins 元素之间创建一个额外的 span 元素(例如使用 php:

$text = '<span contenteditable="true">'.$text.'</span>';
str_replace('<ins>', '</span><ins>', $text);
str_replace('</ins>', '</ins><span contenteditable="true">', $text);

使这个 span 可编辑,并且只有这个 span 可编辑(而不是块容器)。就是这样。解决方案简单、干净、效率更高且几乎 100% 安全。而且很好......

使用 javascript hack 时的额外安全性

如果您需要完全使用 javascript 来完成它(也许有人知道怎么做?),为了完全安全,我建议另外这样做:

  1. 将 data-noneditable-id="id" 添加到主块可编辑容器内的每个 non editable 元素。现在每个不可编辑的元素都有自己唯一的 id(可以使用 jQuery 来完成,例如使用选择器 $("div#editable ins"))。
  2. 运行一个 javascript,它将遍历所有具有“data-noneditable-id”属性的对象,并将它们的 innerHTML 保存在数组中(例如:1 => 'new', 2=> 'added', 3=> '插入',...)。
  3. 现在,如果有人编辑其中任何一个,您可以轻松修复它们。

PS。这也应该有点帮助......(https://stackoverflow.com/a/4979828/1125465)。

希望对您有所帮助!最好的问候。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 2019-06-23
    • 1970-01-01
    • 2011-02-24
    相关资源
    最近更新 更多