完美实现仿QQ空间评论回复特效


Posted in Javascript onMay 06, 2015

评论回复是个很常见的东西,但是各大网站实现的方式却不尽相同。大体上有两种方式

1.

完美实现仿QQ空间评论回复特效

像优酷这种最常见,在输入框中@要回复的人,这种方式下,用户可以修改@。

新浪微博则是在这个基础上,弹出好友菜单。这种方式的好处是不需要任何js,css处理兼容。

完美实现仿QQ空间评论回复特效

2.

完美实现仿QQ空间评论回复特效

像qq空间这种,对回复的人整个删除。本?鸥芯跽庵址绞奖冉虾茫??庵址绞接行┘嫒菪陨系南附冢?飧龊竺婊嵯晗杆得鳌?/p>

事实上,qq空间的这种实现在效果上是兼容了ie和现代浏览器的,做的非常好。上面是chrome

ie8

完美实现仿QQ空间评论回复特效

ie7

完美实现仿QQ空间评论回复特效

ie6就不上图片了,太卡了,都懂得,最后本?呕岣缴献钪绽?拥模?比灰布嫒?e6。

下面就说说怎么实现的。

先看看qq空间是怎么做的

chrome

完美实现仿QQ空间评论回复特效

上面可以看到,qq空间是在button中加上文字,这样在删除的时候对被回复的用户名就能整个删除了。

不过这样做还不够,首先是样式,需要把button设置成inline-block,

消除button默认的透明背景,边框,当然还有padding,margin设为0

button{ border: 0; background:none; }

这时在ie6,7中插入会发现,似乎还存在padding,而且还很大

完美实现仿QQ空间评论回复特效

完美实现仿QQ空间评论回复特效

所以还需要加上overflow: visible;

另外属性contenteditable设置成为false,否则光标会跳到button里面,

然后在ie8下会发现,输入的时候如果有回车,然后在依次删除的过程中,会发现button标签删不掉,光标会跑到button标签前面,而且再次按右光标键或用鼠标点击button标签右边都无法让光标跑到button标签右边。事实上,qq空间在ie8中也有这个问题

ie8

完美实现仿QQ空间评论回复特效

而在ie6,7下,就没有这个问题

ie7

完美实现仿QQ空间评论回复特效

ie6

完美实现仿QQ空间评论回复特效

这里针对ie8需要对文本框绑定keydown事件回调check_comment,对ie6,7绑定了也没有问题,这里就统一的对ie绑定。

function getPositionForTextArea(ctrl) { //获取光标位置
      var CaretPos = 0; 
      if(document.selection) {
        ctrl.focus(); 
        var Sel = document.selection.createRange(); 
        var Sel2 = Sel.duplicate(); 
        Sel2.moveToElementText(ctrl); 
        var CaretPos = -1; 
        while(Sel2.inRange(Sel)){ 
          Sel2.moveStart('character'); 
          CaretPos++; 
        } 
      }else if(ctrl.selectionStart || ctrl.selectionStart == '0'){
        CaretPos = ctrl.selectionStart; 
      } 
      return (CaretPos); 
    }
      vm.check_comment=function(e,i){
        var a=getPositionForTextArea($('reply'+i));
        if(e.keyCode==8&&a<3){
          var pat = new RegExp("^<p><button .*?>.*?</button> </p>$",'i');
          if(pat.test(this.innerHTML))
            this.innerHTML='';
        }
      };

光标位置<3表明光标前面就是button标签了,这时就可以清空输入框了。注意这里为了严谨,用正则表达式验证是不是button标签.

另外在正则表达式中button标签外包裹p标签,是因为ie在按回车换行时,会默认自动对前面的行包裹p标签。当然,一开始在输入框也要在button标签外包裹p标签。

完美实现仿QQ空间评论回复特效

题外话

qq空间在ff上用的是img标签

完美实现仿QQ空间评论回复特效

之前一直以为qq空间在现代浏览器上统一用的是img标签,写的时候才发现在chrome中用的是button标签,于是就在chrome下试了一下插入img标签,发现怎么也弄不掉边框,而且删除的时候,绑定中光标位置的判断也会和ie不一致,因为现代浏览器换行默认插入<br>,于是索性对chrome也用button标签。

另外在我的例子中,ff中插入button标签的话,输入框不容易获得焦点。本?乓怖恋萌ジ牧?仍然是在ff中插入img标签,对应的keydown回调

if(!!-[1,]&&e.keyCode==8&&$('reply'+i).childNodes.length==2){//ff
          this.innerHTML='';
          return;
        }

