js实现的光标位置工具函数示例


Posted in Javascript onOctober 03, 2016

本文实例讲述了js实现的光标位置工具函数。分享给大家供大家参考,具体如下:

这里介绍的一款textarea中光标位置工具函数的例子。

html代码:

<p>文本框:</p>
<textarea name="" id="textarea" cols="30" rows="10">
sASASADASDasfaDFDsfsDFAfdFADf
</textarea>
<button type="button" id="setSelectText">选中特定范围的文本</button>
<button type="button" id="insertAfterText">在光标后插入文本</button>
<br>
<hr>
<br>
<input type="number" name="" id="input">
<button type="button" id="setCurPosBtn">设置光标位置</button>
<br>
<hr>
<br>
<p id="selectText">我是一段可以选中的文字,请打开控制台查看。我是一段可以选中的文字,请打开控制台查看。我是一段可以选中的文字,请打开控制台查看。</p>

js代码:

/**
* 光标位置组件
* ## selectRange对象的方法:
*  (1)selectRange.of(ele)  [创建光标位置获取的新对象]
      参数:
        ele {{JavaScript DOM}} 光标所在的元素,原生JavaScript DOM
*  (2)selectRange.getCurPos()  [获取当前坐标位置]
*  (3)selectRange.setCurPos(pos)  [设置当前光标位置]
      参数:
        pos {{Int}} 当前光标位置
*  (4)selectRange.getSelectText()  [获取选中文字]
*  (5)selectRange.setSelectText(startPos, endPos)  [选中特定范围的文本(只限于textarea和input)]
*      参数:
        startPos {{Int}} 起始位置
        endPos {{Int}} 终点位置
*  (6)selectRange.insertAfterText(value)  [在光标后插入文本]
*      参数:
        value {{String}} 要插入的文本
* 
*
* ## 使用实例:
*    selectRange.of(EleDom).getCurPos(); // 获取当前坐标位置
*    selectRange.of(EleDom).setCurPos(pos); // 设置当前光标位置为pos
*    selectRange.of(EleDom).getSelectText(); // 获取选中文字
*    selectRange.of(EleDom).setSelectText(startPos, endPos); // 选中startPos到endPos范围的文本
*    selectRange.of(EleDom).insertAfterText(value); // 在光标后插入值为value的文本
*/
var selectRange = function(ele){
  this.__element = ele;
};
// 创建光标位置获取的新对象
selectRange.of = function(ele){
  if(ele) {
    return new selectRange(ele);
  } else {
    return {};
  }
};
selectRange.prototype = {
  constructor:selectRange,
  // 获取当前坐标位置
  getCurPos: function() {
    var _this = this,
      textDom = _this.__element;
    // 获取光标位置
    var cursorPos = 0;
    if (document.selection) {
      // IE Support
      textDom.focus();
      var selectRange = document.selection.createRange();
      selectRange.moveStart ('character', -textDom.value.length);
      cursorPos = selectRange.text.length;
    }else if (textDom.selectionStart || textDom.selectionStart == '0') {
      // Firefox support
      cursorPos = textDom.selectionStart;
    }
    return cursorPos;
  },
  /**
  * 设置当前光标位置
  * 参数:
  *   pos [Int] 当前光标位置
  */
  setCurPos: function(pos) {
    var _this = this,
      textDom = _this.__element;
    if(textDom.setSelectionRange) {
      // IE Support
      textDom.focus();
      textDom.setSelectionRange(pos, pos);
    }else if (textDom.createTextRange) {
      // Firefox support
      var range = textDom.createTextRange();
      range.collapse(true);
      range.moveEnd('character', pos);
      range.moveStart('character', pos);
      range.select();
    }
  },
  // 获取选中文字
  getSelectText: function() {
    var _this = this,
      textDom = _this.__element,
      userSelection,
      text = "";
    if (window.getSelection) {
      // Firefox support
      userSelection = window.getSelection();
    } else if (document.selection) {
      // IE Support
      userSelection = document.selection.createRange();
    }
    if (!(text = userSelection.text)) {
      text = userSelection;
    }
    return text;
  },
  /**
  * 选中特定范围的文本(只限于textarea和input)
  * 参数:
  *   startPos [Int] 起始位置
  *   endPos [Int] 终点位置
  */
  setSelectText: function(startPos, endPos) {
    var _this = this,
      textDom = _this.__element,
      startPos = parseInt(startPos),
      endPos = parseInt(endPos),
      textLength = textDom.value.length;
    if(textLength){
      if(!startPos){
        startPos = 0;
      }
      if(!endPos){
        endPos = textLength;
      }
      if(startPos > textLength){
        startPos = textLength;
      }
      if(endPos > textLength){
        endPos = textLength;
      }
      if(startPos < 0){
        startPos = textLength + startPos;
      }
      if(endPos < 0){
        endPos = textLength + endPos;
      }
      if(textDom.createTextRange){
        // IE Support
        var range = textDom.createTextRange();
        range.moveStart("character",-textLength);
        range.moveEnd("character",-textLength);
        range.moveStart("character", startPos);
        range.moveEnd("character",endPos);
        range.select();
      }else{
        // Firefox support
        textDom.setSelectionRange(startPos, endPos);
        textDom.focus();
      }
    }
  },
  /**
  * 在光标后插入文本
  * 参数:
  *   value [String] 要插入的文本
  */
  insertAfterText: function(value) {
    var _this = this,
      textDom = _this.__element,
      selectRange;
    if (document.selection) {
      // IE Support
      textDom.focus();
      selectRange = document.selection.createRange();
      selectRange.text = value;
      textDom.focus();
    }else if (textDom.selectionStart || textDom.selectionStart == '0') {
      // Firefox support
      var startPos = textDom.selectionStart;
      var endPos = textDom.selectionEnd;
      var scrollTop = textDom.scrollTop;
      textDom.value = textDom.value.substring(0, startPos) + value + textDom.value.substring(endPos, textDom.value.length);
      textDom.focus();
      textDom.selectionStart = startPos + value.length;
      textDom.selectionEnd = startPos + value.length;
      textDom.scrollTop = scrollTop;
    }
    else {
      textDom.value += value;
      textDom.focus();
    }
  }
};
// ===============================================
// 实例代码
var textareaDom = document.querySelector("#textarea"),
  setCurPosInput = document.querySelector("#input"),
  setCurPosBtn = document.querySelector("#setCurPosBtn"),
  selectText = document.querySelector("#selectText"),
  setSelectTextBtn = document.querySelector("#setSelectText"),
  insertAfterTextBtn = document.querySelector("#insertAfterText");
