可能许多朋友会对新浪微博和沪江碎碎里,敲入@时弹出用户列表的功能是如何实现的比较困惑。

其中,最难解决的问题应该就是获取当前光标据文本框的相对位置了。因为一个普通的<textarea></textarea>通过正常的途径是无法获取到的。

那怎么办呢~

第一步:创建一个普通的TextArea框,然后在TextArea外层套一个DIV(DIV的Position设为relative,到时候会根据这个div来定位弹出框的位置)

第二步:创建一个与TextArea 同样尺寸的DIV(这个DIV在什么位置无所谓)在此我先称其为div_textarea。

注意:该DIV的所使用的字体,文字的大小,行间距等都要与文本框里所使用的一致。然后将 div_textarea 的Position也设为relative,visibility设为hidden(这个是背后操作的,当然不能让人看到啦)

说明:该DIV的作用就是用来获取输入@时光标的相对位置的。

结构如下:

第三步:脚本获取相对位置

操作: 当用户输入@了,通过脚本自动将文本框里的这些字符复制到 div_textarea 里,然后获取当前文本框光标在第几个字的后面,获得后在@相当于文本框的同样位置,插入<span class="nowpos"></span>(该span和@的相对位置应该是一样的)。

插入完后,那只要获得这个span离 div_textarea 的相对位置,就知道@离文本框的位置了。

获得相对位置了

看个js实现代码

所以还是原版放在这里吧。

