完美实现仿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 相关文章推荐
Javascript实现DIV滚动自动滚动到底部的代码
Mar 01 Javascript
JavaScript代码实现禁止右键、禁选择、禁粘贴、禁shift、禁ctrl、禁alt
Nov 17 Javascript
BootStrap 图片样式、辅助类样式和CSS组件的实例详解
Jan 20 Javascript
Vue生命周期示例详解
Apr 12 Javascript
5分钟打造简易高效的webpack常用配置
Jul 04 Javascript
js es6系列教程 - 新的类语法实战选项卡(详解)
Sep 02 Javascript
Angular实现的进度条功能示例
Feb 18 Javascript
Javascript实现时间倒计时功能
Nov 17 Javascript
element vue validate验证名称重复 输入框与后台重复验证 特殊字符 字符长度 及注意事项小结【实例代码】
Nov 20 Javascript
layer.open 获取不到表单信息的解决方法
Sep 26 Javascript
原生JS实现汇率转换功能代码实例
May 13 Javascript
手把手教你如何编译打包video.js
Dec 09 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
php类的自动加载操作实例详解
2016/09/28 PHP
解决laravel session失效的问题
2019/10/14 PHP
JS查看对象功能代码
2008/04/25 Javascript
js 巧妙去除数组中的重复项
2010/01/25 Javascript
用JS实现一个TreeMenu效果分享
2011/08/28 Javascript
JavaScript对象的property属性详解
2014/04/01 Javascript
JS动态显示表格上下frame的方法
2015/03/31 Javascript
jquery实现简单合拢与展开网页面板的方法
2015/09/01 Javascript
jQuery实现单击弹出Div层窗口效果(可关闭可拖动)
2015/09/19 Javascript
详细探究ES6之Proxy代理
2016/07/22 Javascript
原生JS获取元素集合的子元素宽度实例
2016/12/14 Javascript
纯JS实现弹性导航条效果
2017/03/06 Javascript
深究AngularJS之ui-router详解
2017/06/13 Javascript
JS实现手写parseInt的方法示例
2017/09/24 Javascript
Weex开发之WEEX-EROS开发踩坑(小结)
2019/10/16 Javascript
javascript 设计模式之享元模式原理与应用详解
2020/04/08 Javascript
vue实现div可拖动位置也可改变盒子大小的原理
2020/09/16 Javascript
python thread 并发且顺序运行示例
2009/04/09 Python
python抓取京东价格分析京东商品价格走势
2014/01/09 Python
python根据时间生成mongodb的ObjectId的方法
2015/03/13 Python
TensorFlow实现Batch Normalization
2018/03/08 Python
django连接oracle时setting 配置方法
2019/08/29 Python
使用anaconda安装pytorch的实现步骤
2020/09/03 Python
Python析构函数__del__定义原理解析
2020/11/20 Python
广州品高软件.net笔面试题目
2012/04/18 面试题
如何防止同一个帐户被多人同时登录
2013/08/01 面试题
2014年百日安全生产活动总结
2014/05/04 职场文书
商场消防安全责任书
2014/07/29 职场文书
医德医魂心得体会
2014/09/11 职场文书
纪检干部个人对照检查材料
2014/09/23 职场文书
大三学年自我鉴定范文(3篇)
2014/09/28 职场文书
通知格式
2015/04/27 职场文书
2016年员工政治思想表现评语
2015/12/02 职场文书
幼儿园小班开学寄语(2016秋季)
2015/12/03 职场文书
微信小程序实现拍照和相册选取图片
2021/05/09 Javascript
springboot应用服务启动事件的监听实现
2022/04/06 Java/Android