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 相关文章推荐
javascript (用setTimeout而非setInterval)
Dec 28 Javascript
jQuery不间断滚动效果(模拟百度新闻支持文字/图片/垂直滚动)
Feb 05 Javascript
jQuery使用CSS()方法给指定元素同时设置多个样式
Mar 26 Javascript
详解JavaScript中数组的相关知识
Jul 29 Javascript
jQuery+PHP星级评分实现方法
Oct 02 Javascript
动态的9*9乘法表效果的实现代码
May 16 Javascript
用js写的一个路由(简单实例)
Sep 24 Javascript
Bootstrap下拉菜单Dropdowns的实现代码
Mar 17 Javascript
详解js静态资源文件请求的处理
Aug 01 Javascript
vue实现淘宝购物车功能
Apr 20 Javascript
解决echarts 一条柱状图显示两个值,类似进度条的问题
Jul 20 Javascript
使用vue编写h5公众号跳转小程序的实现代码
Nov 27 Vue.js
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的类树(支持无限分类)
2006/10/09 PHP
PHP最常用的2种设计模式工厂模式和单例模式介绍
2012/08/14 PHP
利用PHP将部分内容用星号替换
2020/04/21 PHP
详解PHP中的序列化、反序列化操作
2017/03/21 PHP
php通过各种函数判断0和空
2020/07/04 PHP
JavaScript将相对地址转换为绝对地址示例代码
2013/07/19 Javascript
JavaScript实现的链表数据结构实例
2015/04/02 Javascript
javascript瀑布流式图片懒加载实例解析与优化
2016/02/23 Javascript
Javascript基础_标记文字的实现方法
2016/06/14 Javascript
javascript使用闭包模拟对象的私有属性和方法
2016/10/05 Javascript
JS瀑布流实现方法实例分析
2016/12/19 Javascript
JavaScript严格模式详解
2017/01/16 Javascript
完美解决UI-Grid表格元素中多个空格显示为一个空格的问题
2017/04/25 Javascript
ES6模块化的import和export用法方法总结
2017/08/08 Javascript
深入浅析javascript继承体系
2017/10/23 Javascript
javascript实现数字配对游戏的实例讲解
2017/12/14 Javascript
微信小程序生成二维码的示例代码
2019/03/29 Javascript
一文快速了解JQuery中的AJAX
2019/05/31 jQuery
nodejs语言实现验证码生成功能的示例代码
2019/10/13 NodeJs
Python实现读取字符串按列分配后按行输出示例
2018/04/17 Python
对python的bytes类型数据split分割切片方法
2018/12/04 Python
Python 最大概率法进行汉语切分的方法
2018/12/14 Python
python 的 scapy库,实现网卡收发包的例子
2019/07/23 Python
Python requests HTTP验证登录实现流程
2020/11/05 Python
茶叶生产计划书
2014/01/10 职场文书
洗发露广告词
2014/03/14 职场文书
村抢险救灾方案
2014/05/09 职场文书
学生意外伤害赔偿协议书
2014/09/17 职场文书
2014年银行个人工作总结
2014/12/05 职场文书
师德师风培训感言
2015/08/03 职场文书
月考总结与反思
2015/10/22 职场文书
阳光体育运动标语口号
2015/12/26 职场文书
简短的36句中秋节祝福信息语句
2019/09/09 职场文书
导游词之吉林花园山
2019/10/17 职场文书
七年级作文之下雨天
2019/12/23 职场文书
排查并解决Oracle sysaux表空间异常增长
2022/04/20 Oracle