Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.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 使用textangular记录并恢复contenteditable div中插入符号的位置_Javascript_Html_Cursor_Contenteditable_Cursor Position - Fatal编程技术网

Javascript 使用textangular记录并恢复contenteditable div中插入符号的位置

Javascript 使用textangular记录并恢复contenteditable div中插入符号的位置,javascript,html,cursor,contenteditable,cursor-position,Javascript,Html,Cursor,Contenteditable,Cursor Position,我已经看到了很多代码片段,详细介绍了如何在contenteditable div中获取和设置插入符号位置,但在我的示例中,我无法使其工作: 我使用的是所见即所得文本编辑器(textAngular)。我已经为用户提供了在光标位置插入交叉引用的功能。他们单击一个按钮,打开一个对话框供他们选择,然后在当前光标位置插入一个html节点 光标的位置可以在div内的子节点内,例如p标记和/或其他格式标记 我的问题是,当对话框获得焦点时,当前光标位置丢失。在打开对话框之前,我曾尝试将插入符号位置(节点和偏移量

我已经看到了很多代码片段,详细介绍了如何在contenteditable div中获取和设置插入符号位置,但在我的示例中,我无法使其工作:

我使用的是所见即所得文本编辑器(textAngular)。我已经为用户提供了在光标位置插入交叉引用的功能。他们单击一个按钮,打开一个对话框供他们选择,然后在当前光标位置插入一个html节点

光标的位置可以在div内的子节点内,例如p标记和/或其他格式标记


我的问题是,当对话框获得焦点时,当前光标位置丢失。在打开对话框之前,我曾尝试将插入符号位置(节点和偏移量)存储在内存中,但无论我尝试什么,插入符号位置都会返回到div的开头。我尝试了stackoverflow上可以找到的所有代码片段,但都不起作用。我想我遗漏了什么。

编辑:再想一想,你的问题可能是当你点击按钮时,可编辑的内容失去了焦点,因此选择丢失了。我们在textAngular中处理这个问题:
toolElement.attr('unselectable','on')

最好的解决方案是使用rangy,而不是自己滚动(textAngular ^1.3.0中需要)

您可能被否决了,因为这与内容可编辑内容中有关“保存和恢复”插入符号位置的问题非常相似,例如

对于textAngular,我们已经多次处理了这个问题,并且在TA(textAngular)工具栏工具中内置了一些快捷方式和帮助程序。 请查看此处的任何问题:

如果您有特定于TA的问题,通常最好查看github存储库中的500多个问题。很可能以前也尝试过类似的方法。

从这个答案:

根据您的用例进行修改。按下组合键
ctrl+i
时,会出现一个弹出窗口。您与弹出窗口交互并按下关闭按钮,然后光标位置将返回到其原始位置

没有任何其他代码,这就是我必须继续下去的原因。
我使用jquery来减少编写示例的冗长,但在没有jquery的情况下也可以这样做

函数getRestorePosition(上下文){ var selection=window.getSelection(); var range=selection.getRangeAt(0); range.setStart(上下文,0); var len=range.toString().length; 返回函数restore(){ var pos=getTextNodeAtPosition(上下文,len); selection.removeAllRanges(); 变量范围=新范围(); 范围设置开始(位置节点、位置位置); 选择。添加范围(范围); } } 函数getTextNodeAtPosition(根,索引){ var lastNode=null; var treeWalker=document.createTreeWalker(根、节点过滤器、显示文本、函数下一步(elem){ if(index>elem.textContent.length){ 索引-=elem.textContent.length; lastNode=elem; 返回NodeFilter.FILTER\u拒绝 } 返回NodeFilter.FILTER\u接受; }); var c=treeWalker.nextNode(); 返回{ 节点:c?c:根, 职位:c?索引:0 }; } $('[contenteditable=“true”]')。在('keydown',函数(e)上{ 如果(e.ctrlKey&&e.which==73){ var popup=$(“#popup”); var restore=getRestorePosition(即目标); popup.show(); popup.find('button').one('click',function(){ popup.hide(); 恢复(); }); e、 预防默认值(); 返回false; } });
#弹出窗口{
位置:绝对位置;
背景色:rgba(100100,0.8);
左:0px;
右:0px;
底部:0px;
顶部:0px;
显示:无;
颜色:白色;
文本对齐:居中;
填充:0px;200px;
字号:3em;
}
[contenteditable=“true”]{
边框:1px纯色灰色;
填充:20px;
字号:2em;
}

如果一只土拨鼠能扔木头,它能扔多少木头
一只美洲旱獭能扔的木头和一只美洲旱獭能扔的木头一样多
关闭
我可以看出,这项提案已经被否决。很可能人们对这个问题不太清楚,或者我可能遗漏了一些明显的东西,所以如果是这样的话,请在这里留下评论,我会纠正它。如果你觉得这个问题已经得到了回答,那么请告诉我答案,我将删除这个问题。没有理由就简单地否决它是无济于事的。