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中定义对象类别
Dec 22 Javascript
javascript实现的网页局布刷新效果
Dec 01 Javascript
老鱼 浅谈javascript面向对象编程
Mar 04 Javascript
页面装载js及性能分析方法介绍
Mar 21 Javascript
js判断当前浏览器类型,判断IE浏览器方法
Jun 02 Javascript
JQuery 传送中文乱码问题的简单解决办法
May 24 Javascript
静态页面html中跳转传值的JS处理技巧
Jun 22 Javascript
JS给swf传参数的实现方法
Sep 13 Javascript
jquery对象和DOM对象的相互转换详解
Oct 18 Javascript
js获取隐藏元素的宽高
Feb 24 Javascript
Vue多系统切换实现方案
Jun 05 Javascript
webpack4 SCSS提取和懒加载的示例
Sep 03 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面向对象全攻略 (一) 面向对象基础知识
2009/09/30 PHP
PHP屏蔽过滤指定关键字的方法
2014/11/03 PHP
php判断数组中是否存在指定键(key)的方法
2015/03/17 PHP
php使用substr()和strpos()联合查找字符串中某一特定字符的方法
2015/05/12 PHP
PHP通过反射动态加载第三方类和获得类源码的实例
2015/11/27 PHP
php面向对象之反射功能与用法分析
2017/03/29 PHP
Laravel使用原生sql语句并调用的方法
2019/10/09 PHP
使用Javascript和DOM Interfaces来处理HTML
2006/10/09 Javascript
javascript 流畅动画实现原理
2009/09/08 Javascript
JavaScript 常用函数库详解
2009/10/21 Javascript
JavaScript和ActionScript的交互实现代码
2010/08/01 Javascript
javascript实现div的拖动并调整大小类似qq空间个性编辑模块
2012/12/12 Javascript
基于promise.js实现nodejs的promises库
2014/07/06 NodeJs
jquery easyui使用心得
2014/07/07 Javascript
JavaScript strike方法入门实例(给字符串加上删除线)
2014/10/17 Javascript
jquery队列函数用法实例
2014/12/16 Javascript
JQuery调用绑定click事件的3种写法
2015/03/28 Javascript
基于jQuery实现带动画效果超炫酷的弹出对话框(附源码下载)
2016/02/22 Javascript
JS焦点图,JS 多个页面放多个焦点图的实例
2016/12/08 Javascript
zTree jQuery 树插件的使用(实例讲解)
2017/09/25 jQuery
Django中使用jquery的ajax进行数据交互的实例代码
2017/10/15 jQuery
Vue 2.5 Level E 发布了: 新功能特性一览
2017/10/24 Javascript
Vue CLI2升级至Vue CLI3的方法步骤
2019/05/20 Javascript
使用Python3制作TCP端口扫描器
2017/04/17 Python
python并发和异步编程实例
2018/11/15 Python
Pandas DataFrame数据的更改、插入新增的列和行的方法
2019/06/25 Python
Python的Tkinter点击按钮触发事件的例子
2019/07/19 Python
用python实现学生管理系统
2020/07/24 Python
python实现图片,视频人脸识别(dlib版)
2020/11/18 Python
Python3自带工具2to3.py 转换 Python2.x 代码到Python3的操作
2021/03/03 Python
法律专业求职信
2014/05/24 职场文书
群众路线个人对照检查材料
2014/09/23 职场文书
海贼王十大逆天果实 魂魂果实上榜,岩浆果实攻击力最强
2022/03/18 日漫
配置Kubernetes外网访问集群
2022/03/31 Servers
python对文档中元素删除,替换操作
2022/04/02 Python
SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询
2022/05/25 SQL Server