只用判断输入框的子节点个数就可以了。

最终效果

chrome

完美实现仿QQ空间评论回复特效

ff

完美实现仿QQ空间评论回复特效

ie8

完美实现仿QQ空间评论回复特效

ie7

完美实现仿QQ空间评论回复特效

ie6

完美实现仿QQ空间评论回复特效

附上例子下载

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
如何实现textarea里的不同文本显示不同颜色
Jan 20 Javascript
JavaScript函数详解
Feb 27 Javascript
简介JavaScript中的setTime()方法的使用
Jun 11 Javascript
javascript判断网页是关闭还是刷新
Sep 12 Javascript
javascript运算符语法全面概述
Jul 14 Javascript
移动端点击态处理的三种实现方式
Jan 12 Javascript
JavaScript纯色二维码变成彩色二维码
Jul 23 Javascript
JavaScript实现鼠标滚轮控制页面图片切换功能示例
Oct 14 Javascript
VUE中v-on:click事件中获取当前dom元素的代码
Aug 22 Javascript
vue路由事件beforeRouteLeave及组件内定时器的清除方法
Sep 29 Javascript
JS实现鼠标拖拽盒子移动及右键点击盒子消失效果示例
Jan 29 Javascript
微信小程序rich-text富文本用法实例分析
May 20 Javascript
jQuery实现鼠标单击网页文字后在文本框显示的方法
May 06 #Javascript
js实现点击按钮后给Div图层设置随机背景颜色的方法
May 06 #Javascript
JS实现CheckBox复选框全选全不选功能
May 06 #Javascript
javascript使用avalon绑定实现checkbox全选
May 06 #Javascript
js实现滑动触屏事件监听的方法
May 05 #Javascript
JS根据生日算年龄的方法
May 05 #Javascript
js改变Iframe中Src的方法
May 05 #Javascript
You might like
用 PHP5 轻松解析 XML
2006/12/04 PHP
PHP音乐采集(部分代码)
2007/02/14 PHP
php中全局变量global的使用演示代码
2011/05/18 PHP
php正则表达式使用的详细介绍
2013/04/27 PHP
Codeigniter发送邮件的方法
2015/03/19 PHP
php实现向javascript传递数组的方法
2015/07/27 PHP
详解php中反射的应用
2016/03/15 PHP
php使用SAE原生Mail类实现各种类型邮件发送的方法
2016/10/10 PHP
PHP7扩展开发之基于函数方式使用lib库的方法详解
2018/01/15 PHP
广告显示判断
2006/08/31 Javascript
javascript 单选框,多选框美化代码
2008/08/01 Javascript
JQuery Easyui Tree的oncheck事件实现代码
2010/05/28 Javascript
利用谷歌地图API获取点与点的距离的js代码
2012/10/11 Javascript
jQuery对html元素取值与赋值的方法
2013/11/20 Javascript
js获取和设置属性的方法
2014/02/20 Javascript
使用jquery中height()方法获取各种高度大全
2014/04/02 Javascript
Node.js实现在目录中查找某个字符串及所在文件
2014/09/03 Javascript
jQuery表单验证功能实例
2015/08/28 Javascript
jQuery基于cookie实现的购物车实例分析
2015/12/24 Javascript
纯js实现瀑布流布局及ajax动态新增数据
2016/04/07 Javascript
再谈Javascript中的基本类型和引用类型(推荐)
2016/07/01 Javascript
轻松掌握JavaScript装饰者模式
2016/08/27 Javascript
Web 开发中Ajax的Session 超时处理方法
2017/01/19 Javascript
Vue.js实现微信过渡动画左右切换效果
2017/06/13 Javascript
vue实现单选和多选功能
2017/08/11 Javascript
nodejs实现简单的gulp打包
2017/12/21 NodeJs
vue加载自定义的js文件方法
2018/03/13 Javascript
vue中根据时间戳判断对应的时间(今天 昨天 前天)
2019/12/20 Javascript
Python把csv数据写入list和字典类型的变量脚本方法
2018/06/15 Python
Python交互环境下实现输入代码
2018/06/22 Python
Python实现提取XML内容并保存到Excel中的方法
2018/09/01 Python
第二层交换机和路由器的区别?第三层交换机和路由器的区别?
2013/05/23 面试题
高中生学习总结的自我评价范文
2013/10/13 职场文书
房地产开发项目建议书
2014/05/16 职场文书
房地产置业顾问工作总结
2015/10/23 职场文书
python实现MD5进行文件去重的示例代码
2021/07/09 Python