手写常用的javascript函数

这篇文章详细介绍了JavaScript中的几个实用函数,包括Ajax请求处理、格式化参数、移动端检测、UI组件(如Toast提示和确认弹窗)、以及Loader动画效果的实现,展现了前端开发中常用的技术手段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// 获取url参数
function getQueryString(name) {
    var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i');
    var r = window.location.search.substr(1).match(reg);
    if (r != null) {
        return unescape(r[2]);
    }
    return null;
}

// 验证手机号码(strict)
function validPhoneNumber( number ) {
    if( !number ) return false;
    number = number.replace( ' ', '' );
    number = number.replace( '-', '' );
    if( !/^(13[0-9]|14[0-9]|15[0-9]|17[0-9]|18[0-9])\d{8}$/i.test( number ) )
    {
        if( number.length != 11 )
        {
          return false;
        }
    }
    return true;
}

// 检查是否是移动端
function detectmob() { 
 if( navigator.userAgent.match(/Android/i)
 || navigator.userAgent.match(/webOS/i)
 || navigator.userAgent.match(/iPhone/i)
 || navigator.userAgent.match(/iPad/i)
 || navigator.userAgent.match(/iPod/i)
 || navigator.userAgent.match(/BlackBerry/i)
 || navigator.userAgent.match(/Windows Phone/i)
 ){
    return true;
  }
 else {
    return false;
  }
}

function hasClass(elem, cls) {
  cls = cls || '';
  if (cls.replace(/\s/g, '').length == 0) return false; //当cls没有参数时,返回false
  return new RegExp(' ' + cls + ' ').test(' ' + elem.className + ' ');
}
 
function addClass(elem, cls) {
  if (!hasClass(elem, cls)) {
    elem.className = elem.className == '' ? cls : elem.className + ' ' + cls;
  }
}
 
function removeClass(elem, cls) {
  if (hasClass(elem, cls)) {
    var newClass = ' ' + elem.className.replace(/[\t\r\n]/g, '') + ' ';
    while (newClass.indexOf(' ' + cls + ' ') >= 0) {
      newClass = newClass.replace(' ' + cls + ' ', ' ');
    }
    elem.className = newClass.replace(/^\s+|\s+$/g, '');
  }
}

function toggleClass(obj,cls){  
    if(hasClass(obj,cls)){  
        removeClass(obj, cls);  
    }else{  
        addClass(obj, cls);  
    }  
}  
//格式化参数
function formatParams(data) {
    var arr = [];
    for (var name in data) {
        arr.push(encodeURIComponent(name) + "=" + encodeURIComponent(data[name]));
    }
    return arr.join('&');
}

function ajax(options) {
    options = options || {};
    options.type = (options.type || "GET").toUpperCase();
    options.dataType = options.dataType || "json";
    var params = formatParams(options.data);

    //创建 - 非IE6 - 第一步
    if (window.XMLHttpRequest) {
        var xhr = new XMLHttpRequest();
    } else { //IE6及其以下版本浏览器
        var xhr = new ActiveXObject('Microsoft.XMLHTTP');
    }

    //接收 - 第三步
    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4) {
            var status = xhr.status;
            if (status >= 200 && status < 300) {
                options.success && options.success(JSON.parse(xhr.responseText), xhr.responseXML);
            } else {
                options.fail && options.fail(status);
            }
        }
    }

    //连接 和 发送 - 第二步
    if (options.type == "GET") {
        xhr.open("GET", options.url + "?" + params, true);
        xhr.send(null);
    } else if (options.type == "POST") {
        xhr.open("POST", options.url, true);
        //设置表单提交时的内容类型
        xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        xhr.send(params);
    }
}

function toast(content, time) {
    var toast = document.getElementById('common-toast');
    // console.log(toast,'finded toast')
    // console.log(toast);
    clearTimeout(window.toastTimer);
    var defaultStyle = 'position: fixed;background-color: rgba(0,0,0,0.8);border-radius: 5px;bottom: 30px;left: 50%;padding: 5px 10px;text-align:center;color: #fff;transform: translateX(-50%);';
    if(!toast) {
        var style = document.createElement('style');
        style.type = 'text/css';
        style.innerHTML='.common-toast{ -webkit-animation: commontoast .2s;animation: commontoast .2s;}\
        @-webkit-keyframes commontoast {\
            0%{transform: translateY(30%) translateX(-50%);opacity: 0.3;}\
            100%{transform: translateY(0%) translateX(-50%);opacity: 1;}\
        }\
        @keyframes commontoast {\
            0%{transform: translateY(30%) translateX(-50%);opacity: 0.3;}\
            100%{transform: translateY(0%) translateX(-50%);opacity: 1;}\
        }\
        ';
        document.getElementsByTagName('HEAD').item(0).appendChild(style);
        toast = document.createElement('div');
        toast.id = 'common-toast';
        toast.className = 'common-toast';
        toast.style= defaultStyle;
        // console.log(toast);
        toast.innerHTML = content;
        document.body.appendChild(toast);
    }else{
        toast.innerHTML = content;
        toast.style = defaultStyle;
    }
    window.toastTimer = setTimeout(function() {
        toast.style = 'display: none;';
    }, time || 2000);
}

