以前就一直研究jQuery和prototype,从到百度这个来工作开始就一直研究tangram,从那会开始就一直想自己慢慢地积累写一个Lib(以前参与写过一个公司级的toft,情节啊),当然原因只是积累和学习,建议所有前端人士如果你有毅力的话可以自己整理写一个lib,因为在你写的时候,你会发现各种问题,然后你会查阅资料去解决这些问题,这样的提升比你简单地去使用api要好很多。
废话少说,今天贴出的只是最近整理的关于光标的一些api的处理,简单地上传,供各位同学一起学习研究。
/*
**** phoenix lib version 1.0.1 ****
@author zhangyaochun
@just for 87
@baidu fe
@个人博客--http://zhangyaochun.iteye.com/
@info 简单地介绍一下这个库--凤凰
1.what is phoenix---它是本人学习积累的一个库,部分思想来源tangram,prototype,jquery等一些开源框架,采用分离式api设计,没有绝对的核心
2.这个库的目标:第一目标是兼容性-----保证兼容各大浏览器,简单地说就是能用
第二目标是可读性-----保证看到这个库的人能从里面看明白一些东西,从而选择你所需的
下面就是api设计的一致性和前瞻性还有简单性是日后一直追求的
有部分安全性防范的api设计理念,防止代码白跑
3.优化思想 有作用域链的优化思想
独立命名空间下的功能模块,防污染
************************************************************************************************
phoenix.textareaUtil.js这个主要是对于光标的一些操作
api简介:1. getCursorPosition-----获取当前光标的位置
2. getSelectedText-------获取选中的文本
3. setSelection----------选中一个指定区间的文本
4. setCursorPosition-----设置光标的到达指定位置
5. setSelectionText------选中一个指定的文本
6. deleteText------------删除光标前后的指定个字符
*/
var phoenix =phoenix || {version:'1.0.1'};
phoenix.textareaUtil = phoenix.textareaUtil || {};
//后期考虑做快捷方式的调用优化,可读性的杀手啊
/*
获取当前光标的位置
@Method getCursorPosition
@param {HTMLElement} --element 绑定的textarea对象
@return {Number} ---result 当前光标的位置
@remark 约定当前没有光标就返回0
ff和opera下如果文本区域没有光标返回的是value.length
chrome和ie是0
*/
phoenix.textareaUtil.getCursorPosition = function(element){
var result =0;
//处理兼容
if(document.selection){
//ie
element.focus();
var ds = document.selection
var range = ds.createRange();
var g = range.duplicate();
g.moveToElementText(element);
g.setEndPoint("EndToEnd",range);
element.selectionStart = g.text.length - range.text.length;
element.selectionEnd = element.selectionStart +range.text.length;
result = element.selectionStart;
}else{
//ff-chrome-opera
//加层判断
if(element.selectionStart || element.selectionStart == "0"){
//ff和opera多是element.value.length
//chrome
result = element.selectionStart;
}
}
return result;
},
/*
获取选中的文本
@Method getSelectedText
@param {HTMLElement} ---element
@return {String} | "" ---result
@remark 约定如果没有选中返回""
*/
phoenix.textareaUtil.getSelectedText = function(element){
var result="";
var find = function(el){
if(el.selectionStart != undefined && el.selectionEnd != undefined){
return el.value.slice(el.selectionStart,el.selectionEnd);
}else{
return "";
}
}
if(window.getSelection){
//ff-chrome-opera
result = find(element);
}else{
//ie
result = document.selection.createRange().text;
}
return result;
},
/*
选中从start到end之间的文本
@Method setSelection
@param {HTMLElement} --element
@param {Number} ---start index
@param {Number} ---end index
*/
phoenix.textareaUtil.setSelection = function(element,start,end){
if(document.selection){
var range = element.createTextRange();
range.moveEnd('character',end-element.value.length);
range.moveStart('character',start);
range.select();
}else{
element.setSelectionRange(start,end);
element.focus();
}
},
/*
设置光标的到达指定位置
@Method setCursorPosition
@param e{HTMLElement} --element
@param pos{Number} ---position
@remark 这个api依赖于setSelection
*/
phoenix.textareaUtil.setCursorPosition = function(element,pos){
this.setSelection(element,pos,pos);
},
/*
选中一个指定的文本
@Method setSelectionText also can call findText
@param {HTMLElement} ---element
@param {String} ---- string
@return index
@remark 这个api依赖于setSelection
if no find return false
*/
phoenix.textareaUtil.setSelectionText = function(element,string){
var index = element.value.indexOf(string);
return index!= -1 ? this.setSelection(element,index,index+string.length) : false;
},
/*
删除光标前后的指定个字符
@Method deleteText
@param {HTMLElement} element
@param number {Number} 删除前后的number个字符
@remark if number >0 删除前面number个字符 反之
@remak 解决兼容性问题存在的bug ---发生场景
1.是有滚动条---先记录后针对ff进行setTimeout复制 ---ff最新的版本已经没有这个问题了
2.如果光标前面没有可删除的 ---由于slice自身的api设置参数end如果为负会返回string.length +end
但是substring又不支持参数为负,暂时采用
***思考:如果当前光标就在第一位,其实可以return false---对用户的效果是一样的,而且代码不必要走***
*/
phoenix.textareaUtil.deleteText = function(element,number){
var scrolTop = element.scrollTop; //记录旧的scrollTop 针对ff的bug
var curpos = this.getCursorPosition(element); //当前光标的位置
var val = element.value; //textarea输入的值
//改变删除后的文本值
//当curpos为0的话 会由于slice的自身原因返回错误(如上注释)
/*element.value = number > 0 ? val.slice(0,curpos - number) + val.slice(curpos) :
val.slice(0,curpos) + val.slice(curpos - number);*/
//测试后暂时先用这个substring(0,-2)后会返回"",不会像slice一样slice(0,-2)变成slice(0,string.length-2);
element.value = number > 0 ? val.substring(0,curpos - number) + val.substring(curpos) :
val.substring(0,curpos) + val.substring(curpos - number);
//直接走-- 控制光标的位置
//ff下Bug是在出现滚动条的时候删除文字后scrollTop会自动置0
//ie下Bug是删除之后的光标计算有问题
this.setSelection(element, curpos-(number <0 ? 0 : number),curpos-(number <0 ? 0 : number));
//console.log(scrolTop);
//处理一下ff的scrollTop为0的bug(ff的最新版本已经没有这个问题了)
var isFf= /firefox\/(\d+\.\d+)/i.test(navigator.userAgent) ? +RegExp['\x241']: undefined;
if(isFf != undefined){
setTimeout(function(){
//做法就是那开始记录的复制回去
if(element.scrollTop != scrolTop){
element.scrollTop == scrolTop;
}
},10);
}
}
日后会慢慢贴出其他的代码,只是学习之用。谢谢查看。
附上源码和例子,希望对你的学习有帮助,谢谢
分享到:
相关推荐
在"前端开源库-openssl-self-signed-certificate"中,这个开源项目可能提供了一种简化流程,将上述步骤集成到了一个脚本或者工具中,方便开发者快速生成和使用自签名证书。此外,由于证书的有效期设定到了4754年,这...
在IT行业中,前端开发是构建Web应用程序的关键部分,而开源库则是开发者们共享和复用代码的重要工具。本文将深入探讨“前端开源库-ipld-raw”,一个专门处理ipld raw格式的JavaScript实现。 首先,我们需要理解ipld...
BAT批处理脚本-WinXP相关批处理-12个 BAT批处理脚本-加密解密-22个 BAT批处理脚本-实用的批处理文件-70个 BAT批处理脚本-提示窗口进度条-17个 BAT批处理脚本-数值计算-23个 ...BAT批处理脚本-网络相关操作-44个
"前端开源库 - command-line-commands" 正是这样一款专注于为应用程序提供类似Git命令界面的开源库。它允许开发者创建自定义的命令行界面,使用户能够通过熟悉的命令行操作与应用进行交互。 1. **命令行接口(CLI)的...
"fs-recurse" 是一个专为前端设计的开源库,它主要用于异步地遍历文件系统目录,尤其适用于处理文件和文件夹的递归操作。在深入探讨这个库之前,我们需要先理解一些基本概念。 首先,`fs` 模块是 Node.js 的核心...
《前端开源库——Node-Red-Contrib-SecuredHTTP详解》 在当今互联网技术日新月异的时代,前端开发人员面临着构建高效、安全且可扩展的Web应用的挑战。在这个背景下,开源库扮演了至关重要的角色,它们为开发者提供...
**ipld-dag-cbor** 是一个前端开源库,它主要负责处理行星间链接数据(InterPlanetary Linking Data)的编码与解码工作,特别地,它关注于CBOR(Concise Binary Object Representation)格式。在分布式系统,尤其是...
"run-script-os" 是这样一个开源库,专门用于处理跨操作系统运行NPM脚本的问题。这个工具使得开发者能够在不同的操作系统(如Windows、macOS和Linux)上,使用统一的命令来执行操作系统的特定任务,而无需关心底层...
BAT批处理脚本-WinXP相关批处理-12个 BAT批处理脚本-加密解密-22个 BAT批处理脚本-实用的批处理文件-70个 BAT批处理脚本-提示窗口进度条-17个 BAT批处理脚本-数值计算-23个 ...BAT批处理脚本-网络相关操作-44个
BAT批处理脚本-WinXP相关批处理-12个 BAT批处理脚本-加密解密-22个 BAT批处理脚本-实用的批处理文件-70个 BAT批处理脚本-提示窗口进度条-17个 BAT批处理脚本-数值计算-23个 ...BAT批处理脚本-网络相关操作-44个
**前端开源库-language-map** 是一个专为前端开发者设计的工具,它以 **Yaml** 语言编写的地图数据,并转换成 **JSON** 格式供用户使用。这个项目的目标是帮助开发者更好地理解和掌握前端开发中所涉及的各种编程语言...
Janeway的独特之处在于它的鼠标驱动特性,这意味着用户可以通过简单的鼠标操作来执行命令,使得交互过程更加直观和高效。 在前端开发中,开发者经常需要即时测试JavaScript代码片段或尝试新的API功能。传统的命令行...
"前端开源库-cross-os"正是一款致力于解决这一问题的工具,它旨在帮助开发者实现跨操作系统的脚本执行,使得项目可以在不同的操作系统环境下顺畅运行。下面将详细阐述这款开源库的核心功能、应用场景以及如何使用。 ...
【前端开源库-amp-each】是一个用于前端开发的开源库,主要提供了类似于JavaScript数组`forEach`方法的功能,但其设计和实现具有更高级别的功能和优化,旨在提高开发效率和代码性能。这个库来自于...
**前端开源库-better-npm-run** 在前端开发中,`npm`(Node Package Manager)是广泛使用的包管理工具,它允许开发者通过脚本管理项目生命周期。`better-npm-run`是一个开源库,旨在增强`npm`脚本的运行体验,提供...
在前端开发领域,开源库是开发者们不可或缺的工具,它们为高效编码提供了强大的支持。"前端开源库-babel-node-debug" 提供了针对JavaScript代码的转换和调试功能,特别是对于Node.js环境。Babel是一个广泛使用的...
"前端开源库-smooth-fe" 是一个专注于前端性能优化的开源项目,它的主要目标是提供一套解决方案,使得CSS和JavaScript的加载与执行更加平滑、高效。在现代Web开发中,用户体验是至关重要的,而页面的加载速度和交互...
【前端开源库-browser-test-runner】是一个专为前端开发者设计的测试工具,它的主要目标是提供一个高效的、跨浏览器的测试运行环境,使开发者能够在多种不同的浏览器中方便地运行和调试他们的代码测试。这个库允许...
"assets-bower-ci-legacy"可能包含了一套解决方案,用于确保这些前端库能在老版本的浏览器中正常工作,或者包含了处理旧版浏览器兼容问题的工具和策略。 在压缩包`assets-bower-ci-legacy-master`中,我们可能找到...
在前端开发领域,开源库和命令行界面(CLI,Command Line Interface)工具是不可或缺的组成部分。"前端开源库-cli-commands"这个主题聚焦于如何利用CLI来创建和管理前端项目。CLI命令允许开发者通过简单的文本指令...