日 | 一 | 二 | 三 | 四 | 五 | 六 |
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
[复位日记]
网站统计
·今日访问 : 224
·页面点击 : 232
·当前在线 : 1
2023年12月12日 星期二[阅读 178]
在 contenteditable 的元素中强制P标签的实现思路之一是,监听回车键按下事件,阻止默认行为,加入预设字符:
- event.preventDefault();
- document.execCommand('insertHTML', false,'<p><br></p>');
这就可以了。不过,当插入有序、无序列表,情况就略微复杂一些,比如Chromium浏览器会使用DIV标签,所以还有很多工作要做:
- myDiv.onkeydown = (event) => {
- let selection = window.getSelection();
- let range = selection.getRangeAt(0);
- let currentNode = range.startContainer.parentElement;
- let tagName = currentNode.tagName.toLowerCase();
- if(event.key === 'Enter') {
- if(['ol','ul'].includes(tagName)) {
- event.preventDefault();
- let li = currentNode.children;
- if(li.length > 0) currentNode.removeChild(li[li.length - 1]);
- document.execCommand('insertHTML', false,'<p><br></p>');
- }else{
- document.execCommand('formatBlock',false,'<p><br></p>');
- }
- }
- }
这里,通过 myDiv 键位按下事件,获取选区和范围,从中得到当前节点,然后判断节点名如果为 ol 或 ul,就拦截浏览器默认加标签的行为,该行为会清除最后一个空的li标签,阻止了空的li标签不会被清除,所以还需将其清除掉,最后加入预设加了br节点的P标签。而常规的回车事件则正常加入P标签即可。
这里还没有考虑 Ctrl+Enter 的情况,按这个组合键应被排除在外。
发表评论: