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

 更新时间:2015年05月06日 09:22:00   投稿:hebedich  
这篇文章主要介绍了完美实现仿QQ空间评论回复特效,非常的实用,附上实例代码给大家,有需要的小伙伴参考下吧。

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

1.

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

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

2.

像qq空间这种,对回复的人整个删除。本屌感觉这种方式比较好,但这种方式有些兼容性上的细节,这个后面会详细说明。

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

ie8

ie7

ie6就不上图片了,太卡了,都懂得,最后本屌会附上最终例子的,当然也兼容ie6。

下面就说说怎么实现的。

先看看qq空间是怎么做的

chrome

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

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

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

复制代码 代码如下:
button{ border: 0; background:none; }

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

所以还需要加上overflow: visible;

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

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

ie8

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

ie7

ie6

这里针对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>&nbsp;</p>$",'i');
          if(pat.test(this.innerHTML))
            this.innerHTML='';
        }
      };

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

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

题外话

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

之前一直以为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

ff

ie8

ie7

ie6

附上例子下载

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

相关文章

  • xml 与javascript结合的问题解决方法

    xml 与javascript结合的问题解决方法

    xml 与javascript结合的问题解决方法...
    2007-03-03
  • js简易版购物车功能

    js简易版购物车功能

    这篇文章主要为大家分享了js简易版的购物车,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • js电信网通双线自动选择技巧

    js电信网通双线自动选择技巧

    网站打开的速度快是相当重要的baidu.com不管你是用的什么网络,都打开的很快
    2008-11-11
  • uniapp中常用的事件处理方法详解

    uniapp中常用的事件处理方法详解

    在UniApp中事件处理非常重要,通过事件处理可以实现用户与应用程序之间的交互,这篇文章主要给大家介绍了关于uniapp中常用的事件处理方法的相关资料,需要的朋友可以参考下
    2023-12-12
  • JS中filter( )数组过滤器的使用

    JS中filter( )数组过滤器的使用

    这篇文章主要介绍了filter() 数组过滤的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-11-11
  • js全选实现和判断是否有复选框选中的方法

    js全选实现和判断是否有复选框选中的方法

    这篇文章主要介绍了js全选实现和判断是否有复选框选中的方法,涉及javascript操作复选框的技巧,非常具有实用价值,需要的朋友可以参考下
    2015-02-02
  • uniapp页面回到顶部两种实现方法

    uniapp页面回到顶部两种实现方法

    这篇文章主要给大家介绍了关于uniapp页面回到顶部两种实现方法的相关资料,在uniapp中要实现回到顶部的效果有两种方法实现,文中给出了详细的代码示例,需要的朋友可以参考下
    2023-08-08
  • JS实现两个大数(整数)相乘

    JS实现两个大数(整数)相乘

    大数,即超出语言所能表示的数字最大范围的数字,那么如何实现两个大数相乘呢?下面有个不错的方法,大家可以参考下
    2014-04-04
  • 微信小程序实现简单搜索框

    微信小程序实现简单搜索框

    这篇文章主要为大家详细介绍了微信小程序实现简单搜索框,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • JS Input里添加小图标的两种方法

    JS Input里添加小图标的两种方法

    大家在做网站的时候,经常需要在input里面添加小图标功能,看似功能很简单,但是实现起来还是有点技巧的,下面小编给大家介绍下JS Input里添加小图标的两种方法,需要的朋友参考下吧
    2017-11-11

最新评论