JS在可编辑的div中的光标位置插入内容的方法


Posted in Javascript onNovember 20, 2014

本文实例讲述了js实现在可编辑div中指定位置插入内容的方法,就像我们使用的编辑器一样,分享给大家供大家参考。具体实现方法如下:

首先要让DIV启用编辑模式

<div contenteditable=true id="divTest"></div>

通过设定contenteditable=true开启div的编辑模式.这样DIV就可以跟文本框一样输入内容了。
不扯话题了。下面说怎么获取或设置光标位置.

2个步骤:

① 获取DIV中的光标位置
② 改变光标位置

var cursor = 0; // 光标位置  

document.onselectionchange = function () {

var range = document.selection.createRange();

var srcele = range.parentElement();//获取到当前元素

var copy = document.body.createTextRange();

copy.moveToElementText(srcele);

for (cursor = 0; copy.compareEndPoints("StartToStart", range) < 0; cursor++) {

 copy.moveStart("character", 1);//改变光标位置,实际上我们是在记录cursor的数量.

}

}

给document绑定光标变化事件。用来记录光标位置.
这样就可以拿到DIV的光标位置了.
function moveEnd(obj) {

lyTXT1.focus();

var r = document.selection.createRange();

//因为这里死从当前光标开始移动的(好像文本框的是从0算起.)所以我们需要拿到当前光标位置,然后就可以计算出要移动多少位了,这样就可以把光标移动到想要的位置了

r.moveStart('character', lyTXT1.innerText.length - cursor);

r.collapse(true);

r.select();

}

通过上面的我们就可以将DIV中的光标移动到最后面了
一个完整的实例
<button type="button" onclick="document.getElementById('test').focus(); insertHtmlAtCaret('<b>INSERTED</b>');">插入字符</button>

<div contentEditable="true" style="height:50px; border:2px solid red;" id="test"> </div>

 

function insertHtmlAtCaret(html) {

var sel, range;

if (window.getSelection) {

// IE9 and non-IE

sel = window.getSelection();

if (sel.getRangeAt && sel.rangeCount) {

range = sel.getRangeAt(0);

range.deleteContents();

// Range.createContextualFragment() would be useful here but is

// non-standard and not supported in all browsers (IE9, for one)

var el = document.createElement("div");

el.innerHTML = html;

var frag = document.createDocumentFragment(), node, lastNode;

while ( (node = el.firstChild) ) {

lastNode = frag.appendChild(node);

}

range.insertNode(frag);

// Preserve the selection

if (lastNode) {

range = range.cloneRange();

range.setStartAfter(lastNode);

range.collapse(true);

sel.removeAllRanges();

sel.addRange(range);

}

}

} else if (document.selection && document.selection.type != "Control") {

// IE < 9

document.selection.createRange().pasteHTML(html);

}

}

再看一个基于jquery的实例

<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta content="text/html; charset=utf-8" http-equiv="Content-Type">

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>

<title>contenteditable</title>

<style>

*{

 margin:0;padding:0;

}

.im-message-area{

 width:98%;

 padding:2px;

 height:75px;

 border:#000 solid 1px;

 background:#fff;

 font:12px/20px arial,"5b8b4f53";

 word-wrap:break-word;

 overflow-y:auto;

 line-height:1;

}

.ul{display:none;}

.ul li{

 background-color:#CCC;

 width:50px;

}

</style>

<script language="javascript" type="text/javascript">

function inimage(text){

 var obj= $(".im-message-area")[0];

 var range, node;

 if(!obj.hasfocus) {

  obj.focus();

 }

    if (window.getSelection && window.getSelection().getRangeAt) {

        range = window.getSelection().getRangeAt(0);

  range.collapse(false);

        node = range.createContextualFragment(text);

  var c = node.lastChild;

        range.insertNode(node);

  if(c){

   range.setEndAfter(c);

   range.setStartAfter(c)

  }

  var j = window.getSelection();

  j.removeAllRanges();

  j.addRange(range);

  

    } else if (document.selection && document.selection.createRange) {

        document.selection.createRange().pasteHTML(text);

    }

}

$(document).ready(function(){

 $('#button').click(function(){

  $('.ul').show();

 })

 $('.ul li').each(function(){

  $(this).click(function(){

   inimage($(this).text());

  }) 

 })

});

</script>

</head>

