1

CKEditor 的默认删除线功能运行良好并且符合逻辑,在带有删除线的文本周围添加一个“s”标签(我也可以让编辑器使用 html5 的“del”标签),但是问题是辅助阅读技术如因为 NVDA 或 JAWS 在没有特殊设置的情况下不会以任何不同于普通文本的方式阅读此类内容。我要做的是在删除线文本的开头和结尾添加一个跨度标签,向用户表明这一事实:

<p>
    <span style="height: 1px; width: 1px; position: absolute; overflow: hidden; top: -10px;">Start strikethrough. </span>
    <s>Text with strikethrough</s>
    <span style="height: 1px; width: 1px; position: absolute; overflow: hidden; top: -10px;">End strikethrough. </span>
</p>

正如您在此代码中看到的那样,跨度在页面中不可见,但阅读器将遵循 dom 顺序,因此将提醒用户注意删除线。我知道您可以构建一个插件来插入任何 html,但我必须使这项工作以与基本样式按钮相同的方式工作,并具有切换功能:

  • 简单的部分:如果内容中有选择并且按下按钮,我们必须删除内容。这一个更容易,因为我们可以获得选定的 html 并用我想要的包围它。
  • 更难的部分:如果没有选择并且按下按钮,那么接下来写的每个文本都必须有删除线。

经过大量研究和分析“真正的”插件是如何制作的,我得出了这样的结论:

CKEDITOR.plugins.add( 'customStrike', {
    icons: 'customStrike',
    init: function( editor ) {
        var style = new CKEDITOR.style( { element: 's' } );

        editor.attachStyleStateChange( style, function (state) {
            !editor.readOnly && editor.getCommand( 'customStrike').setState(state);
        } );

        editor.addCommand( 'customStrike', new CKEDITOR.styleCommand( style ) );

        if ( editor.ui.addButton ) {
            editor.ui.addButton( 'CustomStrike', {
                label: 'Strike Through',
                command: 'customStrike',
                toolbar: 'custom'
            } );
        }
    }
});

这与真正的插件完全一样,我尝试解决此代码,但据我所知,样式定义中的元素属性只接受一个标签,我需要一种使用元素属性嵌套标签的方法来完成此操作。

有没有办法解决这个问题?

任何帮助,将不胜感激。

4

1 回答 1

0

对我来说,您似乎正在尝试解决问题的错误结局。读者的问题是他们阅读内容的方式不同。破坏内容可能会有所帮助(尽管它会破坏编辑),但当读者更新并开始正确阅读内容时就会出现问题。

无论如何,如果你坚持现在有一些解决方案,那么我有两个建议:

  • 您可以在s/del标签上设置一些 ARIA 角色或其他属性,这会以某种方式影响读者。
  • 不要破坏编辑器内的内容,因为你会破坏它。例如,如果这是您要修复的部分,您可以在将内容发送给最终用户之前对其进行处理。
于 2014-10-25T12:32:06.657 回答