// 获取当前光标位置
textareaDom.addEventListener("keydown", function() {
  console.log("getCurPos: " + selectRange.of(textareaDom).getCurPos());
}, false);
// 设置当前光标位置
setCurPosBtn.addEventListener("click", function() {
  var curPos = parseInt(setCurPosInput.value);
  console.log("curPos: " + curPos);
  selectRange.of(textareaDom).setCurPos(curPos);
}, false);
// 获取选中文字
selectText.addEventListener("mouseup", function() {
  console.log("selectText: " + selectRange.of(this).getSelectText());
});
// 选中特定范围的文本
setSelectTextBtn.addEventListener("click", function() {
  selectRange.of(textareaDom).setSelectText(0, 21);
}, false);
// 在光标后插入文本
insertAfterTextBtn.addEventListener("click", function() {
  var insertText = "===hello world, I'm insert content.===";
  selectRange.of(textareaDom).insertAfterText(insertText);
}, false);

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
JS event使用方法详解
Apr 28 Javascript
教你如何使用PHP输出中文JSON字符串
May 22 Javascript
jquery trigger伪造a标签的click事件取代window.open方法
Jun 23 Javascript
深入分析js的冒泡事件
Dec 05 Javascript
javascript实现全角与半角字符的转换
Jan 07 Javascript
老生常谈遮罩层 滚动条的问题
Apr 29 Javascript
jQuery如何防止Ajax重复提交
Oct 14 Javascript
详解AngularJS 模块化
Jun 14 Javascript
Angular2生命周期钩子函数的详细介绍
Jul 10 Javascript
node中的session的具体使用
Sep 14 Javascript
Js 利用正则表达式和replace函数获取string中所有被匹配到的文本(推荐)
Oct 28 Javascript
Jquery滑动门/tab切换实现方法完整示例
Jun 05 jQuery
js获取腾讯视频ID的方法
Oct 03 #Javascript
关于js二维数组和多维数组的定义声明(详解)
Oct 02 #Javascript
微信小程序 navigation API实例详解
Oct 02 #Javascript
微信小程序 获取设备信息 API实例详解
Oct 02 #Javascript
微信小程序 location API实例详解
Oct 02 #Javascript
微信小程序 Storage API实例详解
Oct 02 #Javascript
微信小程序 Video API实例详解
Oct 02 #Javascript
You might like
PHP脚本数据库功能详解(下)
2006/10/09 PHP
浅谈php7的重大新特性
2015/10/23 PHP
微信接口生成带参数的二维码
2017/07/31 PHP
[原创]网络复制内容时常用的正则+editplus
2006/11/30 Javascript
JavaScript 检测浏览器和操作系统的脚本
2008/12/26 Javascript
测试JavaScript字符串处理性能的代码
2009/12/07 Javascript
使用JQUERY进行后台页面布局控制DIV实现左右式
2014/01/07 Javascript
分享一款基于jQuery的视频播放插件
2014/10/09 Javascript
DWR中各种java方法的调用
2016/05/04 Javascript
基于JavaScript实现焦点图轮播效果
2017/03/27 Javascript
JavaScript之map reduce_动力节点Java学院整理
2017/06/29 Javascript
Nodejs连接mysql并实现增、删、改、查操作的方法详解
2018/01/04 NodeJs
nodejs 生成和导出 word的实例代码
2018/07/31 NodeJs
详解React服务端渲染从入门到精通
2019/03/28 Javascript
vue实现简单学生信息管理
2020/05/30 Javascript
原生js实现分页效果
2020/09/23 Javascript
Python 调用VC++的动态链接库(DLL)
2008/09/06 Python
python 调用win32pai 操作cmd的方法
2017/05/28 Python
Python GUI编程 文本弹窗的实例
2019/06/11 Python
Flask框架钩子函数功能与用法分析
2019/08/02 Python
Python如何获取Win7,Win10系统缩放大小
2020/01/10 Python
python 实现线程之间的通信示例
2020/02/14 Python
StubHub美国:购买或出售您的门票
2019/07/09 全球购物
Linux上比较文件的命令都有哪些
2012/02/24 面试题
介绍一下RMI的基本概念
2016/12/17 面试题
JavaScript实现前端网页版倒计时
2021/03/24 Javascript
人力资源专员自我评价怎么写
2013/09/19 职场文书
在校生党员自我评价
2013/09/25 职场文书
大学生党员自我批评
2014/02/14 职场文书
访谈节目策划方案
2014/05/15 职场文书
2014年乡镇党建工作总结
2014/11/11 职场文书
2014-2015学年工作总结
2014/11/27 职场文书
天谕手游15杯全调酒配方和调酒券的获得方式
2022/04/06 其他游戏
Python PIL按比例裁剪图片
2022/05/11 Python
MySQL 自动填充 create_time 和 update_time
2022/05/20 MySQL
MySQL详解进行JDBC编程与增删改查方法
2022/06/16 MySQL