近期需开发一个DIV做的编辑器,插入表情图片可直接预览效果,仔细参考了下百度贴吧的过滤粘贴过来文件的THML代码,自己整理了下。写出来只是和大家分享下,我自己也不大懂,经过努力,幸好搞定。

蛋疼的事情出来了,当编辑框失去焦点时候,再插入图片时候总是插入在最前面(谷歌和火狐,IE没问题)。还没搞定,,,

<!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 http-equiv="Content-Language" content="zh-cn" /> 

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

<title>DIV可编辑框鼠标光标处插入图片或者文字。</title>

<script type="text/javascript" src="http://www.w3school.com.cn/jquery/jquery.js

"></script>

<script type="text/javascript">

$(function(){

    $(".imgbox img").click(function(){

    $("#testdiv").focus();

    var sy = $(".imgbox img").index(this) + 1;

    var img_url = "<img src='faceimg/"+sy+".gif'>";

/*此处如果不是插入图片可这样:

var img_url = "插入测试的文字";

*/

    _insertimg(img_url);

    })

//注:如果要插入的是那种“快捷发言,快捷留言”里的文字,只需把那些文字都分别放在A标签里即可,然后img_url=a标签里面的内容。工作中的编辑器终于搞定!能插入图片和快捷发言和表情图片等。

})

//监控粘贴(ctrl+v),如果是粘贴过来的东东,则替换多余的html代码,只保留<br>

function pasteHandler(){

setTimeout(function(){

var content = document.getElementById("testdiv").innerHTML;

valiHTML=["br"]; 

content=content.replace(/_moz_dirty=""/gi, "").replace(/\[/g, "[[-").replace(/\]/g, "-]]").replace(/<\/ ?tr[^>]*>/gi, "[br]").replace(/<\/ ?td[^>]*>/gi, "&nbsp;&nbsp;").replace(/<(ul|dl|ol)[^>]*>/gi, "[br]").replace(/<(li|dd)[^>]*>/gi, "[br]").replace(/<p [^>]*>/gi, "[br]").replace(new RegExp("<(/?(?:" + valiHTML.join("|") + ")[^>]*)>", "gi"), "[$1]").replace(new RegExp('<span([^>]*class="?at"?[^>]*)>', "gi"), "[span$1]").replace(/<[^>]*>/g, "").replace(/\[\[\-/g, "[").replace(/\-\]\]/g, "]").replace(new RegExp("\\[(/?(?:" + valiHTML.join("|") + "|img|span)[^\\]]*)\\]", "gi"), "<$1>");

if(!$.browser.mozilla){

content=content.replace(/\r?\n/gi, "<br>");

}

document.getElementById("testdiv").innerHTML=content;

},1)

}

//锁定编辑器中鼠标光标位置。。

function _insertimg(str){

var selection= window.getSelection ? window.getSelection() : document.selection;

var range= selection.createRange ? selection.createRange() : selection.getRangeAt(0);

if (!window.getSelection){

document.getElementById('testdiv').focus();

var selection= window.getSelection ? window.getSelection() : document.selection;

var range= selection.createRange ? selection.createRange() : selection.getRangeAt(0);

range.pasteHTML(str);

range.collapse(false);

range.select();

}else{

document.getElementById('testdiv').focus();

range.collapse(false);

var hasR = range.createContextualFragment(str);

var hasR_lastChild = hasR.lastChild;

while (hasR_lastChild && hasR_lastChild.nodeName.toLowerCase() == "br" && hasR_lastChild.previousSibling && hasR_lastChild.previousSibling.nodeName.toLowerCase() == "br") {

var e = hasR_lastChild;

hasR_lastChild = hasR_lastChild.previousSibling;

hasR.removeChild(e)

}                                

range.insertNode(hasR);

if (hasR_lastChild) {

range.setEndAfter(hasR_lastChild);

range.setStartAfter(hasR_lastChild)

}

selection.removeAllRanges();

selection.addRange(range)

}

}

//监控按enter键和空格键,如果按了enter键,则取消原事件,用<BR/ >代替。此处还等待修改!!!!!!如果后端能实现各个浏览器回车键产生的P,div, br的输出问题话就无需采用这段JS、

function enterkey(){ 

e = event.keyCode; 

if (e==13||e==32) { 

   var keyCode = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;

   event.returnValue = false;  // 取消此事件的默认操作 

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

    var myRange = document.selection.createRange();

    myRange.pasteHTML('<br />');

    }else if(window.getSelection){

var selection = window.getSelection();

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

range.deleteContents();

var newP = document.createElement('br');

range.insertNode(newP);

}

//alert(document.getElementById("testdiv").innerHTML)

} 

} 

</script>

<style type="text/css">

