原生API编写简单富文本编辑器002

1. 为功能按钮添加点击事件

我们在index.js 中为所有功能按钮添加点击事件监听,在点击对应按钮时执行相应的原生命令。

  1. window.onload= function() {
  2. const btns = document.getElementById('editorBar').getElementsByTagName('li');
  3. for (let i=0; i<btns.length; i++) {
  4. const btn = btns[i];
  5. const command = btn.getAttribute('command');
  6. btn.onclick= function() {
  7. document.execCommand(command, false, '');
  8. };
  9. }
  10. };

然后我们回到页面中进行点击,会发现除了重做和撤销,其它按钮都不起作用,哪怕我们在可编辑区域输入文字,选择一段文字,然后点击按钮,也是没有任何效果。(可在1.0.2分支复现)

原因是:

document.execCommand 命令只有使用button元素触发才能生效。

2. 改造HTML

所以,我们改造一下HTML,将按钮全部改为button元素:

  1. <!--> index.html <-->
  2. <ul>
  3. <li><button command="undo"><i class="iconfont icon-chexiao" title="撤销"></i></button></li>
  4. <li><button command="redo"><i class="iconfont icon-zhongzuo" title="重做"></i></button></li>
  5. <li><button command="copy"><i class="iconfont icon-fuzhi" title="复制"></i></button></li>
  6. <li><button command="cut"><i class="iconfont icon-jianqie" title="剪切"></i></button></li>
  7. <li><button command="fontName"><i class="iconfont icon-ziti" title="字体"></i></button></li>
  8. <li><button command="fontSize"><i class="iconfont icon-zihao" title="字号"></i></button></li>
  9. <li><button command="bold"><i class="iconfont icon-zitijiacu" title="加粗"></i></button></li>
  10. <li><button command="italic"><i class="iconfont icon-zitixieti" title="斜体"></i></button></li>
  11. <li><button command="underline"><i class="iconfont icon-zitixiahuaxian" title="下划线"></i></button></li>
  12. <li><button command="strikeThrough"><i class="iconfont icon-zitishanchuxian" title="删除线"></i></button></li>
  13. <li><button command="superscript"><i class="iconfont icon-zitishangbiao" title="上标"></i></button></li>
  14. <li><button command="subscript"><i class="iconfont icon-zitixiabiao" title="下标"></i></button></li>
  15. <li><button command="fontColor"><i class="iconfont icon-qianjingse" title="字体颜色"></i></button></li>
  16. <li><button command="backColor"><i class="iconfont icon-zitibeijingse" title="字体背景色"></i></button></li>
  17. <li><button command="removeFormat"><i class="iconfont icon-qingchugeshi" title="清除格式"></i></button></li>
  18. <li><button command="insertOrderedList"><i class="iconfont icon-youxuliebiao" title="有序列表"></i></button></li>
  19. <li><button command="insertUnorderedList"><i class="iconfont icon-wuxuliebiao" title="无序列表"></i></button></li>
  20. <li><button command="justifyLeft"><i class="iconfont icon-juzuoduiqi" title="局左对齐"></i></button></li>
  21. <li><button command="justifyRight"><i class="iconfont icon-juyouduiqi" title="居右对齐"></i></button></li>
  22. <li><button command="justifyCenter"><i class="iconfont icon-juzhongduiqi" title="居中对齐"></i></button></li>
  23. <li><button command="justifyFull"><i class="iconfont icon-liangduanduiqi" title="两端对齐"></i></button></li>
  24. <li><button command="createLink"><i class="iconfont icon-charulianjie" title="插入链接"></i></button></li>
  25. <li><button command="unlink"><i class="iconfont icon-quxiaolianjie" title="取消链接"></i></button></li>
  26. <li><button command="indent"><i class="iconfont icon-shouhangsuojin" title="首行缩进"></i></button></li>
  27. <li><button command="insertImage"><i class="iconfont icon-tupian" title="插入图片"></i></button></li>
  28. </ul>

3. 改造CSS

由于将原来的元素上套了一层button元素,所以样式与我们最初设计的有了出入:

富文本编辑器开发系列10——原生API编写简单富文本编辑器002 - 图1

我们通过为button元素增加CSS规则来修复:

  1. /**index.css **/
  2. .editor-toolbar ul li button {
  3. background-color: #fff;
  4. border: none;
  5. cursor: pointer;
  6. }

4. 改造 JS

我们将点击事件监听加在button上,以代替原来的li上的监听:

  1. // index.js
  2. const btns = document.getElementById('editorBar').getElementsByTagName('button');

然后,我们再在页面可编辑区域输入文本,并点击功能按钮,可以得到以下结果:(可在1.0.3分支上复现)

  • 撤销、重做功能正确;
  • 复制、剪切、粘贴功能正确(其中粘贴时直接使用Ctrl+v
  • 字体、字号、前景色、背景色、插入链接、取消链接按钮点击无反应
  • 加粗、斜体、下划线、删除线、上标、下标、清除格式在有选中文本时执行正确
  • 有序列表、无序列表、左对齐、右对齐、居中对齐、两端对齐 、首行缩进对光标所在行起作用
  • 插入图片点击后会在光标处添加一个空的img标签,表现在页面上是两个空格

富文本编辑器开发系列10——原生API编写简单富文本编辑器002 - 图2

富文本编辑器开发系列10——原生API编写简单富文本编辑器002 - 图3

我们看到,上面的测试结果中,还有很多功能是没有反应的,这是因为这些功能都是需要参数的,我们下一节将实现它们。