首发-----凤凰前端脚本库之光标操作

以前就一直研究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);
	}
}

 日后会慢慢贴出其他的代码,只是学习之用。谢谢查看。

 

附上源码和例子,希望对你的学习有帮助,谢谢

 

你可能感兴趣的:(自己的前端脚本库,光标操作)