JS queryCommandState(“上标”)总是返回false

时间:2014-12-24 16:34:10

标签: javascript wysiwyg contenteditable

document.queryCommandState("superscript"); //always return false
document.queryCommandState("bold"); // works fine

如何在contentEditable元素中检测sub或sup?

1 个答案:

答案 0 :(得分:0)

我知道我迟到了,但出于记录目的,我想我会回复它:

这很可能与<sub /> / <sup />元素的样式有关。 在@ tim-down的示例中,正在使用默认样式。我更新了小提琴(http://jsfiddle.net/alarie/vzxh3818/)以使用某些样式,然后queryCommandState将返回false。 (在这种情况下,它实际上是打破它的vertical-align: baseline;属性)

规范实际上包含了关于如何根据有效命令值确定状态的说明:

  

注意[有效命令值]在逻辑上有点像CSS计算或解析值,   事实上,对于大多数命令,它与CSS解析值相同   (参见算法结束)。我们需要一个单独的概念   由于某种原因我们不能依赖CSS的命令:createLink和   unlink根本不是CSS相关的,backColor和hiliteColor需要   特殊待遇因为背景颜色不是遗传的   property,subscript和superscript依赖于<sub> / <sup>而不是CSS   vertical-align,删除线和下划线不映射到唯一   CSS属性。

     

来源:https://w3c.github.io/editing/execCommand.html#assorted-inline-formatting-command-algorithms

这是上标/下标的实际算法(来自同一规范):

  
      
  1. 受下标影响   并受上标影响,最初是两个布尔变量   假。
  2.   
  3. 虽然node是内联节点:

         
        

    注意Firefox 6.0a2会忽略     为此目的垂直对齐,只关心和     标记自己。 Opera 11.11是类似的,实际上就像那样     即使是像粗体这样的命令。该规范最初遵循Chrome 14     dev,主要是因为WebKit本身会产生跨度     vertical-align sub或super,我们想要正确处理它们。     然而,Ryosuke告诉我,WebKit在这里的行为被视为一个     bug,所以我把它改成了Gecko / Opera。

      
         

    如果node是sub,则受下标影响的设置为true。&lt; - 这是chrome / webkit行为不正确的地方

  4.   
  5. 否则,如果node是sup,则受上标的设置为true。组   节点到其父节点。如果受下标影响并受其影响   上标都是true,返回字符串“mixed”。如果受到影响   下标为真,返回“下标”。如果受上标影响   是的,返回“上标”。返回null。

  6.   

所以现在的解决方案是1)不要乱用风格,或者更确切地说2)自己做检查。