马黑黑 发表于 2023-1-15 12:35

不明白为什么execCommand被废弃

本帖最后由 马黑黑 于 2023-1-15 12:37 编辑

MDN正式废弃 execCommand API 早已是板上钉钉的事实。不过,浏览器要废弃 execCommand 却不会那么容易,直至今日,主流现代浏览器都还在完美支持 execCommand API。

实际上,在线富文本编辑器基本都基于 execCommand 实现一些特定的常规功能,诸如复制、粘贴、插入,使用 execCommand 都能够轻松完成。MDN宣布废弃 execCommand 之后,主流浏览器很快就推出了自己的完美替代方案,同时在浏览器里保留对 execCommand 的全方位支持。

execCommand好像也一直没能进入w3c标准,只因各浏览器对它的支持方面给力,它才如此大放异彩。当然,这也与其功能有关 :该API虽然功能不齐全、可定制性不高,但很实用。以给 textarea 插入文本为例,看看我刚写好的插入文本函数:

let insertStr = (el,str) => {
      if (!str) return;
      el.focus();
      document.execCommand('insertText', false, str);
};


函数需要两个参数,el 是编辑框,txt 是要插入的文本。函数先判断要插入的文本是否为空,如是,不执行后面的语句。接着函数令编辑框获得焦点,这个动作要做,因为 execCommand 命令是基于 document 而不是基于具体对象的,它只会往获得焦点的可编辑元素塞东西。最后用 execCommand 命令的 insertText 指令(插入文本指令),插入 str(字串变量)。execCommand需要三个参数,中间的参数是布尔参数。

这就可以了。

textarea 也有自己的插入文本命令,setRangeText(text),用起来并不比execCommand复杂。遗憾的是,用 setRangeText(text) 插入的内容没有撤销功能,而用 execCommand 插入的东东可以无限撤销。仅从这一点看,我个人就偏爱 execCommand 命令,可惜它被遗弃了。

在花潮lrc歌词制作程序里,里面的复制功能用的是execCommand,工作状态没问题的,浏览器除IE外都会支持。

下楼给出 execCommand 插入文本的示例。

马黑黑 发表于 2023-1-15 12:36

<textarea id="txtbox" rows="16" cols="60">文本</textarea>
<p><br><button id="btn">插入</button> <input id="insertbox" type="" /></p>

<script>

let insertStr = (el,str) => {
        if (!str) return;
        el.focus();
        document.execCommand('insertText', false, str);
};

btn.onclick = () => insertStr(txtbox, insertbox.value);

</script>

红影 发表于 2023-1-15 17:03

我连MDN是什么都不知道,后面的也看得云里雾里。这个是黑黑给自己的吧,太高深了点{:4_173:}

马黑黑 发表于 2023-1-15 17:15

红影 发表于 2023-1-15 17:03
我连MDN是什么都不知道,后面的也看得云里雾里。这个是黑黑给自己的吧,太高深了点

MDN是开发在线文档,它依据w3c标准组织其文档

红影 发表于 2023-1-15 21:51

马黑黑 发表于 2023-1-15 17:15
MDN是开发在线文档,它依据w3c标准组织其文档

还是不太懂,从来没用过{:4_173:}

马黑黑 发表于 2023-1-15 22:47

红影 发表于 2023-1-15 21:51
还是不太懂,从来没用过

不是人人都去看它,写程序的就需要了

红影 发表于 2023-1-15 22:59

马黑黑 发表于 2023-1-15 22:47
不是人人都去看它,写程序的就需要了

嗯嗯,这个离我还太远{:4_173:}

马黑黑 发表于 2023-1-16 10:44

红影 发表于 2023-1-15 22:59
嗯嗯,这个离我还太远

{:4_181:}
页: [1]
查看完整版本: 不明白为什么execCommand被废弃