JavaScript常用脚本汇总(一)
jquery限制文本框只能输入数字
jquery限制文本框只能输入数字,兼容IE、chrome、FF(表现效果不一样),示例代码如下:
$("input").keyup(function(){//keyup事件处理
$(this).val($(this).val().replace(/\D|^0/g,''));
}).bind("paste",function(){//CTR+V事件处理
$(this).val($(this).val().replace(/\D|^0/g,''));
}).css("ime-mode","disabled");//CSS设置输入法不可用
上面的代码的作用是:只能输入大于0的正整数。
$("#rnumber").keyup(function(){
$(this).val($(this).val().replace(/[^0-9.]/g,''));
}).bind("paste",function(){ //CTR+V事件处理
$(this).val($(this).val().replace(/[^0-9.]/g,''));
}).css("ime-mode","disabled");//CSS设置输入法不可用
上面代码的作用是:只能输入0-9的数字和小数点。
封装DOMContentLoaded事件
//保存domReady的事件队列
eventQueue=[];
//判断DOM是否加载完毕
isReady=false;
//判断DOMReady是否绑定
isBind=false;
/*执行domReady()
*
*@param {function}
*@execute 将事件处理程序压入事件队列,并绑定DOMContentLoaded
* 如果DOM加载已经完成,则立即执行
*@caller
*/
functiondomReady(fn){
if(isReady){
fn.call(window);
}
else{
eventQueue.push(fn);
};
bindReady();
};
/*domReady事件绑定
*
*@param null
*@execute 现代浏览器通过addEvListener绑定DOMContentLoaded,包括ie9+
ie6-8通过判断doScroll判断DOM是否加载完毕
*@caller domReady()
*/
functionbindReady(){
if(isReady)return;
if(isBind)return;
isBind=true;
if(window.addEventListener){
document.addEventListener('DOMContentLoaded',execFn,false);
}
elseif(window.attachEvent){
doScroll();
};
};
/*doScroll判断ie6-8的DOM是否加载完成
*
*@param null
*@execute doScroll判断DOM是否加载完成
*@caller bindReady()
*/
functiondoScroll(){
try{
document.documentElement.doScroll('left');
}
catch(error){
returnsetTimeout(doScroll,20);
};
execFn();
};
/*执行事件队列
*
*@param null
*@execute 循环执行队列中的事件处理程序
*@caller bindReady()
*/
functionexecFn(){
if(!isReady){
isReady=true;
for(vari=0;i<eventQueue.length;i++){
eventQueue[i].call(window);
};
eventQueue=[];
};
};
//js文件1
domReady(function(){
});
//js文件2
domReady(function(){
});
//注意,如果是异步加载的js就不要绑定domReady方法,不然函数不会执行,
//因为异步加载的js下载之前,DOMContentLoaded已经触发,addEventListener执行时已经监听不到了
用原生JS对AJAX做简单封装
首先,我们需要xhr对象。这对我们来说不难,封装成一个函数。
varcreateAjax=function(){
varxhr=null;
try{
//IE系列浏览器
xhr=newActiveXObject("microsoft.xmlhttp");
}catch(e1){
try{
//非IE浏览器
xhr=newXMLHttpRequest();
}catch(e2){
window.alert("您的浏览器不支持ajax,请更换!");
}
}
returnxhr;
};
然后,我们来写核心函数。
varajax=function(conf){
//初始化
//type参数,可选
vartype=conf.type;
//url参数,必填
varurl=conf.url;
//data参数可选,只有在post请求时需要
vardata=conf.data;
//datatype参数可选
vardataType=conf.dataType;
//回调函数可选
varsuccess=conf.success;
if(type==null){
//type参数可选,默认为get
type="get";
}
if(dataType==null){
//dataType参数可选,默认为text
dataType="text";
}
//创建ajax引擎对象
varxhr=createAjax();
//打开
xhr.open(type,url,true);
//发送
if(type=="GET"||type=="get"){
xhr.send(null);
}elseif(type=="POST"||type=="post"){
xhr.setRequestHeader("content-type",
"application/x-www-form-urlencoded");
xhr.send(data);
}
xhr.onreadystatechange=function(){
if(xhr.readyState==4&&xhr.status==200){
if(dataType=="text"||dataType=="TEXT"){
if(success!=null){
//普通文本
success(xhr.responseText);
}
}elseif(dataType=="xml"||dataType=="XML"){
if(success!=null){
//接收xml文档
success(xhr.responseXML);
}
}elseif(dataType=="json"||dataType=="JSON"){
if(success!=null){
//将json字符串转换为js对象
success(eval("("+xhr.responseText+")"));
}
}
}
};
};
最后,说明一下此函数的用法。
ajax({
type:"post",
url:"test.jsp",
data:"name=dipoo&info=good",
dataType:"json",
success:function(data){
alert(data.name);
}
});
跨域请求之JSONP
/**
*JavaScriptJSONPLibraryv0.3
*Copyright(c)2011snandy
*QQ群:34580561
*Date:2011-04-26
*
*增加对请求失败的处理,虽然这个功能用处不太大,但研究了各个浏览器下script的差异性
*1,IE6/7/8支持script的onreadystatechange事件
*2,IE9/10支持script的onload和onreadystatechange事件
*3,Firefox/Safari/Chrome/Opera支持script的onload事件
*4,IE6/7/8/Opera不支持script的onerror事件;IE9/10/Firefox/Safari/Chrome支持
*5,Opera虽然不支持onreadystatechange事件,但其具有readyState属性.这点甚是神奇
*6,用IE9和IETester测试IE6/7/8,其readyState总为loading,loaded。没出现过complete。
*
*最后的实现思路:
*1,IE9/Firefox/Safari/Chrome成功回调使用onload事件,错误回调使用onerror事件
*2,Opera成功回调也使用onload事件(它压根不支持onreadystatechange),由于其不支持onerror,这里使用了延迟处理。
* 即等待与成功回调success,success后标志位done置为true。failure则不会执行,否则执行。
* 这里延迟的时间取值很有技巧,之前取2秒,在公司测试没问题。但回家用3G无线网络后发现即使所引用的js文件存在,但由于
* 网速过慢,failure还是先执行了,后执行了success。所以这里取5秒是比较合理的。当然也不是绝对的。
*3,IE6/7/8成功回调使用onreadystatechange事件,错误回调几乎是很难实现的。也是最有技术含量的。
* 参考了http://stackoverflow.com/questions/3483919/script-onload-onerror-with-iefor-lazy-loading-problems
* 使用nextSibling,发现不能实现。
* 令人恶心的是,即使请求的资源文件不存在。它的readyState也会经历“loaded”状态。这样你就没法区分请求成功或失败。
* 怕它了,最后使用前后台一起协调的机制解决最后的这个难题。无论请求成功或失败都让其调用callback(true)。
* 此时已经将区别成功与失败的逻辑放到了callback中,如果后台没有返回jsonp则调用failure,否则调用success。
*
*
*接口
*Sjax.load(url,{
* data //请求参数(键值对字符串或js对象)
* success //请求成功回调函数
* failure //请求失败回调函数
* scope //回调函数执行上下文
* timestamp//是否加时间戳
*});
*
*/
Sjax=
function(win){
varie678=!-[1,],
opera=win.opera,
doc=win.document,
head=doc.getElementsByTagName('head')[0],
timeout=3000,
done=false;
function_serialize(obj){
vara=[],key,val;
for(keyinobj){
val=obj[key];
if(val.constructor==Array){
for(vari=0,len=val.length;i<len;i++){
a.push(key+'='+encodeURIComponent(val[i]));
}
}else{
a.push(key+'='+encodeURIComponent(val));
}
}
returna.join('&');
}
functionrequest(url,opt){
functionfn(){}
varopt=opt||{},
data=opt.data,
success=opt.success||fn,
failure=opt.failure||fn,
scope=opt.scope||win,
timestamp=opt.timestamp;
if(data&&typeofdata=='object'){
data=_serialize(data);
}
varscript=doc.createElement('script');
functioncallback(isSucc){
if(isSucc){
if(typeofjsonp!='undefined'){//赋值右边的jsonp必须是后台返回的,此变量为全局变量
done=true;
success.call(scope,jsonp);
}else{
failure.call(scope);
//alert('warning:jsonpdidnotreturn.');
}
}else{
failure.call(scope);
}
//HandlememoryleakinIE
script.onload=script.onerror=script.onreadystatechange=null;
jsonp=undefined;
if(head&&script.parentNode){
head.removeChild(script);
}
}
functionfixOnerror(){
setTimeout(function(){
if(!done){
callback();
}
},timeout);
}
if(ie678){
script.onreadystatechange=function(){
varreadyState=this.readyState;
if(!done&&(readyState=='loaded'||readyState=='complete')){
callback(true);
}
}
//fixOnerror();
}else{
script.onload=function(){
callback(true);
}
script.onerror=function(){
callback();
}
if(opera){
fixOnerror();
}
}
if(data){
url+='?'+data;
}
if(timestamp){
if(data){
url+='&ts=';
}else{
url+='?ts='
}
url+=(newDate).getTime();
}
script.src=url;
head.insertBefore(script,head.firstChild);
}
return{load:request};
}(this);
调用方式如下:
Sjax.load('jsonp66.js',{
success:function(){alert(jsonp.name)},
failure:function(){alert('error');}
});
千分位格式化
functiontoThousands(num){
varnum=(num||0).toString(),result='';
while(num.length>3){
result=','+num.slice(-3)+result;
num=num.slice(0,num.length-3);
}
if(num){result=num+result;}
returnresult;
}
以上就是本文给大家分享的javascript常用脚本了,希望大家能够喜欢。