JavaScript常用脚本汇总(一)


Posted in Javascript onMarch 04, 2015

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

     */

    function domReady(fn){

        if (isReady) {

            fn.call(window);

        }

        else{

            eventQueue.push(fn);

        };

        bindReady();

    };

    /*domReady事件绑定

     *

     *@param    null

     *@execute  现代浏览器通过addEvListener绑定DOMContentLoaded,包括ie9+

     ie6-8通过判断doScroll判断DOM是否加载完毕

     *@caller   domReady()

     */

    function bindReady(){

        if (isReady) return;

        if (isBind) return;

        isBind = true;

        if (window.addEventListener) {

            document.addEventListener('DOMContentLoaded',execFn,false);

        }

        else if (window.attachEvent) {

            doScroll();

        };

    };

    /*doScroll判断ie6-8的DOM是否加载完成

     *

     *@param    null

     *@execute  doScroll判断DOM是否加载完成

     *@caller   bindReady()

     */

    function doScroll(){

        try{

            document.documentElement.doScroll('left');

        }

        catch(error){

            return setTimeout(doScroll,20);

        };

        execFn();

    };

    /*执行事件队列

     *

     *@param    null

     *@execute  循环执行队列中的事件处理程序

     *@caller   bindReady()

     */

    function execFn(){

        if (!isReady) {

            isReady = true;

            for (var i = 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对象。这对我们来说不难,封装成一个函数。

var createAjax = function() {

    var xhr = null;

    try {

        //IE系列浏览器

        xhr = new ActiveXObject("microsoft.xmlhttp");

    } catch (e1) {

        try {

            //非IE浏览器

            xhr = new XMLHttpRequest();

        } catch (e2) {

            window.alert("您的浏览器不支持ajax,请更换!");

        }

    }

    return xhr;

};   

然后,我们来写核心函数。

var ajax = function(conf) {

    // 初始化

    //type参数,可选

    var type = conf.type;

    //url参数,必填 

    var url = conf.url;

    //data参数可选,只有在post请求时需要

    var data = conf.data;

    //datatype参数可选    

    var dataType = conf.dataType;

    //回调函数可选

    var success = conf.success;

    if (type == null){

        //type参数可选,默认为get

        type = "get";

    }

    if (dataType == null){

        //dataType参数可选,默认为text

        dataType = "text";

    }

    // 创建ajax引擎对象

    var xhr = createAjax();

    // 打开

    xhr.open(type, url, true);

    // 发送

    if (type == "GET" || type == "get") {

        xhr.send(null);

    } else if (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);

                }

            }else if(dataType=="xml"||dataType=="XML") {

                if (success != null){

                    //接收xml文档    

                    success(xhr.responseXML);

                }  

            }else if(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

/**

 * JavaScript JSONP Library v0.3

 * Copyright (c) 2011 snandy

 * 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){

    var ie678 = !-[1,],

        opera = win.opera,

        doc = win.document,

        head = doc.getElementsByTagName('head')[0],

        timeout = 3000,

        done = false;

    function _serialize(obj){

        var a = [], key, val;

        for(key in obj){

            val = obj[key];

            if(val.constructor == Array){

                for(var i=0,len=val.length;i<len;i++){

                    a.push(key + '=' + encodeURIComponent(val[i]));

                }

            }else{

                a.push(key + '=' + encodeURIComponent(val));

            }

        }

        return a.join('&');

    }

    function request(url,opt){

        function fn(){}

        var opt = opt || {},

        data = opt.data,

        success = opt.success || fn,

        failure = opt.failure || fn,

        scope = opt.scope || win,

        timestamp = opt.timestamp;

        if(data && typeof data == 'object'){

            data = _serialize(data);

        }       

        var script = doc.createElement('script');

        function callback(isSucc){

            if(isSucc){

                if(typeof jsonp != 'undefined'){// 赋值右边的jsonp必须是后台返回的,此变量为全局变量

                    done = true;

                    success.call(scope, jsonp);

                }else{

                    failure.call(scope);

                    //alert('warning: jsonp did not return.');

                }

            }else{

                failure.call(scope);

            }

            // Handle memory leak in IE

            script.onload = script.onerror = script.onreadystatechange = null;

            jsonp = undefined;

            if( head && script.parentNode ){

                head.removeChild(script);

            }

        }

        function fixOnerror(){

            setTimeout(function(){

                if(!done){

                    callback();

                }

            }, timeout);

        }

        if(ie678){

            script.onreadystatechange = function(){

                var readyState = 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 += (new Date).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');}

  }); 

千分位格式化

function toThousands(num) {

    var num = (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; }

    return result;

} 

以上就是本文给大家分享的javascript常用脚本了,希望大家能够喜欢。

Javascript 相关文章推荐
JavaScript 判断判断某个对象是Object还是一个Array
Jan 28 Javascript
onsubmit阻止form表单提交与onclick的相关操作
Sep 03 Javascript
Javascript学习笔记一 之 数据类型
Dec 15 Javascript
javascript的原生方法获取数组中的最大(最小)值
Dec 19 Javascript
js实现目录定位正文示例
Nov 14 Javascript
javascript实现自动输出文本(打字特效)
Aug 27 Javascript
JS实现适合于后台使用的动画折叠菜单效果
Sep 21 Javascript
JavaScript队列、优先队列与循环队列
Nov 14 Javascript
原生js实现对Ajax的封装(仿jquery)
Jan 22 Javascript
vue 自定义提示框(Toast)组件的实现代码
Aug 17 Javascript
分享JS表单验证源码(带错误提示及密码等级)
Jan 05 Javascript
Node在Controller层进行数据校验的过程详解
Aug 28 Javascript
JS+CSS实现Div弹出窗口同时背景变暗的方法
Mar 04 #Javascript
js实现iGoogleDivDrag模块拖动层拖动特效的方法
Mar 04 #Javascript
JavaScript中的关联数组问题
Mar 04 #Javascript
JavaScript中常见获取元素的方法汇总
Mar 04 #Javascript
深入理解JavaScript系列(17):面向对象编程之概论详细介绍
Mar 04 #Javascript
JavaScript设置获取和设置属性的方法
Mar 04 #Javascript
深入理解JavaScript系列(50):Function模式(下篇)
Mar 04 #Javascript
You might like
PHP FTP操作类代码( 上传、拷贝、移动、删除文件/创建目录)
2014/05/10 PHP
js DOM模型操作
2009/12/28 Javascript
JavaScript(JS) 压缩 / 混淆 / 格式化 批处理工具
2010/12/10 Javascript
js动态设置div的值下例子
2013/10/29 Javascript
ExtJS4中使用mixins实现多继承示例
2013/12/03 Javascript
js 针对html DOM元素操作等经验累积
2014/03/11 Javascript
Javascript验证上传图片大小[前台处理]
2014/07/18 Javascript
JS及PHP代码编写八大排序算法
2016/07/12 Javascript
老生常谈javascript变量的命名规范和注释
2016/09/29 Javascript
基于JavaScript实现购物车功能
2017/02/07 Javascript
详谈js遍历集合(Array,Map,Set)
2017/04/06 Javascript
JavaScrpt的面向对象全面解析
2017/05/09 Javascript
微信小程序实现banner图轮播效果
2020/06/28 Javascript
JS数组属性去重并校验重复数据
2020/01/10 Javascript
Vue结合路由配置递归实现菜单栏功能
2020/06/16 Javascript
Python语言描述随机梯度下降法
2018/01/04 Python
详解python项目实战:模拟登陆CSDN
2019/04/04 Python
python网络应用开发知识点浅析
2019/05/28 Python
python opencv捕获摄像头并显示内容的实现
2019/07/11 Python
Python collections模块使用方法详解
2019/08/28 Python
python字符串反转的四种方法详解
2019/12/02 Python
pytorch载入预训练模型后,实现训练指定层
2020/01/06 Python
解决Python中报错TypeError: must be str, not bytes问题
2020/04/07 Python
PyQt5.6+pycharm配置以及pyinstaller生成exe(小白教程)
2020/06/02 Python
python递归函数用法详解
2020/10/26 Python
Html5移动端弹幕动画实现示例代码
2018/08/27 HTML / CSS
ECOSUSI官网:女式皮革背包
2019/09/27 全球购物
简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程
2012/04/17 面试题
高级护理专业大学生求职信
2013/10/24 职场文书
高中生活自我鉴定
2014/01/18 职场文书
化妆品促销方案
2014/02/24 职场文书
保险专业大学生职业规划书
2014/03/03 职场文书
房地产置业顾问工作总结
2015/10/23 职场文书
小学语文教师竞聘演讲稿范文
2019/08/09 职场文书
javascript实现计算器功能详解流程
2021/11/01 Javascript
vue 自定义组件添加原生事件
2022/04/21 Vue.js