• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com专业计算机教程网站
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • html/xhtml
  • html5
  • CSS
  • XML/XSLT
  • Dreamweaver教程
  • Frontpage教程
  • 心得技巧
  • bootstrap
  • vue
  • AngularJS
  • HBuilder教程
  • css3
  • 浏览器兼容
  • div/css
  • 网页编辑器
  • axure
您的位置:首页 > 网页设计 >html5 > 详解微博发言框的@功能

详解微博发言框的@功能

作者:匿名 字体:[增加 减小] 来源:互联网 时间:2018-12-03

本文主要包含HTML5教程,HTML5中国,详解微博发言框的@功能,html5cn,html5资料,html5文章,html5内容,等相关知识,匿名希望在学习及工作中可以帮助到您
经常使用微博的人会发现,当我们在输入框输入@然后敲一个人的名字,会弹出一个tip提示层,如图所示:

weibo.jpg



出于对这个功能的好奇,并抱着学习的态度,翻阅了一些资料后对这个Javascript进行了探讨和研究。
对这个功能进行分析如下:

1、确定光标的位置

2、textarea文本框里对字符串@的判断

3、tip的弹出事件

4、键盘的操作事件

5、ajax调用

6、文字的插入

......

当然还有其他的功能。

看着是不是感觉很复杂?没关系,我们一步一步的分析。

