Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在contenteditable中下移一行_Javascript_Contenteditable_Prose Mirror - Fatal编程技术网

Javascript 在contenteditable中下移一行

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

我有一个content-editable元素,我试图引入一些键命令来在其中移动光标(vim-keybindings)。我正在努力添加基本的上下运动(j&k),这相当于按箭头向上和向下

我尝试过模仿箭头键事件,但还没有成功:

函数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编辑器)似乎就是这样做的。