使用font-family,font-size和color </li>设置内容可编辑列表(<li>)

时间:2012-05-10 19:25:58

标签: javascript html css html5 contenteditable

我正在寻找一种样式列表的方法,以便他们在contentEditable元素中编辑时使用用户设置的格式。具体来说,我希望能够以与<li>内容的其余部分相同的方式设置数字/项目符号的样式。

从我完成的测试开始,浏览器永远不会直接设置<li>标记(实际上控制数字/项目符号的样式),但总是放置<font>标记(或{{1} } if <span>)作为第一个子节点,使用它进行格式化。我已经尝试了一些想法来解决这个问题,但还没有找到成功:

1。以编程方式将样式应用于StyleWithCSS

在这里,我尝试侦听“DOMNodeInserted”,当一个<li>标记插入DOM时,我查询了当前的<li>fontNamefontSize命令,将它们作为内联样式应用于foreColor

<li>

即使这样做,只要您开始在列表项中输入内容,浏览器就会尝试“智能”并从textarea.addEventListener('DOMNodeInserted', function (evt) { if (evt.target.nodeName === 'LI') { evt.target.style.color = queryCommandValue('foreColor'); evt.target.style.fontFamily = queryCommandValue('fontName'); evt.target.style.fontSize = queryCommandValue('fontSize'); } }, false); 中删除样式,将它们放入<li>(或<font>)标记。 :(

2。为要插入StyleSheet的样式创建规则

根据上面的尝试,我不是内联编写样式,而是为它们创建了一个规则,为<span>节点提供了一个ID,并将规则插入到样式表中。现在规则将管理<li>的样式,我可以使用CSSOM不断更新任何特定的<li>样式。

这似乎工作得很好(有一些bug需要解决),但是,它完全打破了contentEditable撤销堆栈。由于撤消命令仅与<li>和其他格式化命令相关联,因此无法“撤消”您在样式表中设置的样式。 (至少不是很直观,我已经考虑过如何做到这一点......)

3。观察textContent属性的变化并保留它们

对于此尝试,我使用了DOM级别4中可用的新可用MutationObserver http://www.w3.org/TR/dom/#mutationobserver。此观察者可以监视节点属性的更改,这些更改将在MutationRecord中传回。它甚至可以保存以前的属性值,包括<li>值,这样我就可以找出被删除的内容并重新应用它。

style

这仍然缺乏撤消支持。您将撤消其他格式更改,但var observer = new WebKitMutationObserver(function(mutations) { mutations.forEach(function(mutation) { if (mutation.target.nodeName === 'LI') { ... } }) }); observer.observe(document, { attributes: true, subtree: true, attributeOldValue: true }); 将保留其样式。

那里有什么新奇的想法?现代浏览器解决方案也受到欢迎。我知道我可以格式化我自己的HTML以用于列表,但我试图看看是否可以使用标准<li>insertOrderedList命令来完成这些命令。

** 2012年11月7日更新**

看起来没有人解决过这个问题,这里有一个JSFiddle示例,看看我在描述什么:http://jsfiddle.net/8LyZR/。只是尝试更改项目符号列表或编号列表的样式。

对于我正在进行的项目,我们正在使用我们自己的WebKit构建,因此我们能够通过本机更改来修复此问题,但我希望有一种方法(或将是一种方式)直接执行此操作使用HTML / CSS / JS。

1 个答案:

答案 0 :(得分:1)

这是一些有趣的CSS技巧。 http://jsfiddle.net/GZ3cv/

它基本上依赖于在内联标签上放置一个伪元素:before(这将使样式固有),然后尝试将它放在原始列表项目符号/数字的顶部。

我无法决定是否将其称为解决方案,因为嵌套/内联标签(字体,u,b,span,i)的所有不同组合可能会变得不切实际。

但只是玩弄字体,大小,颜色和列表类型的控件,似乎它可以通过一些明显的彻底调整来模仿你所寻找的东西。

我很好奇这种技术是否合理或荒谬:)只是把它扔出去......