varstart=0;  varend=0;  functionadd(){  vartextBox=document.getElementById("ta");  varpre=textBox.value.substr(0,start);  varpost=textBox.value.substr(end);  textBox.value=pre+document.getElementById("inputtext").value+post;  }  functionsavePos(textBox){  //如果是Firefox(1.5)的话,方法很简单  if(typeof(textBox.selectionStart)=="number"){  start=textBox.selectionStart;  end=textBox.selectionEnd;  }  //下面是IE(6.0)的方法,麻烦得很,还要计算上'n'  elseif(document.selection){  varrange=document.selection.createRange();  if(range.parentElement().id==textBox.id){  //createaselectionofthewholetextarea  varrange_all=document.body.createTextRange();  range_all.moveToElementText(textBox);  //两个range,一个是已经选择的text(range),  一个是整个textarea(range_all)  //range_all.compareEndPoints()比较两个端点,  如果range_all比range更往左(furthertotheleft),  则//返回小于0的值,则range_all往右移一点,直到两个range的start相同。  //calculateselectionstartpointbymovingbeginningofrange_alltobeginningofrange  for(start=0;range_all.compareEndPoints("StartToStart",range)<0;start++)range_all.moveStart('character',1);  //getnumberoflinebreaksfromtextareastarttoselectionstartandaddthemtostart  //计算一下n  for(vari=0;i<=start;i++){  if(textBox.value.charAt(i)=='n')  start++;  }  //createaselectionofthewholetextarea  varrange_all=document.body.createTextRange();  range_all.moveToElementText(textBox);  //calculateselectionendpointbymovingbeginningofrange_alltoendofrange  for(end=0;range_all.compareEndPoints('StartToEnd',range)<0;end++)  range_all.moveStart('character',1);  //getnumberoflinebreaksfromtextareastarttoselectionendandaddthemtoend  for(vari=0;i<=end;i++){  if(textBox.value.charAt(i)=='n')  end++;  }  }  }  document.getElementById("start").value=start;  document.getElementById("end").value=end;  }  下面是在页面中调用js代码的方法:<formactionformaction="a.cgi"> <tablebordertableborder="1"cellspacing="0"cellpadding="0"> <tr> <td>start:<inputtypeinputtype="text"id="start"size="3"/></td> <td>end:<inputtypeinputtype="text"id="end"size="3"/></td> </tr> <tr> <tdcolspantdcolspan="2"> <textareaidtextareaid="ta"onKeydown="savePos(this)"  onKeyup="savePos(this)" onmousedown="savePos(this)" onmouseup="savePos(this)" onfocus="savePos(this)" rows="14"cols="50"></textarea> </td> </tr> <tr> <td><inputtypeinputtype="text"id="inputtext"/></td> <td><inputtypeinputtype="button"onClick="add()"value="AddText"/></td> </tr> </table> </form>

转自:http://www.111cn.net/wy/js-ajax/38581.htm

转载于:https://www.cnblogs.com/liuensong/archive/2012/11/30/10140388.html

js TextArea获取光标详解说明与实例相关推荐

  1. SpringSecurity的安全认证的详解说明(附完整代码)

    SpringSecurity登录认证和请求过滤器以及安全配置详解说明 环境 系统环境:win10 Maven环境:apache-maven-3.8.6 JDK版本:1.8 SpringBoot版本:2 ...

  2. react/antd实现textarea获取光标位置在光标处插入文字

    react/antd实现textarea获取光标位置在光标处插入文字 1.首先将textarea对象通过refs存起来 <TextArearef={(input) => this.cont ...

  3. 深度学习卷积神经网络CNN之 VGGNet模型主vgg16和vgg19网络模型详解说明(理论篇)

    1.VGG背景 2. VGGNet模型结构 3. 特点(创新.优缺点及新知识点) 一.VGG背景    VGGNet是2014年ILSVRC(ImageNet Large Scale Visual R ...

  4. JavaScript 中获取光标位置

    1.概念和原理 DOM中并没有直接获取光标位置的方法,那么我们只能间接来获取光标位置.DOM支持获取光标选中的范围,我们可以以此为切入点,来获取或定位光标的位置,当选取范围起始点和结束点一样时,就是光 ...

  5. contentEditable,window.getSelection详解---可编辑div,容器,设置/获取光标位置,光标处插入内容及光标的操作

    这周碰到一个东西,contentEditable ,它是用来指定一个元素是否是可编辑的,这也是富文本编辑器实现的底层支持,网上关于这部分东西的资料比较少或者不全,所以我来整理下关于这个属性,和可编辑区 ...

  6. js获取光标,设置光标位置

    直接贴代码,作为日常开发笔记 /* 设置光标位置* @params {Object} ele 输入框元素* @params {Number} pos 需要将光标设置的位置* @author *** 2 ...

  7. php获取laydate,详解关于laydate.js加载laydate.css路径错误问题

    laydate.js是属于Javascript系列的一款日期控件与时间插件,laydate.js支持兼容IE6在内的主流浏览器.laydate.js经过贤心大大的重写之后功能越来越强大,用起来也愈渐灵 ...

  8. php调用win32 api,C#_c#使用win32api实现获取光标位置,方法一:需要调用win32api,winfo - phpStudy...

    c#使用win32api实现获取光标位置 方法一:需要调用win32api,winform.wpf通用 [DllImport("user32.dll")] public stati ...

  9. js textarea焦点事件,CodeMirror焦点事件

    1,效果图 2,功能说明 当我把光标放在[指标对象]的控件框的时候,双击[字段名称],则字段数据写入指标对象控件框 当我把光标放在[指标维度]的控件框的时候,双击[字段名称],则字段数据写入指标维度控 ...

  10. javascript 获取光标所选中的内容并插入到另一个文本框中(兼容ie和ff)

    项目中正好用到 做下笔记方便以后查找 ie获取光标的位置使用document.selection.createRange() 火狐下使用document.getElementById(id).sele ...

最新文章

  1. PHP也玩并发,巧用curl 并发减少后端访问时间
  2. Windows Phone7天初学(4):数据绑定
  3. golang经典书籍--Go语言实战
  4. 意法半导体STM32 ARM Cortex 32位微控制器
  5. Jquery中绑定select的change事件自动填充input的value值
  6. python进程监控及恢复
  7. 信息学奥赛一本通 2037:【例5.4】约瑟夫问题 | 1334:【例2-3】围圈报数 | 洛谷 P1996 约瑟夫问题
  8. 英伟达或正与软银就收购ARM深入谈判,交易价值超过320亿
  9. 温湿度服务器系统软件,无线温湿度监测系统
  10. ug链轮设计软件_正版UG软件,UG软件代理,正版UG软件模块功能介绍
  11. 5. DICOM图像层级分类-DCMTK-压缩图像PixelData读取
  12. 渗透测试技术----工具使用(二)--Nessus工具下载及使用(安装在Kali上)
  13. 微众银行电话面试java_微众银行面试经验
  14. 转载:SolidWorks 2014 安装完成破解成功,用过一段时间后提示重新激活(win10系统)...
  15. 音频、音频属性-采样精度、比特率、音频格式
  16. 银色 MacBook Pro 13.3笔记本
  17. NFC:跟现金和信用卡说不
  18. C/C++ 如何调用Lua脚本,Windows以及Linux版本演示
  19. 公共WIFI上网短信认证解决方案
  20. dns按来路ip智能解析_求助DNS问题,如何根据来源Ip地址作策略,使不同来源的IP地址解析到不同地址?...

热门文章

  1. 先验概率与后验概率的区别
  2. opencv常用函数整理(一)
  3. Steinberg Cubase Elements 11 for Mac(音频处理软件)
  4. Paint的方法总结(一):基本常用Api
  5. linux目录结构和份文件系统
  6. 图片处理和验证码识别
  7. 如果奇迹有颜色,那么一定是暴力or模拟比较6
  8. 第九章:SpringCloud Feign几个坑
  9. Linux如何从零开始搭建rsync服务器(centOS6)
  10. Linux小技巧:生成随机字符串