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类,兼容IE及Firefox
Jun 23 Javascript
JavaScript对数字的判断与处理实例分析
Feb 02 Javascript
Javascript中call和apply函数的比较和使用实例
Feb 03 Javascript
在Linux系统中搭建Node.js开发环境的简单步骤讲解
Jan 26 Javascript
js简单实现图片延迟加载的方法
Jul 19 Javascript
Vue.2.0.5过渡效果使用技巧
Mar 16 Javascript
Vue 2.0 服务端渲染入门介绍
Mar 29 Javascript
微信小程序中多个页面传参通信的学习与实践
May 05 Javascript
微信公众号中的JSSDK接入及invalid signature等常见错误问题分析(全面解析)
Apr 11 Javascript
Vue项目接入Paypal实现示例详解
Jun 04 Javascript
Vue Element校验validate的实例
Sep 21 Javascript
javascript实现电商放大镜效果
Nov 23 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
下拉列表多级联动dropDownList示例代码
2013/06/27 PHP
php ImageMagick windows下安装教程
2015/01/26 PHP
php中define用法实例
2015/07/30 PHP
Symfony2安装的方法(2种方法)
2016/02/04 PHP
PHP排序算法之冒泡排序(Bubble Sort)实现方法详解
2018/04/20 PHP
php实现的顺序线性表示例
2019/05/04 PHP
Dom与浏览器兼容性说明
2010/10/25 Javascript
JS 跳转页面延迟2种方法
2013/03/29 Javascript
使用 JavaScript 进行函数式编程 (一) 翻译
2015/10/02 Javascript
轻松实现js图片预览功能
2016/01/18 Javascript
JS控制弹出悬浮窗口(一览画面)的实例代码
2016/05/30 Javascript
标准的js无缝滚动效果
2016/08/30 Javascript
jquery获取easyui日期控件的值实现方法
2016/11/09 Javascript
基于jQuery实现Accordion手风琴自定义插件
2020/10/13 Javascript
详解nodejs中exports和module.exports的区别
2017/02/17 NodeJs
基于jQuery实现一个marquee无缝滚动的插件
2017/03/09 Javascript
JavaScript实现离开页面前提示功能【附jQuery实现方法】
2017/09/26 jQuery
基于ajax和jsonp的原生封装(实例)
2017/10/16 Javascript
浅谈vue2 单页面如何设置网页title
2017/11/08 Javascript
三分钟教你用Node做一个微信哄女友(基友)神器(面向小白)
2019/06/21 Javascript
小程序实现搜索框
2020/06/19 Javascript
简述Vue中容易被忽视的知识点
2019/12/09 Javascript
微信小程序实现登录注册功能
2020/12/29 Javascript
JS实现简易日历效果
2021/01/25 Javascript
python函数返回多个值的示例方法
2013/12/04 Python
django将图片上传数据库后在前端显式的方法
2018/05/25 Python
python误差棒图errorbar()函数实例解析
2020/02/11 Python
Django DRF路由与扩展功能的实现
2020/06/03 Python
李宁官方网店:中国运动品牌
2017/11/02 全球购物
超级英雄、电影和电视、乐队和音乐T恤:Loud Clothing
2019/09/01 全球购物
十八届三中全会宣传方案
2014/02/21 职场文书
2014年社区个人工作总结
2014/12/02 职场文书
薪资证明范本
2015/06/19 职场文书
本科毕业论文答辩稿
2015/06/23 职场文书
大学军训通讯稿(2016最新版)
2015/12/21 职场文书
Spring中bean的生命周期之getSingleton方法
2021/06/30 Java/Android