首先我们要确定textarea的光标位置。在W3C中,获取光标位置比较简单,可以用selectionStart和selectionEnd,IE浏览器不支持这2个属性 ,但是IE又一个document.selection对象,可以模拟实现相同的功能。代码如下:


  • function demonAt(opts) {
  • this.elem=opts.elem; //文本框
  • this.at= {}; //临时保存文本框内容截取属性
  • this.opt= {};
  • this.searched=""; //用于判断用户输入字符是否和前面一样,如果一样跳过ajax
  • this.url=opts.url;
  • this.index=1;
  • }
  • //微博的@功能
  • demonAt.prototype= {
  • getCursor: function(elem) {
  • var _this=this;
  • var rangeData = {
  • start: 0,
  • end: 0,
  • text: ""
  • };
  • if(typeof(this.elem.selectionStart)=="number") {//W3C
  • rangeData.start=this.elem.selectionStart;//光标起始位置
  • rangeData.end=this.elem.selectionEnd;//光标末尾位置
  • rangeData.text=this.elem.value.substring(0,this.elem.selectionStart);//获取文本框value
  • } else if (document.selection) {//IE
  • var sRange=document.selection.createRange();
  • var oRange=document.body.createTextRange();
  • oRange.moveToElementText(this.elem);
  • rangeData.text=sRange.text;
  • rangeData.bookmark = sRange.getBookmark();
  • for(i=0;oRange.compareEndPoints("StartToStart",sRange)< 0 && sRange.moveStart("character", -1) !== 0; i ++) {
  • if (this.elem.value.charAt(i) == '\r') {
  • i ++;//IE的特殊处理,遇到enter键需要加1
  • }
  • }
  • rangeData.start=i;
  • rangeData.end = rangeData.text.length + rangeData.start;
  • rangeData.text=this.elem.value.substring(0,i);
  • }
  • //alert(rangeData.text)
  • return rangeData;
  • },
  • setCursor: function(elem,start,end) {//设置光标
  • if(this.elem.setSelectionRange) {//W3C
  • this.elem.setSelectionRange(start,end);
  • } else if(this.elem.createRange) {//IE
  • var range=this.elem.createRange();
  • if(this.elem.value.length==rangeData.start) {
  • range.collapse(false);
  • range.select();
  • } else {
  • range.moveToBookmark(rangeData.bookmark);
  • range.select();
  • }
  • }
  • },
  • add: function(elem,txtData,nStart, nLen) {//插入文本参数操作的元素,数据,起始坐标位置,用户输入字符长度
  • //this.setCursor(this.elem,this.rangeData);
  • this.elem.focus();
  • var _range;
  • if(this.elem.setSelectionRange) {//W3C
  • _tValue=this.elem.value;//获取文本框内容
  • var _start = nStart - nLen,//设置光标起点光标的位置-离@的文本长度
  • _end = _start + txtData.length,//设置光标末尾,start+数据文字长度
  • _value=_tValue.substring(0,_start)+txtData+" "+_tValue.substring(nStart, this.elem.value.length);
  • this.elem.value=_value;
  • this.setCursor(this.elem,_end+1,_end+1);
  • } else if(this.elem.createTextRange) {
  • _range=document.selection.createRange();
  • _range.moveStart("character", -nLen);//移动光标
  • _range.text = txtData+" ";
  • }
  • }
  • }
  • 复制代码

    自定义一个rangeData对象,保存光标的位置和textarea框内从光标位置到开始处的字符串;返回出来。这个对象在下面其他函数中会用到。根据光标位置的确定,可以书写文字插入函数add();有了上面的函数,我们可以对textarea框内@的字符判断,然后实现tip层定位和弹出,如果判断这个,我们可以用正则:


    那么定位呢,若在textarea内判断是不现实的,因为我们无法获取正确的left和top值,所以这里需要模拟一个div层,将div插入到body 中,定位到与textarea相同的位置,然后获取到textarea内的文字,进行字符串的拆分,加上标签元素,这样可以获取到正确的位置。说的有点绕了,看下面代码能更直观的表达。


    看到这句,很多人应该理解做法,将这段append到上诉定位的div中,这样,我们可以通过标签获取到offset值了。于是我们写下面的代码:


  • init: function() {//首先我们要初始化
  • var _body=$("body");
  • var _div=$("
  • _tip=$("
  • _body.append(_div);
  • _body.append(_tip);
  • var _left=$(this.elem).offset().left+"px",
  • _top=$(this.elem).offset().top+"px",
  • _width=$(this.elem).outerWidth()+"px",
  • _height=$(this.elem).outerHeight()+"px",
  • _lineHeight=$(this.elem).css("line-height"),
  • _style="position:absolute;overflow:hidden;z-index:-9999;line-height:"+_lineHeight+";width:"+_width+";height:"+_height+";left:"+_left+";top:"+_top;
  • _div.attr("style",_style);
  • this.inset();
  • },
  • getAt: function() {
  • var _rangeData=this.getCursor();
  • var k=_value=_rangeData.text.replace(/\r/g,"");//去掉换行符
  • var _reg=/@[^@\s]{1,20}$/g;//正则,获取value值后末尾含有@的并且在20字符内
  • var _string="";
  • if(_value.indexOf("@")>=
  • 0&&_value.match(_reg)) {
  • var _postion=_rangeData.start;
  • var _oValue=_value.match(_reg)[0];//找到value中最后匹配的数据
  • var vReg=new RegExp("^"+_oValue+".*$","m");//跟数据匹配的正则 暂时保留
  • _value=_value.slice(0, _postion); //重写_value 字符串截取 从0截取到光标位置
  • if(/^@[a-zA-Z0-9\u4e00-\u9fa5_]+$/.test(_oValue)&& !/\s/.test(_oValue)) {
  • this.at['m'] = _oValue = _oValue.slice(1);//用户输入的字符 如@颓废小魔,即"颓废小魔"
  • this.at['l'] = _value.slice(0, -_oValue.length - 1); //@前面的文字
  • this.at['r'] = k.slice(_postion - _oValue.length, k.length);//@后面的文字
  • this.at['pos']=_postion;//光标位置
  • this.at['len']=_oValue.length;//光标位置至@的长度,如 @颓废小魔,即"颓废小魔"的长度
  • this.showTip(this.url)
  • } else {//alert(1)
  • this.hiddenTip()
  • }
  • } el
  • 您可能想查找下面的文章:

    • 一款利用html5和css3动画排列人物头像的实例演示
    • html5教程调用绘图api画简单的圆形代码分享
    • html5教程画矩形代码分享
    • html5教程制作简单画板代码分享
    • html5基础教程常用技巧整理
    • html5教程-Canvas入门
    • html5教程画矩形代码分享
    • HTML5晃动DeviceMotionEvent事件
    • HTML5教程之html 5 本地数据库(Web Sql Database)
    • HTML5中对contenteditable属性的解释与规定

    相关文章

    • 2018-12-03谈一谈HTML5本地存储技术_html5教程技巧
    • 2018-12-03html5组织内容
    • 2018-12-03HTML5本地存储之Web Storage应用介绍_html5教程技巧
    • 2018-12-03html5+CSS如何控制Table内外边框和颜色以及大小的图文教程
    • 2018-12-03html5需遵循的6个设计原则_html5教程技巧
    • 2018-12-03html5实现表单的复选框验证
    • 2018-12-03HTML5属性:margin属性的用法实例
    • 2018-12-03HTML5之4__Canvas API: 绘制曲线、变换
    • 2018-12-03用canvas实现图片滤镜效果附演示_html5教程技巧
    • 2018-12-03HTML5中的Article和Section元素认识及使用_html5教程技巧

    文章分类

    • html/xhtml
    • html5
    • CSS
    • XML/XSLT
    • Dreamweaver教程
    • Frontpage教程
    • 心得技巧
    • bootstrap
    • vue
    • AngularJS
    • HBuilder教程
    • css3
    • 浏览器兼容
    • div/css
    • 网页编辑器
    • axure

    最近更新的内容

      • 扁平化的bootstrap
      • 用HTML5制作烟火效果的教程_html5教程技巧
      • html5 meter标签是什么意思?html5 meter度量衡如何改变颜色详解
      • HTML5+CSS3模仿优酷视频截图功能示例
      • 从HTML5移动应用现状谈发展趋势的详细介绍
      • html5中关于div与span html块级元素的详细介绍
      • HTML5 Canvas实现烟花绽放的特效
      • HTML5 标准将把互联网视频扔回到黑暗时代
      • H5设计时的小技巧总结
      • H5做视频直播

    关于我们 - 联系我们 - 免责声明 - 网站地图

    ©2020-2025 All Rights Reserved. linkedu.com 版权所有