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 相关文章推荐
jQueryUI如何自定义组件实现代码
Nov 14 Javascript
js弹窗返回值详解(window.open方式)
Jan 11 Javascript
innerHTML动态添加html代码和脚本兼容多个浏览器
Oct 11 Javascript
JS数组array元素的添加和删除方法代码实例
Jun 01 Javascript
js 实现一些跨浏览器的事件方法详解及实例
Oct 27 Javascript
js实现微博发布小功能
Jan 12 Javascript
轻松实现jQuery添加删除按钮Click事件
Mar 13 Javascript
原JS实现banner图的常用功能
Jun 12 Javascript
简单理解Vue中的nextTick方法
Jan 30 Javascript
vue2.0的虚拟DOM渲染思路分析
Aug 09 Javascript
Node.js利用Express实现用户注册登陆功能(推荐)
Oct 26 Javascript
vue 解决mintui弹窗弹起来,底部页面滚动bug问题
Nov 12 Javascript
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
微信公众平台接口开发入门示例
2014/12/24 PHP
浅谈关于JavaScript的语言特性分析
2013/04/11 Javascript
javascript轻松实现当鼠标移开时已弹出子菜单自动消失
2013/12/29 Javascript
jquery中load方法的用法及注意事项说明
2014/02/22 Javascript
JavaScript事件委托的技术原理探讨示例
2014/04/17 Javascript
Javascript 数组排序详解
2014/10/22 Javascript
基于jQuery和CSS3制作数字时钟附源码下载(jquery篇)
2015/11/24 Javascript
angular+ionic 的app上拉加载更新数据实现方法
2017/01/16 Javascript
解决IE7中使用jQuery动态操作name问题
2017/08/28 jQuery
浅谈Webpack 持久化缓存实践
2018/03/22 Javascript
详解Javascript中new()到底做了些什么?
2018/03/29 Javascript
element UI upload组件上传附件格式限制方法
2018/09/04 Javascript
vue实现与安卓、IOS交互的方法
2018/11/02 Javascript
elementUI select组件默认选中效果实现的方法
2019/03/25 Javascript
重置Redux的状态数据的方法实现
2019/11/18 Javascript
vue实现pdf文档在线预览功能
2019/11/26 Javascript
Vue开发环境跨域访问问题
2020/01/22 Javascript
基于Vue CSR的微前端实现方案实践
2020/05/27 Javascript
线程和进程的区别及Python代码实例
2015/02/04 Python
python中self原理实例分析
2015/04/30 Python
分享Python文本生成二维码实例
2016/01/06 Python
详解Python3中字符串中的数字提取方法
2017/01/14 Python
python-itchat 统计微信群、好友数量,及原始消息数据的实例
2019/02/21 Python
python基于plotly实现画饼状图代码实例
2019/12/16 Python
获取CSDN文章内容并转换为markdown文本的python
2020/09/06 Python
利于python脚本编写可视化nmap和masscan的方法
2020/12/29 Python
解决Python import .pyd 可能遇到路径的问题
2021/03/04 Python
Bibloo荷兰:女士、男士和儿童的服装、鞋子和配饰
2019/02/25 全球购物
2014年小学英语教师工作总
2014/12/03 职场文书
捐助倡议书
2015/01/19 职场文书
工程项目合作意向书
2015/05/08 职场文书
离婚起诉书范文2015
2015/05/19 职场文书
党支部对转正的意见
2015/06/02 职场文书
应用最多的公文《通知》如何写?
2019/04/02 职场文书
Windows Server 2016 配置 IIS 的详细步骤
2022/04/28 Servers
解决 redis 无法远程连接
2022/05/15 Redis