wangEditor编辑器失去焦点后仍然可以在原位置插入图片分析


Posted in Javascript onMay 06, 2015

昨天在github上发现了一个很好的富文本编辑器wangEditor,一看名字就是中国人写的。这个编辑器好在支持ie6+,另外最重要的一点,它在ie6,7,8上都可以做到失去焦点后仍然可以在原位置插入图片,而且代码量很少。于是很好奇的看看它是怎么做的,裁剪了一下,就这些

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();
    }
  }

这可比上一篇里面的那个从kindeditor扒下来的封装少太多了,而且看起来也是一目了然。

怎么用呢

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();
  });

和上一篇里面一样,必须要对编辑器的div进行keyup,mouseup绑定,以便保存selection,range,方便在失去焦点后仍然可以在原来位置插入图片。调用的时候直接insertImage(html)就可以了。这里用的不是iframe,是div contenteditable=true.

wangEditor里面的例子是插入外链图片,一次只能插入一张图片。wangEditor源码统一用的是document.execCommand("insertImage", false,html);。但是这个方法有个问题,就是在ie6,7,8中,如果要插入多张图片的话,只会在原来位置插入一张图片。

先把if注释掉

wangEditor编辑器失去焦点后仍然可以在原位置插入图片分析

一次插入两张图片

wangEditor编辑器失去焦点后仍然可以在原位置插入图片分析

这次严谨点,ie6

wangEditor编辑器失去焦点后仍然可以在原位置插入图片分析

ie7

wangEditor编辑器失去焦点后仍然可以在原位置插入图片分析

ie8

wangEditor编辑器失去焦点后仍然可以在原位置插入图片分析

解决方法是如果是ie6,7,8的话,currentRange.pasteHTML(html); 。插入html,也就是把上面的if注释去掉.当然插入的不再是图片地址了,现在是包含图片地址的整个img标签

ie6

wangEditor编辑器失去焦点后仍然可以在原位置插入图片分析

ie7

wangEditor编辑器失去焦点后仍然可以在原位置插入图片分析

ie8

wangEditor编辑器失去焦点后仍然可以在原位置插入图片分析

最后附上例子下载

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
JavaScript DOM学习第八章 表单错误提示
Feb 19 Javascript
用js实现判断当前网址的来路如果不是指定的来路就跳转到指定页面
May 02 Javascript
js中window.open()的所有参数详细解析
Jan 09 Javascript
如何书写高质量jQuery代码(使用jquery性能问题)
Jun 30 Javascript
javascript适合移动端的日期时间拾取器
Nov 10 Javascript
javascript的BOM
May 03 Javascript
JavaScript简单实现合并两个Json对象的方法示例
Oct 16 Javascript
Angular实现的日程表功能【可添加及隐藏显示内容】
Dec 27 Javascript
Vue.js分页组件实现:diVuePagination的使用详解
Jan 10 Javascript
使用vue官方提供的模板vue-cli搭建一个helloWorld案例分析
Jan 16 Javascript
JS实现checkbox互斥(单选)功能示例
May 04 Javascript
jQuery属性选择器用法实例分析
Jun 28 jQuery
完美实现仿QQ空间评论回复特效
May 06 #Javascript
jQuery实现鼠标单击网页文字后在文本框显示的方法
May 06 #Javascript
js实现点击按钮后给Div图层设置随机背景颜色的方法
May 06 #Javascript
JS实现CheckBox复选框全选全不选功能
May 06 #Javascript
javascript使用avalon绑定实现checkbox全选
May 06 #Javascript
js实现滑动触屏事件监听的方法
May 05 #Javascript
JS根据生日算年龄的方法
May 05 #Javascript
You might like
php中curl使用指南
2015/02/05 PHP
php实现字符串反转输出的方法
2015/03/14 PHP
php设计模式之单例模式代码
2016/06/11 PHP
javascript动态添加表格数据行(ASP后台数据库保存例子)
2010/05/08 Javascript
js切换div css注意的细节
2012/12/10 Javascript
jquery清空表单数据示例分享
2014/02/13 Javascript
js控制当再次点击按钮时的间隔时间
2014/06/03 Javascript
jQuery实现跨域
2015/02/03 Javascript
JS实现1000以内被3或5整除的数字之和
2016/02/18 Javascript
jQuery zTree加载树形菜单功能
2016/02/25 Javascript
微信小程序 网络请求(GET请求)详解
2016/11/16 Javascript
jQuery选择器之属性筛选选择器用法详解
2017/09/19 jQuery
AjaxUpLoad.js实现文件上传
2018/03/05 Javascript
JS中判断某个字符串是否包含另一个字符串的五种方法
2018/05/03 Javascript
vue路由教程之静态路由
2019/09/03 Javascript
深入了解Vue动态组件和异步组件
2021/01/26 Vue.js
[02:11]2014DOTA2 TI专访VG战队Fenrir:队伍气氛良好
2014/07/11 DOTA
[25:45]2018DOTA2亚洲邀请赛4.5SOLO赛 Sylar vs Paparazi
2018/04/06 DOTA
Windows下Anaconda的安装和简单使用方法
2018/01/04 Python
selenium3+python3环境搭建教程图解
2018/12/07 Python
使用Python横向合并excel文件的实例
2018/12/11 Python
基于Python获取docx/doc文件内容代码解析
2020/02/17 Python
CSS3 按钮边框动画的实现
2020/11/12 HTML / CSS
英国排名第一的礼品体验公司:Red Letter Days
2018/08/16 全球购物
广州御银科技股份有限公司试卷(C++)
2016/11/04 面试题
IMPORT的选项IGNORE有什么作用?缺省是什么设置?
2015/09/17 面试题
汽车机修工岗位职责
2014/03/06 职场文书
小学清明节活动方案
2014/03/08 职场文书
社区维稳工作方案
2014/06/06 职场文书
无房证明范本
2014/09/17 职场文书
2015年八一建军节活动总结
2015/03/20 职场文书
给老婆的检讨书(搞笑版)
2015/05/06 职场文书
幼儿园六一主持词开场白
2015/05/28 职场文书
2019年思想汇报
2019/06/20 职场文书
一文搞懂如何实现Go 超时控制
2021/03/30 Python
Navicat for MySQL的使用教程详解
2021/05/27 MySQL