I found a good rich text editor wangEditor on github yesterday. The name is written by a Chinese person. Fortunately, this editor supports IE6, and the most important point is that it can still insert pictures at the original position after losing focus on IE6, 7, and 8, and the amount of code is very small. So I was very curious to see how it was made, and cut it a bit, that’s all
var currentRange,_parentElem,supportRange = typeof document.createRange === 'function'; function getCurrentRange() { var selection, range, txt = $('editor'); if(supportRange){ selection = document.getSelection(); if (selection.getRangeAt && selection.rangeCount) { range = document.getSelection().getRangeAt(0); _parentElem = range.commonAncestorContainer; } }else{ range = document.selection.createRange(); _parentElem = range.parentElement(); } if( _parentElem && (avalon.contains(txt, _parentElem) || txt === _parentElem) ){ parentElem = _parentElem; return range; } return range; } function saveSelection() { currentRange = getCurrentRange(); } function restoreSelection() { if(!currentRange){ return; } var selection, range; if(supportRange){ selection = document.getSelection(); selection.removeAllRanges(); selection.addRange(currentRange); }else{ range = document.selection.createRange(); range.setEndPoint('EndToEnd', currentRange); if(currentRange.text.length === 0){ range.collapse(false); }else{ range.setEndPoint('StartToStart', currentRange); } range.select(); } }
This is much smaller than the package taken from kindeditor in the previous article , and it looks clear at a glance.
How to use it
function insertImage(html){ restoreSelection(); if(document.selection) currentRange.pasteHTML(html); else document.execCommand("insertImage", false,html); saveSelection(); } avalon.bind($('post_input'),'mouseup',function(e){ saveSelection(); }); avalon.bind($('post_input'),'keyup',function(e){ saveSelection(); });
The example in wangEditor is to insert external link pictures, and only one picture can be inserted at a time. The source code of wangEditor uses document.execCommand("insertImage", false,html);. But there is a problem with this method, that is, in IE6, 7, and 8, if you want to insert multiple pictures, only one picture will be inserted at the original position.
Comment out the if first
containing the image address.
ie6