完美实现仿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 相关文章推荐
js计算页面刷新的次数
Jul 20 Javascript
node.js实现BigPipe详解
Dec 05 Javascript
JavaScript实现表格快速变色效果代码
Aug 19 Javascript
javascript获取系统当前时间的方法
Nov 19 Javascript
js与jquery正则验证电子邮箱、手机号、邮政编码的方法
Jul 04 Javascript
基于Vue.js实现简单搜索框
Mar 26 Javascript
js 博客内容进度插件详解
Feb 19 Javascript
js实现字符全排列算法的简单方法
May 01 Javascript
实时监控input框,实现输入框与下拉框联动的实例
Jan 23 Javascript
Vue $mount实战之实现消息弹窗组件
Apr 22 Javascript
vue实现的请求服务器端API接口示例
May 25 Javascript
Vue vee-validate插件的简单使用
Jun 22 Vue.js
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下使用SimpleXML 处理XML 文件
2010/02/27 PHP
PHP设计模式之责任链模式的深入解析
2013/06/13 PHP
PHP随机字符串生成代码(包括大小写字母)
2013/06/24 PHP
用window.location.href实现刷新另个框架页面
2007/03/07 Javascript
javascript写的一个链表实现代码
2009/10/25 Javascript
基于jQuery的消息提示插件之旅 DivAlert(三)
2010/04/01 Javascript
jQuery.clean使用方法及思路分析
2013/01/07 Javascript
javascript函数作用域学习示例(js作用域)
2014/01/13 Javascript
js实现横向百叶窗效果网页切换动画效果的方法
2015/03/02 Javascript
JavaScript函数使用的基本教程
2015/06/04 Javascript
javascript中日期函数new Date()的浏览器兼容性问题
2015/09/05 Javascript
详细分析Javascript中创建对象的四种方式
2016/08/17 Javascript
微信小程序 textarea 详解及简单使用方法
2016/12/05 Javascript
video.js使用改变ui过程
2017/03/05 Javascript
vue click.stop阻止点击事件继续传播的方法
2018/09/04 Javascript
vue 父组件中调用子组件函数的方法
2019/06/06 Javascript
纯JS实现五子棋游戏
2020/05/28 Javascript
python连接字符串的方法小结
2015/07/13 Python
Python遍历目录中的所有文件的方法
2016/07/08 Python
python 创建弹出式菜单的实现代码
2017/07/11 Python
python中hashlib模块用法示例
2017/10/30 Python
python实现二叉树的遍历
2017/12/11 Python
Python和Java进行DES加密和解密的实例
2018/01/09 Python
Django实现分页功能
2018/07/02 Python
python按修改时间顺序排列文件的实例代码
2019/07/25 Python
PyQtGraph在pyqt中的应用及安装过程
2019/08/04 Python
详解python 降级到3.6终极解决方案
2020/02/06 Python
Python连接Oracle之环境配置、实例代码及报错解决方法详解
2020/02/11 Python
matplotlib.pyplot.matshow 矩阵可视化实例
2020/06/16 Python
scrapy与selenium结合爬取数据(爬取动态网站)的示例代码
2020/09/28 Python
html5中audio支持音频格式的解决方法
2018/08/24 HTML / CSS
沙特阿拉伯网上购物:Sayidaty Mall
2018/05/06 全球购物
新西兰便宜隐形眼镜购买网站:QUICKLENS New Zealand
2019/03/02 全球购物
集体婚礼证婚词
2014/01/13 职场文书
加油口号大全
2014/06/13 职场文书
sql注入教程之类型以及提交注入
2021/08/02 MySQL