处理 contenteditable="true"
输入框时,如果由别的地方拷贝内容过来粘贴时,经常会连带各种格式一起粘贴进来,使用 js 如何实现去格式粘贴呢?。
去格式粘贴解决方案:
实现思路:先给编辑节点绑定 onpaste 事件,在里面实现去格式,即:document.getElementById('myEditor').onpaste = function (event) {}
;然后,判断如果是支持使用 var text = event.clipboardData.getData('text/plain')
获取纯文本及使用 document.execCommand('insertText', false, text);
直接把文本粘贴进去,则直接 OK;若不支持的话,则需要通过 prompt('请在这里粘贴文本', '')
提示输入框,让用户先把内容粘贴进去 prompt 输入框(自动去格式),然后创建选区 document.selection
或者 window.getSelection
把内容插入到选区。详细代码如下:
document.getElementById('myEditor').onpaste = function (event) { var e = event || window.event; e.preventDefault(); e = e.originalEvent || e; var text = e.clipboardData ? e.clipboardData.getData('text/plain') : prompt('请在这里粘贴文本', ''); if (e.clipboardData) { // 支持直接 clipboardData,则直接 OK document.execCommand('insertText', false, text); } else { // 不支持则取用户在 prompt 提示输入框粘贴的内容(自动去格式的) var sel, textRange; try { document.execCommand("ms-beginUndoUnit", false, null); // 开始给 IE 增加撤回功能 } catch (e) { } if (document.selection) { // IE9以下支持:document.selection textRange = document.selection.createRange(); textRange.text = text; textRange.collapse(false); // 取消选择 textRange.select(); // 重新选择 } else if (window.getSelection) { // IE9以上、Firefox、Safari、Chrome和Opera支持:window.getSelection() sel = window.getSelection(); var range = sel.getRangeAt(0); range.deleteContents(); // 删除 range 的内容 var textNode = document.createTextNode(text); range.insertNode(textNode); // 向 range 插入 text 节点 range.selectNodeContents(textNode); // 选中 text 节点 sel.removeAllRanges(); // 删除选区中所有的 range sel.addRange(range); // 向选区增加刚才处理后的 range(只含 text 节点) } try { document.execCommand("ms-endUndoUnit", false, null); // 结束给 IE 增加撤回功能 } catch (e) { } } }
参考引用:
https://stackoverflow.com/questions/20124212/internet-explorer-alternative-to-document-execcommandinserttext-for-tex/20340618#20340618
https://www.cnblogs.com/qingqingzou-143/p/6702535.html