完美实现仿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 相关文章推荐
两个listbox实现选项的添加删除和搜索
Mar 01 Javascript
js 实现日期灵活格式化的小例子
Jul 14 Javascript
js 判断一组日期是否是连续的简单实例
Jul 11 Javascript
JS实现拖动滚动条评分的效果代码分享
Sep 29 Javascript
基于Node.js的WebSocket通信实现
Mar 11 Javascript
webpack2.0搭建前端项目的教程详解
Apr 05 Javascript
js弹性势能动画之抛物线运动实例详解
Jul 27 Javascript
jQuery Collapse1.1.0折叠插件简单使用
Aug 28 jQuery
node 利用进程通信实现Cluster共享内存
Oct 27 Javascript
js调用设备摄像头的方法
Jul 19 Javascript
Element MessageBox弹框的具体使用
Jul 27 Javascript
Vue父子组件传值的一些坑
Sep 16 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与数据库代码开发规范
2013/08/08 PHP
php面向对象中static静态属性和静态方法的调用
2015/02/08 PHP
PHP如何通过传引用的思想实现无限分类(代码简单)
2015/10/13 PHP
php安全配置记录和常见错误梳理(总结)
2017/03/28 PHP
PHP后端银联支付及退款实例代码
2017/06/23 PHP
深入理解 PHP7 中全新的 zval 容器和引用计数机制
2018/10/15 PHP
laravel异步监控定时调度器实例详解
2019/06/21 PHP
js资料toString 方法
2007/03/13 Javascript
JavaScript Archive Network 集合
2007/05/12 Javascript
语义化 H1 标签
2008/01/14 Javascript
谈谈JavaScript中的函数与闭包
2013/04/14 Javascript
jquery动态添加删除一行数据示例
2014/06/12 Javascript
JQuery+Ajax实现数据查询、排序和分页功能
2015/09/27 Javascript
基于Jquery+div+css实现弹出登录窗口(代码超简单)
2015/10/27 Javascript
移动端web滚动分页的实现方法
2017/05/05 Javascript
Node.js 使用命令行工具检查更新
2017/06/08 Javascript
使用vux实现上拉刷新功能遇到的坑
2018/02/08 Javascript
js最实用string(字符串)类型的使用及截取与拼接详解
2019/04/26 Javascript
Vue.js 中的实用工具方法【推荐】
2019/07/04 Javascript
JavaScript canvas绘制渐变颜色的矩形
2020/02/18 Javascript
JavaScript实现轮播图片完整代码
2020/03/07 Javascript
[00:32]2018DOTA2亚洲邀请赛Newbee出场
2018/04/03 DOTA
python通过elixir包操作mysql数据库实例代码
2018/01/31 Python
tensorflow 中对数组元素的操作方法
2018/07/27 Python
利用Python半自动化生成Nessus报告的方法
2019/03/19 Python
解决pycharm下os.system执行命令返回有中文乱码的问题
2019/07/07 Python
HTML5 实现一个访问本地文件的实例
2012/12/13 HTML / CSS
亿企通软件测试面试题
2012/04/10 面试题
中班中秋节活动反思
2014/02/18 职场文书
给校长的建议书
2014/03/12 职场文书
网页美工求职信范文
2014/04/17 职场文书
小学生纪念九一八事变演讲稿
2014/09/14 职场文书
2014年医药代表工作总结
2014/11/22 职场文书
大学生入党自传2015
2015/06/26 职场文书
victoriaMetrics库布隆过滤器初始化及使用详解
2022/04/05 Golang
Python+Selenium实现抖音、快手、B站、小红书、微视、百度好看视频、西瓜视频、微信视频号、搜狐视频、一点号、大风号、趣头条等短视频自动发布
2022/04/13 Python