window.getSelection “reselect”/“refresh”
我尝试为可编辑的html元素构建工具栏。我的工具栏带有"粗体","斜体"等。
选择用户的任何文本并单击"粗体"时,我检查是否存在跨度,如果没有,则插入。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | let hasWrap = (selectionObject.node==='SPAN'); if(!isBold){ this.addClassToSelection('bold', !hasWrap, selectionObject); } addClassToSelection(className, wrapSpan = false, selectionObject = {}){ if(wrapSpan){ let wrapper = document.createElement('SPAN'); wrapper.className = className; wrapper.textContent = selectionObject.text; selectionObject.range.deleteContents(); selectionObject.range.insertNode(wrapper); }else{ let selection = window.getSelection(); selection.anchorNode.parentNode.classList.add(className); } |
} ??
它有效。如果用户取消选择文本并再次选择,它也可以完美地发挥作用。
但是当用户添加粗体(并且js插入span元素),然后再次单击"粗体"以删除粗体时。系统未检测到" span"元素,因为仍然记得旧的
我已经尝试过直接使用
但我仍然看到" p"或" div"作为父节点。再次选择此文本后,将显示" span"。
如何"重新选择"此文本以检测跨度但没有用户操作。
我想要什么
我在ES6中使用React,我想使用没有jQuery的普通js(wrap,unwrap)。
1 | Make bold with Ctrl+b |
使用
HTML
1 | Some Text |
JS-需要自定义事件处理时
1 | document.execCommand('bold',false,true); |
在此处查看命令列表:https://developer.mozilla.org/en-US/docs/Web/API/Document/execCommand
和此处的"使用方法":http://codepen.io/netsi1964/full/QbLLGW/