.editbox{width:400px;height:200px;border:1px solid #000; overflow-x:hidden; overflow-y:auto; outline:none;}

.editbox img{ margin:0 3px; display:inline;}

</style>

</head> 

<body>

<div id="testdiv" contenteditable="true" class="editbox" onkeydown="enterkey()" >可以在任意文字后面插入图片或者文字哦!<br /></div>

<div class="imgbox">

  <img src="faceimg/1.gif">

  <img src="faceimg/2.gif">

  <img src="faceimg/3.gif">

  <img src="faceimg/4.gif">

</div>

<script type="text/javascript">

//此处必须防止在最下端。

var edt = document.getElementById("testdiv");

if(edt.addEventListener){

edt.addEventListener("paste",pasteHandler,false);

}else{

edt.attachEvent("onpaste",pasteHandler);

}

</script>

</body>

</html>

转载地址:http://hi.baidu.com/louve01/item/efb14e1add258f6b3f87cedb

可编辑DIV (contenteditable="true") 在鼠标光标处插入图片或者文字的更多相关文章

  1. js在一个可编辑的div光标处插入图片或者文本(兼容ie,火狐等浏览器)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. js实现文本框文本域光标处插入图片文本的插件(并且光标在插入内容的内容后显示)

    js: /******************************************* * * 插入光标处的插件 * @authors Du xin li * @update    2015 ...

  3. IOS中div contenteditable=true无法输入

    在IOS中<div contenteditable="true"></div>中点击时可以弹出键盘但是无法输入.加一个样式-webkit-user-sele ...

  4. 开启html元素的编辑模式contenteditable="true"

    开启html元素的编辑模式contenteditable="true"

  5. JQ在光标处插入文字

    内容转载自网络这是一个JQ的扩展方法.在teatarea获得焦点时,往光标处插入文字,扩展代码如下 (function($){ $.fn.extend({ "insert":fun ...

  6. 使用JS在textarea在光标处插入内容

    // 在光标处插入字符串 // myField 文本框对象 // myValue 要插入的值 function insertAtCursor(myField, myValue) { //IE supp ...

  7. 苹果手机IOS中div contenteditable=true 仿文本域无法输入编辑

    问题: 在苹果手机IOS中 contenteditable="true" 做文本域输入,点击可以弹出键盘但是无法输入,安卓都正常. 经测试后,记得加一个样式 -webkit-use ...

  8. IOS中div contenteditable=true无法输入 fastclick.js在点击一个可输入的div时,ios无法正常唤起输入法键盘

    原文地址: https://blog.csdn.net/u010377383/article/details/79838562 前言 为了提升移动端click的响应速度,使用了fastclick.js ...

  9. kindeditor在光标处插入编辑器外的数据

    页面 <div class="form-group clearfix"> <label class="control-label col-sm-3 co ...

随机推荐

  1. php_中替换换行符

    //php 有三种方法来解决 //1.使用str_replace 来替换换行 $str = str_replace(array("\r\n", "\r", &q ...

  2. 为代码减负之&lt;一&gt;触发器(SQL)

    对触发器一词早有耳闻(最早是在耿大妈的数据库视频中),当初看完视频后,对理解不深刻的东西如:触发器,存储过程,事务,日志等等没有具体的去查阅,也没有具体的去尝试,应用.所以才导致了今天的博客(把曾经丢 ...

  3. Jquery zTree实例

    zTree[简单介绍] zTree 是利用 JQuery 的核心代码,实现一套能完毕大部分经常使用功能的 Tree 插件 兼容 IE.FireFox.Chrome 等浏览器 在一个页面内可同一时候生成 ...

  4. 【云图】如何制作全国KTV查询系统?

    原文:[云图]如何制作全国KTV查询系统? 摘要:本文以[唱吧]531麦霸音乐节为案例,详细解读了如何导入自有数据到高德云图,并进行检索和展示.最后,调起高德mobile地图来进行路线规划和周边查询. ...

  5. 【高德地图API】如何获得行政区域?如何制作行政规划图?

    原文:[高德地图API]如何获得行政区域?如何制作行政规划图? 什么是行政规划图?如何获得每个行政区域的边界轮廓图?举例:重庆市 江北区.如图: 官方类参考:http://developer.amap ...

  6. Github Pages 静态网页建站

    创建仓库 略.详见GitHub使用教程. 仓库属性设置 找Github Pages项.点击自己主动生成,依照提示操作,就会得到该项目的gh-pages 分支. 公布站点成功,地址为 http://ch ...

  7. tinyxml 查找element

    下面这段代码是网上找来的,很是经典 bool GetNodePointerByName(TiXmlElement* pRootEle, const char* strNodeName,TiXmlEle ...

  8. 网站静态化处理—web前端优化—中(12)

    网站静态化处理—web前端优化—中(12) Web前端很多优化原则都是从如何提升网络通讯效率的角度提出的,但是这些原则使用的时候还是有很多陷阱在里面,如果我们不能深入理解这些优化原则背后所隐藏的技术原 ...

  9. sql点滴37—mysql中的错误Data too long for column '' at row 1

    原文:sql点滴37-mysql中的错误Data too long for column '' at row 1   1.MYSQL服务 我的电脑——(右键)管理——服务与应用程序——服务——MYSQ ...

  10. MVC6 - 视图组建

    MVC6 - 视图组建 VS2015 PERVIEW中可以创建MVC6 项目. 我们可以 发现有几大亮点. 首先我们看目录结构: 当前项目包含两个主要的文件夹:Solution Items .src ...