//确认弹窗
function comfirm(content, ok_cb, cancel_cb) {
    var comfirm = document.getElementById('common-comfirm');
    // console.log(toast,'finded toast')
    // console.log(toast);
    var template = '<div>\
        <div class="comform-title"></div>\
        <div style="padding: .5rem 0;color: #666;">'+content+'</div>\
        <div class="comfirm-buttons" style="padding: .3rem 0;">\
            <button class="comfirm-btn comfirm-cancel" id="comfirm-cancel">取消</button>\
            <button class="comfirm-btn comfirm-ok" id="comfirm-ok">确定</button>\
        </div>\
    </div>';
    var defaultStyle = 'position: fixed;width: 75%;background-color: #fff;border-radius: 5px;top: 50%;left: 50%;padding: 5px 10px;text-align:center;color: #fff;transform: translate(-50%, 50%);';
    if(!comfirm) {
        var style = document.createElement('style');
        style.type = 'text/css';
        style.innerHTML='.common-comfirm{box-shadow: 1px 1px 3px #ddd; -webkit-animation: commoncomfirm .2s forwards;animation: commoncomfirm .2s forwards;}\
        @-webkit-keyframes commoncomfirm {\
            0%{transform: translateY(-45%) translateX(-50%);opacity: 0.3;}\
            100%{transform: translateY(-50%) translateX(-50%);opacity: 1;}\
        }\
        @keyframes commoncomfirm {\
            0%{transform: translateY(-45%) translateX(-50%);opacity: 0.3;}\
            100%{transform: translateY(-50%) translateX(-50%);opacity: 1;}\
        }\
        .common-comfirm .comfirm-btn{width: 35%;height: .5rem;margin: 0 .2rem;line-height: .5rem;color: #f7bb2a;text-align: center;border: 1px solid #fbdd94;}\
        ';
        document.getElementsByTagName('HEAD').item(0).appendChild(style);
        comfirm = document.createElement('div');
        comfirm.id = 'common-comfirm';
        comfirm.className = 'common-comfirm';
        comfirm.style= defaultStyle;
        // console.log(comfirm);
        comfirm.innerHTML = template;
        document.body.appendChild(comfirm);
    }else{
        comfirm.innerHTML = template;
        comfirm.style = defaultStyle;
    }
    var $cancel_bt = document.getElementById('comfirm-cancel');
    var $ok_bt = document.getElementById('comfirm-ok');
    $cancel_bt.addEventListener('click', function() {
        comfirm.style = 'display: none;';
        cancel_cb && cancel_cb();
    });
    $ok_bt.addEventListener('click', function() {
        comfirm.style = 'display: none;';
        ok_cb && ok_cb();
    });
}

// loader
;(function(){
    function Loader() {
        this.init();
    }
    var p = Loader.prototype;
    p.isLoading = false;
    p.loaderDOM = null;
    p.timer = null;
    p.timeOut = 10000;//超时时间10s
    p.showStyle = 'position: fixed;background-color: rgba(0,0,0,0.8);border-radius: 5px;bottom: 30px;left: 50%;padding: 5px 10px;text-align:center;color: #fff;transform: translateX(-50%);';
    p.hideStyle = 'display: none';
    p.init = function() {
        var style = document.createElement('style');
        style.type = 'text/css';
        style.innerHTML='.common-loader{ -webkit-animation: commonloader .2s;animation: commonloader .2s;}\
        @-webkit-keyframes commonloader {\
            0%{transform: translateY(30%) translateX(-50%);opacity: 0.3;}\
            100%{transform: translateY(0%) translateX(-50%);opacity: 1;}\
        }\
        @keyframes commonloader {\
            0%{transform: translateY(30%) translateX(-50%);opacity: 0.3;}\
            100%{transform: translateY(0%) translateX(-50%);opacity: 1;}\
        }\
        .loader{\
          margin: 0 0 2em;\
          height: 100px;\
          width: 20%;\
          text-align: center;\
          padding: 1em;\
          margin: 0 auto 1em;\
          display: inline-block;\
          vertical-align: top;\
        }\
        svg path,\
        svg rect{\
          fill: #FF6700;\
        }\
        ';
        document.getElementsByTagName('HEAD').item(0).appendChild(style);
        loader = document.createElement('div');
        loader.id = 'common-loader';
        loader.className = 'common-loader';
        loader.innerHTML = '<svg version="1.1" id="loader-1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\
                                 width="40px" height="40px" viewBox="0 0 50 50" style="enable-background:new 0 0 50 50;" xml:space="preserve">\
                              <path fill="#000" d="M43.935,25.145c0-10.318-8.364-18.683-18.683-18.683c-10.318,0-18.683,8.365-18.683,18.683h4.068c0-8.071,6.543-14.615,14.615-14.615c8.072,0,14.615,6.543,14.615,14.615H43.935z">\
                                <animateTransform attributeType="xml"\
                                  attributeName="transform"\
                                  type="rotate"\
                                  from="0 25 25"\
                                  to="360 25 25"\
                                  dur="0.6s"\
                                  repeatCount="indefinite"/>\
                                </path>\
                              </svg>';
        loader.style= this.hideStyle;
        document.body.appendChild(loader);
        this.loaderDOM = loader;
    }
    p.show = function(timeOut) {
        this.timer && clearTimeout(this.timer);

        this.loaderDOM.style = this.showStyle;
        this.is_loading = true;
        var self = this;
        this.timer = setTimeout(function() {
            self.hide();
        }, timeOut || this.timeOut);
    }
    p.hide = function() {
        this.loaderDOM.style = this.hideStyle;
        this.is_loading = false;
    }
    p.isLoading = function() {
        return this.is_loading;
    }
    var loader = new Loader();
    window.loader = loader;
})();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微个日光日

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值