<body>

 <div contenteditable="true" id="im_message_area" class="im-message-area"><br></div>

 <a href="javascript:void(0)" id="button">按钮</a>

 <ul class="ul">

  <li>(笑)</li>

  <li>(哭)</li>

  <li>(乐)</li>

 </ul>

</body>

</html>

希望本文所述对大家的javascript程序设计有所帮助。

Javascript 相关文章推荐
不要小看注释掉的JS 引起的安全问题
Dec 27 Javascript
关于javascript event flow 的一个bug详解
Sep 17 Javascript
javascript与css3动画结合使用小结
Mar 11 Javascript
网页挂马方式整理及详细介绍
Nov 03 Javascript
js中数组的常用方法小结
Dec 30 Javascript
vue通过watch对input做字数限定的方法
Jul 13 Javascript
VueJS 集成 Medium Editor的示例代码 (自定义编辑器按钮)
Aug 24 Javascript
利用JS实现一个同Excel表现的智能填充算法
Aug 13 Javascript
Vue代码整洁之去重方法整理
Aug 06 Javascript
JavaScript:ES2019 的新特性(译)
Aug 08 Javascript
使用layui的layer组件做弹出层的例子
Sep 27 Javascript
JS事件循环机制event loop宏任务微任务原理解析
Aug 04 Javascript
js实现div弹出层的方法
Nov 20 #Javascript
JavaScript中的公有、私有、特权和静态成员用法分析
Nov 20 #Javascript
js实现二代身份证号码验证详解
Nov 20 #Javascript
js实现网页标题栏闪烁提示效果实例分析
Nov 20 #Javascript
javascript获取flash版本号的方法
Nov 20 #Javascript
Jquery对象和Dom对象的区别分析
Nov 20 #Javascript
深入理解javascript变量声明
Nov 20 #Javascript
You might like
最令PHP初学者们头痛的十四个问题
2007/01/15 PHP
PhpMyAdmin出现export.php Missing parameter: what /export_type错误解决方法
2012/08/09 PHP
Yii2主题(Theme)用法详解
2016/07/23 PHP
laravel 获取某个查询的查询SQL语句方法
2019/10/12 PHP
javascript String 的扩展方法集合
2008/06/01 Javascript
Javascript条件判断使用小技巧总结
2008/09/08 Javascript
JQuery下的Live方法和$.browser方法使用代码
2010/06/02 Javascript
php对mongodb的扩展(小试牛刀)
2012/11/11 Javascript
jquery.cookie用法详细解析
2013/12/18 Javascript
javascript运算符——逻辑运算符全面解析
2016/06/27 Javascript
JS动态添加的div点击跳转到另一页面实现代码
2017/09/30 Javascript
JavaScript中立即执行函数实例详解
2017/11/04 Javascript
vue编译打包本地查看index文件的方法
2018/02/23 Javascript
通过jquery toggleClass()属性制作文章段落更改背景颜色
2018/05/21 jQuery
讲解vue-router之什么是嵌套路由
2018/05/28 Javascript
js中getter和setter用法实例分析
2018/08/14 Javascript
jQuery实现的分页插件完整示例
2020/05/26 jQuery
归纳整理Python中的控制流语句的知识点
2015/04/14 Python
Python基础知识_浅谈用户交互
2017/05/31 Python
Centos7 Python3下安装scrapy的详细步骤
2018/03/15 Python
详解多线程Django程序耗尽数据库连接的问题
2018/10/08 Python
tf.concat中axis的含义与使用详解
2020/02/07 Python
Python字符编码转码之GBK,UTF8互转
2020/02/09 Python
PyQt5实现简单的计算器
2020/05/30 Python
python 使用csv模块读写csv格式文件的示例
2020/12/02 Python
香港化妆品经销商:我的公主
2016/08/05 全球购物
科颜氏加拿大官方网站: Kiehl’s加拿大
2016/08/16 全球购物
美国最大的袜子制造商和零售商:Renfro Socks
2017/09/03 全球购物
英国比较机场停车场网站:Airport Parking Essentials
2019/12/01 全球购物
意大利辅助药品、药物和补品在线销售:FarmaEurope
2020/04/29 全球购物
网络安全方面的面试题
2015/11/04 面试题
劳动模范事迹材料
2014/01/19 职场文书
销售员求职个人的自我评价
2014/02/19 职场文书
学生评语大全
2014/04/18 职场文书
物流管理系毕业生求职信
2014/06/03 职场文书
2016年寒假社会实践活动总结
2015/10/10 职场文书