Javascript 在contenteditable中下移一行
我有一个content-editable元素,我试图引入一些键命令来在其中移动光标(vim-keybindings)。我正在努力添加基本的上下运动(j&k),这相当于按箭头向上和向下 我尝试过模仿箭头键事件,但还没有成功:Javascript 在contenteditable中下移一行,javascript,contenteditable,prose-mirror,Javascript,Contenteditable,Prose Mirror,我有一个content-editable元素,我试图引入一些键命令来在其中移动光标(vim-keybindings)。我正在努力添加基本的上下运动(j&k),这相当于按箭头向上和向下 我尝试过模仿箭头键事件,但还没有成功: 函数fireKey(编辑器:EditorView,键:String){ 让keyName=''; 开关(钥匙){ 案例“左”: keyName='ArrowLeft'; 打破 案例“up”: keyName='ArrowUp'; 打破 案例“权利”: keyName='Arr
函数fireKey(编辑器:EditorView,键:String){
让keyName='';
开关(钥匙){
案例“左”:
keyName='ArrowLeft';
打破
案例“up”:
keyName='ArrowUp';
打破
案例“权利”:
keyName='ArrowRight';
打破
案例“向下”:
keyName='ArrowDown';
打破
}
让evt=新键盘事件(“按键下降”{
“泡沫”:没错,
“键”:键名,
“代码”:关键字名称,
});
editor.dom.dispatchEvent(evt);
}
(其中编辑是编辑)
我也尝试过只使用标准的可编辑内容,但没有运气:
功能点火钥匙(el,钥匙){
让keyName='';
开关(钥匙){
案例“左”:
keyName='ArrowLeft';
打破
案例“up”:
keyName='ArrowUp';
打破
案例“权利”:
keyName='ArrowRight';
打破
案例“向下”:
keyName='ArrowDown';
打破
}
让evt=新键盘事件(“按键下降”{
“泡沫”:没错,
“键”:键名,
“代码”:关键字名称,
});
el.调度事件(evt);
}
让$editor=document.getElementById(“编辑器”);
$editor.addEventListener('keydown',函数(evt){
console.log(“键关闭”,evt.Key);
如果(evt.key='j'){
fireKey($editor,'down');
evt.preventDefault(真);
}
else if(evt.key==“k”){
fireKey($editor,'up');
evt.preventDefault(真);
}
});代码>
试验
测试2
测试3
在本机控件上触发自己的事件不会触发它们上的任何操作。事件是发生交互的通知,而不是它们的原因
我不认为有任何简单的方法可以做到这一点,除非您完全控制contenteditable的内容并为自己建立索引。Contenteditables似乎没有为execCommand映射任何命令来移动光标,因此也没有运气
明智的是,有大量的配置导致新行,所以如果你想手动处理这个问题,你将不得不考虑很多情况。在获取每个元素的计算样式以确定换行性的同时,您将不断地遍历DOM。我认为这可能比它的价值更麻烦,坚持使用原生箭头键可能是最明智的
我希望我有更好的消息,但我很确定目前没有好的解决方案。我正在考虑为ProseMirror编写一个模式,它将每一行强制放入自己的节点/元素中。这并不理想,因为这意味着我必须手动处理文本换行,但其他工具(如Ace编辑器)似乎就是这样做的。