我有一些文本div和contenteditable =“true”.当我单击这个div – 工作一些我的脚本时,它不是很重要.当我双击这个div时 – 需要编辑div中的文本.编辑文本只需要在双击之后,而不是单次之后.而且非常重要,当我双击div时 – 插入符号需要留在鼠标光标下.不需要选择文字.我发现了一些单/双脚本.但有问题.当我双击div – 文本是选择.选择没有必要.需要我点击的编辑器插入符号.我不明白怎么做.
http://jsfiddle.net/X6auM/
http://jsfiddle.net/X6auM/
解决方法
每个当前的主要浏览器都提供了一个API来创建鼠标事件的范围,尽管需要四个不同的代码分支.
这是一些背景:
> https://stackoverflow.com/a/10659990/96100
> https://stackoverflow.com/a/12705894/96100
> Creating a collapsed range from a pixel position in FF/Webkit
这是一个演示:http://jsfiddle.net/timdown/krtTD/10/
这里是一些代码:
- function getMouseEventCaretRange(evt) {
- var range,x = evt.clientX,y = evt.clientY;
- // Try the simple IE way first
- if (document.body.createTextRange) {
- range = document.body.createTextRange();
- range.moveToPoint(x,y);
- }
- else if (typeof document.createRange != "undefined") {
- // Try Mozilla's rangeOffset and rangeParent properties,// which are exactly what we want
- if (typeof evt.rangeParent != "undefined") {
- range = document.createRange();
- range.setStart(evt.rangeParent,evt.rangeOffset);
- range.collapse(true);
- }
- // Try the standards-based way next
- else if (document.caretPositionFromPoint) {
- var pos = document.caretPositionFromPoint(x,y);
- range = document.createRange();
- range.setStart(pos.offsetNode,pos.offset);
- range.collapse(true);
- }
- // Next,the WebKit way
- else if (document.caretRangeFromPoint) {
- range = document.caretRangeFromPoint(x,y);
- }
- }
- return range;
- }
- function selectRange(range) {
- if (range) {
- if (typeof range.select != "undefined") {
- range.select();
- } else if (typeof window.getSelection != "undefined") {
- var sel = window.getSelection();
- sel.removeAllRanges();
- sel.addRange(range);
- }
- }
- }
- document.getElementById("editor").ondblclick = function(evt) {
- evt = evt || window.event;
- this.contentEditable = true;
- this.focus();
- var caretRange = getMouseEventCaretRange(evt);
- // Set a timer to allow the selection to happen and the dust settle first
- window.setTimeout(function() {
- selectRange(caretRange);
- },10);
- return false;
- };