<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>UBB表情的插入</title>
<style type="text/css">
 * {margin:0; padding:0;}
 body {font:12px/1.3 Arial, Helvetica, sans-serif; background-color:#FFFFFF;}
 ul, li {list-style:none}
 img {border:none}
 
 .container {margin:30px;}
 #txtDemo {width:475px; height:110px; word-break:break-all; word-wrap:break-word;}
 #facePanel {border-width:1px 2px 2px 1px; border-color: #CCCCCC; border-style:solid; -webkit-border-radius: 6px; -moz-border-radius:6px; padding:6px; width:330px; margin-top:5px; display:none;}
 #facePanel li{float:left; width:28px; height:28px; padding:0 5px 5px 0;}
 #facePanel li a {display:block; text-decoration:none; border:1px dashed #DDD; width:26px; height:26px; line-height:26px; overflow:hidden; text-align:center;}
 #facePanel li a:hover {border-color:#999;}
 
 #facePanel li a span {display:inline-block;}
 #facePanel li a img {vertical-align:middle;}
 
 #facePanel ul {zoom:1;}
 #facePanel ul:after{ content:"\0020"; display:block; height:0; line-height:0; clear:both; visibility:hidden;}
</style>
</head>
<body>
 
<div class="container">
 <div>
  <textarea id="txtDemo"></textarea>
 </div>
 <button οnclick="showFace(event);">插入表情</button>
 <div id="facePanel">sadf</div>
</div>

<script type="text/javascript">
 function $(id) {
  return typeof id === 'string' ? document.getElementById(id) : id;
 }
 
 function addEvent(el, type, handler) {
  if(el.attachEvent) {
   el.attachEvent("on" + type, handler);
  } else if(el.addEventListener) {
   el.addEventListener(type, handler, false);
  }
 }
 
 function removeEvent(el, type, handler) {
  if(el.detachEvent) {
   el.detachEvent('on' + type, handler);
  } else if(el.removeEventListener) {
   el.removeEventListener(type, handler, false);
  }
 }
 
 var faceInited = false;
 
 //显示表情
 function showFace(ev) {
  if(!faceInited) {
   initFace();
  }
 
  var facePanel= $("facePanel");
 
  facePanel.style.display = "block";
  addEvent(document.body, 'click', hideFace);
  addEvent(facePanel, 'click', cancelEventBubble);
 
  cancelEventBubble(ev);
 }
 
 //隐藏表情
 function hideFace() {
  $("facePanel").style.display = "none";
  removeEvent(document.body, 'click', hideFace);
  removeEvent($("facePanel"), 'click', cancelEventBubble);
 }
 
 //插入表情
 function insertFace(elem) {
  var txtElem = $("txtDemo"),
   range = txtElem.getAttribute("range") ? txtElem.getAttribute("range").split("|") : [0, 0];
 
  var str_1 = txtElem.value.slice(0, range[0]);
  var str_2 = txtElem.value.slice(range[1]);
 
  txtElem.value = str_1 + elem.getAttribute("value") + str_2;
 
  if(!document.selection) {
   txtElem.selectionStart = txtElem.value.length;
   txtElem.selectionEnd = txtElem.value.length;
  } else {
   var range = txtElem.createTextRange();
         range.collapse(1);
         range.moveStart("character", txtElem.value.length);
         range.moveEnd("character", txtElem.value.length);
         range.select();
  }
 
  txtElem.focus();
 
  hideFace();
 }
 
 //取消事件冒泡
 function cancelEventBubble(ev) {
  ev = ev || window.event;
 
  if(ev.stopPropagation) {
   ev.stopPropagation();
  } else if(!ev.cancelBubble) {
   ev.cancelBubble = true;
  }
 }
 
 //记录textarea的选区的start&end
 function savePos() {
  var elem = $("txtDemo"),
   range = getRange(elem);//获取选区
 
  elem.setAttribute("range", range.join("|"));
 
  document.title = "start:" + range[0] + "--" + "end:" + range[1];
 
  cancelEventBubble(arguments[0] || window.event);
 }
 
 !(function() {
  var txtElem = $("txtDemo");
 
  addEvent(txtElem, 'focus', savePos);
  addEvent(txtElem, 'mouseup', savePos);
  addEvent(txtElem, 'keyup', savePos);
  addEvent(txtElem, 'mousemove', savePos);//Chrome 在选中文本域内的文字时,不能触发mouseup事件,导致range依旧为最近一次的range
 })();
 
 //初始化表情
 function initFace() {
  var faces = [{"icon":"\u8db3\u7403","value":"[\u8db3\u7403]","src":"basic\/football.gif"},{"icon":"\u54e8\u5b50","value":"[\u54e8\u5b50]","src":"basic\/shao.gif"},{"icon":"\u7ea2\u724c","value":"[\u7ea2\u724c]","src":"basic\/redcard.gif"},{"icon":"\u9ec4\u724c","value":"[\u9ec4\u724c]","src":"basic\/yellowcard.gif"},{"icon":"\u54c8\u54c8","value":"[\u54c8\u54c8]","src":"basic\/laugh.gif"},{"icon":"\u5475\u5475","value":"[\u5475\u5475]","src":"basic\/smile.gif"},{"icon":"\u6cea","value":"[\u6cea]","src":"basic\/cry.gif"},{"icon":"\u6c57","value":"[\u6c57]","src":"basic\/sweat.gif"},{"icon":"\u7231\u4f60","value":"[\u7231\u4f60]","src":"basic\/love.gif"},{"icon":"\u563b\u563b","value":"[\u563b\u563b]","src":"basic\/tooth.gif"},{"icon":"\u54fc","value":"[\u54fc]","src":"basic\/hate.gif"},{"icon":"\u5fc3","value":"[\u5fc3]","src":"basic\/heart.gif"},{"icon":"\u6655","value":"[\u6655]","src":"basic\/dizzy.gif"},{"icon":"\u6012","value":"[\u6012]","src":"basic\/angry.gif"},{"icon":"\u86cb\u7cd5","value":"[\u86cb\u7cd5]","src":"basic\/cake.gif"},{"icon":"\u82b1","value":"[\u82b1]","src":"basic\/flower.gif"},{"icon":"\u6293\u72c2","value":"[\u6293\u72c2]","src":"basic\/crazy.gif"},{"icon":"\u56f0","value":"[\u56f0]","src":"basic\/sleepy.gif"},{"icon":"\u5e72\u676f","value":"[\u5e72\u676f]","src":"basic\/cheer.gif"},{"icon":"\u592a\u9633","value":"[\u592a\u9633]","src":"basic\/sun.gif"},{"icon":"\u4e0b\u96e8","value":"[\u4e0b\u96e8]","src":"basic\/rain.gif"},{"icon":"\u4f24\u5fc3","value":"[\u4f24\u5fc3]","src":"basic\/sad.gif"},{"icon":"\u6708\u4eae","value":"[\u6708\u4eae]","src":"basic\/moon.gif"},{"icon":"\u732a\u5934","value":"[\u732a\u5934]","src":"basic\/pig.gif"},{"icon":"\u8721\u70db","value":"[\u8721\u70db]","src":"basic\/candle.gif"}];
  var imgURI = "http://timg.sjs.sinajs.cn/miniblog2style/images/common/face/";
  var tempArr = [];
  tempArr.push('<ul>');
 
  for(var i=0, len = faces.length; i<len; i++) {
   tempArr.push([
    '<li><a href="javascript:;" hideFocus="true" οnclick="insertFace(this);return false;" value="' + faces[i].value + '" title="' + faces[i].icon + '"><img src="' + imgURI + faces[i].src + '" alt="' + faces[i].icon + '" /><span>&nbsp;</span></a></li>',
   ].join(""));
  }
 
  tempArr.push('</ul>');
 
  $("facePanel").innerHTML = tempArr.join("");
 }
 
 //获取选区
 function getRange(elem) {
  var start = 0, end = 0;
   
  if(!document.selection) {
   start = elem.selectionStart;
   end = elem.selectionEnd;
  } else if(document.selection) {
   var range = document.selection.createRange(),
    range_all = document.body.createTextRange(),
    i = 0;
    
   range_all.moveToElementText(elem);
   
   for(; range_all.compareEndPoints("StartToStart", range) < 0; start++) {
    range_all.moveStart('character', 1);
   }
   
   for(; i<start; i++) {
    if(elem.value.charAt(i) == "\n") {
     start++;
    }
   }
   
   range_all = document.body.createTextRange();
   range_all.moveToElementText(elem);
   
   for(; range_all.compareEndPoints('StartToEnd', range) < 0; end++) {
    range_all.moveStart('character', 1);
   }
   
   for(i=0; i <= end; i++) {
    if(elem.value.charAt(i) == "\n") {
     end++;
    }
   }
  }
 
  return [start, end];
 }
</script>

</body>
</html>

兼容主流浏览器的【表情插入】源码(转)相关推荐

  1. Via浏览器怎么查看网页源码

    Via浏览器怎么查看网页源码?Via浏览器是一款非常不错的手机主页浏览软件,该软件功能强大,除了基本的主页浏览之外,它还可以帮助用户进行在线资源的嗅探,并且还可以直接在手机上进行网页源码的查看.下面小 ...

  2. 将内容复制到剪切板兼容主流浏览器的解决方案

    html : <body><div class="demo-area"><label for="copy-input">输入 ...

  3. android仿微信红包动画、Kotlin综合应用、Xposed模块、炫酷下拉视觉、UC浏览器滑动动画等源码...

    Android精选源码 仿微信打开红包旋转动画 使用Kotlin编写的Android应用,内容你想象不到 Android手机上的免Root Android系统日志Viewer 一个能让微信 Mater ...

  4. android仿微信红包动画、Kotlin综合应用、Xposed模块、炫酷下拉视觉、UC浏览器滑动动画等源码

    Android精选源码 仿微信打开红包旋转动画 使用Kotlin编写的Android应用,内容你想象不到 Android手机上的免Root Android系统日志Viewer 一个能让微信 Mater ...

  5. 每次启动项目的服务,电脑竟然乖乖的帮我打开了浏览器,100行源码揭秘!

    1. 前言 大家好,我是若川.最近组织了源码共读活动,感兴趣的可以加我微信 ruochuan12 参与,已进行三个月了,大家一起交流学习,共同进步. 想学源码,极力推荐之前我写的<学习源码整体架 ...

  6. via浏览器简洁主页html源码 支持搜索提示

    简介: via浏览器简洁主页源码支持搜索提示,扒的一个简洁好看的via浏览器主页源码,纯html+js无后端源码分享给大家,放到服务器即可运行. 网盘下载地址: http://kekewl.cc/AL ...

  7. 用你的浏览器来静态分析网站源码——初级漏洞赏金猎人指南

    原文链接:https://medium.com/@_bl4de/how-to-perform-the-static-analysis-of-website-source-code-with-the-b ...

  8. html5+php视频播放器,一个好用的html视频播放器兼容主流浏览器

    最近工作上的需求需要对移动客户端上发送的视频在网页上播放,and 上传视频并在网页上播放(例如上传教学视频或者动态分享等)(博主碎碎念:移动客户端上传的你不会用手机的播放器看啊,网页上上传你不会上传到 ...

  9. js 下载Base64格式数据图片(兼容主流浏览器)

    最近的工作内容和前端有关.需要做一个图片下载的功能,然而后台只提供了byte[]  类型的图片数据,并且返回给前端的是Base64格式图片数据.那么,就遇到了最严重的问题了:浏览器兼容. 展示图片的时 ...

  10. 浏览器打开jsp显示源码

    这是我所遇到的情况,并不适用于所有人 我在发现显示源码,无法编译为html语言后,网上百度了很多方法都无法解决问题 只能在eclipse里面运行出来 而网页只显示源码 最后是解决了,问的老师,过程辛酸 ...

最新文章

  1. Hadoop API文档地址
  2. Angular动态创建组件之Portals
  3. php alert弹框按钮,PHP 实现类似js中alert() 提示框
  4. trace--求矩阵的迹
  5. OAuth2.0学习(1-1)OAuth2.0是什么?
  6. GraphPad Prism 的统计显著性报告中*或**或**的含义是什么?
  7. OpenCASCADE:使用扩展数据交换 XDE之保存视图
  8. 判断单链表中的元素是否递增_检测单链表中是否有环(C语言)
  9. python—PIL使用
  10. 设计模式之十三:适配器模式(Adapter)
  11. C语言游戏开发——打飞机游戏1.0
  12. DroidCam使用安卓手机当电脑摄像头
  13. JDK8下载 (jdk-8u271-windows-x64和jdk-8u271-linux-x64.tar)
  14. 同样硬件安装不同操作系统:Win7和Win10对于同一段程序源码的编译速度不同
  15. 亚马逊运营实用教程 上线前三个月如何做
  16. 关闭防火墙步骤(详细)
  17. mysql日期函数之DATEDIFF() if()用法 case when用法
  18. 可扩展标记语言XML(淅淅沥沥的小雨)
  19. 三跨考研浙江大学计算机,“三跨”考研的焦虑 你能承受多少
  20. js执行oracle函数吗,执行javascript函数

热门文章

  1. 亿级流量架构演进实战 | 架构演进构建TCP长连接网关 04
  2. 中国水质监测行业经营模式分析与未来发展环境研究报告2022~2028年
  3. vscode之神级插件整理(持续更新)
  4. 上海宝付分享面试之前这四点一定要准备好
  5. mysql中中decode用法_MySQL 中的 DECODE 函数的实现
  6. Kerberos协议探索系列之扫描与爆破篇
  7. 看看韩国超人气美女李贞贤?
  8. 红外接收二极管(摘自百度百科)
  9. 常见的鼠标问题和解决方法
  10. 无线投屏服务器连接不上去,极速投屏连接成功了为什么投不上去