execCommand() 不会“取消粗体”文本

Posted

技术标签:

【中文标题】execCommand() 不会“取消粗体”文本【英文标题】:execCommand() doesn't "unbold" text 【发布时间】:2015-04-21 07:01:24 【问题描述】:

我制作了自己的 WYSIWYG 文本编辑器。

contenteditable-field 是一个 div,见下面的代码:

<div spellcheck="false" id="textEditorField" contenteditable="true"></div>

按钮事件如下所示:

boldButton.onclick = function() 
    document.execCommand('bold', false, null); 
    return false; 

文本编辑器工作正常。斜体和非斜体文本,强调作品。 但是粗体有一个问题:它加粗了文本,但没有取消粗体。这在 OS X 和 Windows 上的每个浏览器中都有。

我正在使用通过@font-face 导入的自定义字体。

在 css 中我执行以下操作:

b 
    font-family: "Caviar Dreams Bold";
    font-weight: normal;

b i, i b 
    font-family: "Caviar Dreams Bold Italic";
    font-weight: normal;

如果我删除 font-weight 属性,文本将获得字体系列“Caviar Dreams Bold”,并且通过 CSS 使其变为粗体,因此格外粗体。

有一些类似的问题,但没有我可以使用的答案。我还必须注意,我不能为此使用 jQuery。

【问题讨论】:

看起来像 javascript 问题。检查您的 DOM 并查看 是否真的被删除了。如果您需要灵感,我自己在这里创建了一个简单的编辑器github.com/NenadP/biu-editor :) 它看起来像是被删除并立即再次添加。因为在 web-inspector 中它有&lt;b&gt;&lt;/b&gt;。如果我展开此标签,然后尝试取消加粗文本,标签会再次折叠。 这不是一般问题,它是您代码中的特定问题。提供一些 jsfiddle 或 codepen。 最后我让 JSFiddle 工作了,幸运的是这里也存在问题(否则我猜它会更难解决)。这里是jsfiddle.net/ume3t0vp 好的,我明白了问题所在。将在几分钟后发布我的答案。 【参考方案1】:

execCommand('bold'... 按预期工作,即切换标记中文本的周围。问题是您在以下 CSS 类中为 b 标记设置了 'font-weight: normal' 样式。这意味着您明确希望&lt;b&gt; 标记中的文本是正常的,这就是您所得到的。

b 
    font-family: "Caviar Dreams Bold";
    font-weight: normal;

b i, i b 
    font-family: "Caviar Dreams Bold Italic";
    font-weight: normal;

因此,您应该删除此属性,一切正常。

更新:

了解在某些情况下该方法如何“加粗但不能不加粗”非常重要。事实上,execCommand 使一些东西比仅仅围绕文本更聪明。考虑到可能混合使用交叉标签(如&lt;b&gt;&lt;strong&gt; 以及&lt;i&gt;&lt;u&gt; 等),它还对其进行规范化。浏览器算法分析文本样式以了解实际粗体和为什么。当您将粗体重新定义为正常时,可能会导致算法决定:“好的,虽然它在 &lt;b&gt; 标签内,但文本不是粗体,因此没有什么可更改的”并保留标签。

【讨论】:

我没想到execCommand()-算法会这个聪明。你是对的,这就是解决方案。但现在的问题是:由于字体 (Caviar Dreams BOLD) + 字体粗细,设置为粗体的 contenteditable div 中的文本是 extra 粗体。我想最好/唯一的解决方案是给这个 div 的 b-element 字体“Caviar Dreams REGULAR”,这样它看起来很大胆? 是的,这似乎是最正确的解决方案。顺便说一句,你为什么决定使用这种字体?非常适合大尺寸排版,在所见即所得编辑器中,它看起来与像 arial 这样简单和标准的东西没有什么不同...... 谢谢。我会用这个。关于字体?我不知道。我正在学习软件工程,所以我绝对不是设计师。 ;) 我可能会为我正在为课程客户端构建的网站研究一些其他字体(和配色方案)。 如果你想使用花哨的粗体字体,而不是设置系列,然后将字体粗细设置为正常(并破坏 execCommand),你可以改为使用 @font-face 扩展原始字体系列告诉浏览器在字体粗细设置为“粗体”时使用哪种字体。 ***.com/questions/2436749/…

以上是关于execCommand() 不会“取消粗体”文本的主要内容,如果未能解决你的问题,请参考以下文章

从 Makefile 规则打印粗体或彩色文本

如何使用 Javascript 获取选定文本中的所有 HTML 选择标签?

Android - 粗体标签似乎不会影响 Strings.xml 中的 URL 文本 [重复]

如何使用 AngularJS 实现粗体的非粗体功能

Webbrowser控件execcommand参数详解

非粗体文本占据粗体文本的空间[重复]