javascript从入门到精通

javascript 同时被 3 个专栏收录
34 篇文章 1 订阅
4 篇文章 0 订阅

1,getElementsByClassName

首先这是HTML5 DOM中新增的一个已久的方法,所有部分旧的浏览器有可能不支持

一般用法:var element = document.getElementsByClassName('元素');获得的是一个集合,需要循环遍历元素;

为了得到兼容,我们可以封装下这个方法来方便我们使用;

function getElementsByClassName(ele,calssname){
	if(ele.getElementsByClassName){
		return ele.getElementsByClassName(classname);
	}else{
		var _results = new Array(),
			_elems = ele.getElementsByTagName('*');
		for(var i=0,len=_elems.length;i<len;i++){
			if(_elems[i].className.indexOf(classname) != -1){
				_results[_results.length] = _elems[i];
			}
		}
		return _results;
	}
}


解释下:这个getElementsByClassName函数接受两个参数,第一个ele表示DOM树中的搜索起点,第二个calssname就是要搜索的类名了。(提示,这个例子不使用多个类名)


用法例子:

var myId = document.getElementById(id);

var myClass = getElementsByClassName(myId,'className');


2,onload

我们都知道onload事件只能执行一次,所以假设你要运行两个onload时候执行的函数,最后只能执行后一个onload事件的函数,那么我们如何执行多个onload事件的函数呢,

形式如下:

window.onload = function(){

num1();

num2();

}


所以,我们就顶一个函数addLoadEvent(func),它只接受参数,就是在页面加载完毕时执行的函数的名字


function addLoadEvent(func){
	var oldonload = window.onload; //把现在有window.onload事件处理函数的值存入变量oldonload。
	if(typeof window.onload != 'function'){ //如果这个处理函数还没有绑定任何函数,就像平时那样把新函数添加给它
		window.onload = func;
	}else{ //如果在这个处理函数上已经绑定了一些函数。就把新函数追加到现有指令的末尾
		window.onload = function(){
			oldonload();
			func();
		}
	}

}



调用:

addLoadEvent(num1);

addLoadEvent(num2);


3,trigger

模拟jquery中的trigger()事件;

    var trigger = function (ele, method) {
        var func = ele[method];
        return func();
    };

调用方式:

trigger(document.getElementById('...'),'onclick');


4,trim去除前后空格

    function trim(str){  //删除左右两端的空格
        return str.replace(/(^\s*)|(\s*$)/g, '');
    }


5,禁止鼠标滑轮滚动

    //禁止鼠标滚轮滚动
    function disabledMouseWheel() {
        if (document.addEventListener) {
            document.addEventListener('DOMMouseScroll', scrollFunc, false);
        }//W3C  
        window.onmousewheel = document.onmousewheel = scrollFunc;//IE/Opera/Chrome  
    }
    function scrollFunc(evt) {
        evt = evt || window.event;
        if (evt.preventDefault) {
            // Firefox  
            evt.preventDefault();
            evt.stopPropagation();
        } else {
            // IE  
            evt.cancelBubble = true;
            evt.returnValue = false;
        }
        return false;
    }
    window.onload = disabledMouseWheel;


6,原生js实现在元素后面插入一个元素

function insertAfter(newElement, targetElement){
        var parent = targetElement.parentNode;
        if (parent.lastChild == targetElement) {
            // 如果最后的节点是目标元素,则直接添加。因为默认是最后
            parent.appendChild(newElement);
        }
        else {
            parent.insertBefore(newElement, targetElement.nextSibling);
            //如果不是,则插入在目标元素的下一个兄弟节点 的前面。也就是目标元素的后面
        }
    }

7,getQueryString()获取url参数的值

        function getQueryString(key,func){
            if(!key || typeof key == 'undefined'){
                key = '';
                return null;
            }else {
                key = key.toLowerCase();
                var _reg = new RegExp('(^|&)' + key + '=([^&]*)(&|$)'),
                    _search = window.location.search.toLowerCase().substr(1).match(_reg);
                if(_reg !== null){
                    if(!func || func === '' || func ==='decodeURI' || typeof (func) === 'undefined'){
                        return decodeURI(_search[2]);
                    }else if(func === 'unescape'){
                        return unescape(_search[2]);
                    }else if(func === 'decodeURIComponent'){
                        return decodeURIComponent(_search[2]);
                    }
                }else{
                    return null;
                }


            }
        }

8,Cookie的设置,读取,删除

/*设置cookie*/
        function setCookie(name, value, iDay)
        {
            var _oDate=new Date();
            _oDate.setDate(_oDate.getDate()+iDay);
            document.cookie=name+'='+value+';expires='+_oDate;
        };
        /*使用方法:setCookie('user', 'andy', 11);*/
        /*获取cookie*/
        function getCookie(key,func)
        {
                var _cookies = document.cookie;
                key += '=';
                var _i = 0;
                while (_i < _cookies.length) {
                    var _offset = _i + key.length;
                    if (_cookies.substring(_i, _offset) == key) {
                        var _endstr = _cookies.indexOf(';', _offset);
                        if (_endstr == -1) {
                            _endstr = _cookies.length;
                        }
                        var r = _cookies.substring(_offset, _endstr);
                        if (r !== null) {
                            if (!func || func === '' || func == 'decodeURI' || typeof (func) == 'undefined') {
                                console.log(decodeURI(r));
                                return decodeURI(r);
                            } else if (func == 'unescape') {
                                console.log(unescape(r));
                                return unescape(r);
                            } else if (func == 'decodeURIComponent') {
                                return decodeURIComponent(r);
                            }
                        } else {
                            return null;
                        }


                    }
                    _i = _cookies.indexOf(' ', _i) + 1;
                    if (_i === 0) {
                        return;
                    }
                }
                return null;
        };


        /*使用方法:getCookie('user')*/
        /*删除cookie*/
        function removeCookie(name)
        {
            setCookie(name, 1, -1); //-1就是告诉系统已经过期,系统就会立刻去删除cookie
        };
        /*使用方法:removeCookie('user')*/


9,SessionStorage存储的设置,读取,删除;

        function setSessionStorage(key,val){
            try{
                sessionStorage.removeItem(key);
                sessionStorage.setItem(key,val);
                return 1;
            }catch(e){
                return 0;
            }
        }
        function getSessionStorage(key){
             try{
                 return sessionStorage.getItem(key);
             }catch(e){
                 console.log(e.message);
                 return 0;
             }
        }
        function removeSessionStorage(key){
            try{
                sessionStorage.removeItem(key);
            }catch(e){
                console.log(e.message);
                return 0;
            }
        }


10,LocalStorage存储的设置,读取以及删除

        function setLocalStorage(key,val){
            try{
                localStorage.removeItem(key);
                localStorage.setItem(key,val);
                return 1;
            }catch(e){
                console.log(e.message);
                return 0;
            }
        }
        function getLocalStorage(key){
            try{
                return localStorage.getItem(key);
            }catch(e){
                console.log(e.message);
                return 0;
            }
        }
        function removeLocalStorage(key){
            try{
                localStorage.removeItem(key);
            }catch(e){
                console.log(e.message);
                return 0;
            }
        }


11,页面加载loading以及loading结束

        function loading(){
            var _doc = document,
                _backUrl = 'javascript:history.go(-1)';
            var _oldLoading = document.getElementById('loading');
            if(_oldLoading !==null && typeof (_oldLoading) !== 'undefined'){
                return;
            }else{
                var _fragment = _doc.createDocumentFragment(),
                    _loading = _doc.createElement('div');
                _loading.className = 'loading';
                _loading.id = 'loading';
                var _loader = _doc.createElement('div');
                _loader.className = 'loader';
                var _p = _doc.createElement('p');
                _p.innerHTML = '正在加载中...';
                var _backBtn = _doc.createElement('a');
                _backBtn.setAttribute('href',_backUrl);
                _loading.appendChild(_loader);
                _loading.appendChild(_backBtn);
                _loader.appendChild(_p);
                _doc.body.appendChild(_loading);
            }
        }
        function enloading(){
            var _doc = document,
                _loading = _doc.getElementById('loading');
            if(_loading !==null && typeof (_loading) !=='undefined'){
                _doc.body.removeChild(_loading);
            }
        }


12,获得元素的样式

function getStyle(obj, attr){
        if(obj.currentStyle){
            return obj.currentStyle[attr];
        }
        else{
            return getComputedStyle(obj,false)[attr];
        }
    }

调用:getStyle(document.getElementById('  '),'width');


13,判断滚动条是否滚动

    //  滚动条是否滚动
    var $topVal = 0,
        $timer = null;
    function isOnScroll(){
        if($timer === null){//  未发起时,启动定时器,30秒执行1次
            $timer = setInterval(isStopOnscroll,30);
        }
        $topVal = document.body.scrollTop;
    }
    function isStopOnscroll(){
        // 判断此刻到顶部的距离是否和1秒前的距离相等
        if($doc.body.scrollTop === $topVal){
            console.log("scroll bar is stopping!"); 
            clearInterval($timer);
            $timer = null;
        }
    }

14,移动端有弹窗的时候禁止底部页面滚动

css:

.uzai-frozen{
  height: 100%;
  overflow: hidden;
}

js:

    //  禁止页面滚动
    function frozenHtml(){
        $doc.getElementsByTagName('html')[0].classList.add('uzai-frozen');
        $doc.getElementsByTagName('body')[0].classList.add('uzai-frozen');
    }

    //  释放页面滚动
    function thawHtml(){
        $doc.getElementsByTagName('html')[0].classList.remove('uzai-frozen');
        $doc.getElementsByTagName('body')[0].classList.remove('uzai-frozen');
    }


15,获取移动端屏幕的高度

    //  获得当前屏幕的高度
    var $clientHeight = document.documentElement.clientHeight,
        $filter = $doc.getElementsByClassName('filter-all')[0];
    $filter.style.height = $clientHeight + 'px';


16,移动端返回顶部动画(先快后慢)

               var _asider = $doc.getElementsByClassName('right-banner')[0],
                        _back = _asider.getElementsByClassName('back-top')[0],
                        _timer = null,
                        _isStop = true,//   向上滚动中,用户是否滚动了滚轮;
                        _clientHeight = $doc.documentElement.clientHeight;
                    var _bodyScroll = function(){
                        var _osTop = $doc.documentElement.scrollTop || $doc.body.scrollTop;
                        if(_osTop >= _clientHeight){
                            _asider.style.display = 'block';
                        }else{
                            _asider.style.display = 'none';
                        }
                        if(!_isStop){
                            clearInterval(_timer);
                        }
                        _isStop = false;
                    };
                    addEventOnScroll(_bodyScroll);
                    _back.onclick = function(){
                        _timer = setInterval(function(){
                            //  获得滚动条距离顶部的距离
                            var _osTop = $doc.documentElement.scrollTop || $doc.body.scrollTop,
                                _speed = Math.floor(-_osTop / 2);
                            _isStop = true;
                            $doc.documentElement.scrollTop = $doc.body.scrollTop = _osTop + _speed;
                            if(_osTop === 0){
                                clearInterval(_timer);
                            }
                        },20);
                    }


17,移动端图片懒加载

 var _img = document.getElementsByClassName('lazys');
                    for (var i = 0; i < _img.length; i++) {
                        if (_img[i].offsetTop < window.innerHeight + document.body.scrollTop) {
                            var src_ = _img[i].getAttribute('data-original');
                            _img[i].setAttribute('src', src_);
                        }
                    }


18,appendHTML()---意在把html字符串转成html节点

HTMLElement.prototype.appendHTML = function(html) {
    var _divTemp = document.createElement("div"), _nodes = null
    // 文档片段,一次性append,提高性能
        , _fragment = document.createDocumentFragment();
    _divTemp.innerHTML = html;
    _nodes = _divTemp.childNodes;
    for (var i=0, length=_nodes.length; i<length; i+=1) {
        _fragment.appendChild(_nodes[i].cloneNode(true));
    }
    this.appendChild(_fragment);
    // 清空内存
    _nodes = null;
    _fragment = null;
};


19,prependHTML:

 

var prependHTML = function(el, html) {
    var divTemp = document.createElement("div"), nodes = null
        , fragment = document.createDocumentFragment();

    divTemp.innerHTML = html;
    nodes = divTemp.childNodes;
    for (var i=0, length=nodes.length; i<length; i+=1) {
       fragment.appendChild(nodes[i].cloneNode(true));
    }
    // 插入到容器的前面 - 差异所在
    el.insertBefore(fragment, el.firstChild);
    // 内存回收?
    nodes = null;
    fragment = null;
};



20,removeElement(ele)删除当前元素



var _removeElement = function(_element){
    var _parentElement = _element.parentNode;
    if(_parentElement){
        _parentElement.removeChild(_element);
    }
};


21,移动端实时监控input的值,例如input框内只能输入数字:

_lowPrice.addEventListener('focus',function(){
    var _str = '';
    var _now = '';
    var filter_time = function(){
        var _time = setInterval(filter_staff_from_exist, 100);
        _lowPrice.addEventListener('blur',function(){
            clearInterval(_time);
        });
    };

    var filter_staff_from_exist = function(){
        _now  = _lowPrice.value.replace('/[^d]+/g','');
        _now = parseInt(_now,10);
        if(isNaN(_now)){
            _now = '';
        }
        _lowPrice.value = _now;
        if (_now != '' && _now != _str) {
            console.log(_now);
        }
        _str = _now;
    };

    filter_time();
});

22,移动端有input框的时候,当input框获得焦点的时候,若此时滑动屏幕,

想要input框失去焦点(一般真对ios机,

因为ios机当是弹层里的input框的时候,此时如果滑动屏幕,焦点会来会跑);
if (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) {
    var windowTop = 0; //初始话可视区域距离页面顶端的距离
    _routerPlay.addEventListener('touchmove',function(){
        var _scrolls = _routerPlay.scrollTop;
        if(_scrolls >= windowTop){
            windowTop = _scrolls;
            var el = document.activeElement;
            if (el.nodeName.toLowerCase() == 'input') {
                el.blur();
                return;
            }
        }else{
            windowTop = _scrolls;
            var el = document.activeElement;
            if (el.nodeName.toLowerCase() == 'input') {
                el.blur();
                return;
            }
        }
    });

} else if (/(Android)/i.test(navigator.userAgent)) {
    var winHeight = window.innerHeight,
        bShowRec = true;
    window.addEventListener('resize', function (e) {

    });
}


23,移动端当弹层里有滚动条的时候,禁止body层滚动

目前测试ios问题不大,不过andriod机上有点问题,先把代码贴出来,谁有好的方法欢迎指导
var _filter = $doc.getElementById('uzai-choose'),
    _choose = _filter.getElementsByClassName('choose')[0],
    _goCity = _choose.getElementsByClassName('go-city')[0];

var startx, starty;
//获得角度
var getAngle = function (angx, angy) {
    return Math.atan2(angy, angx) * 180 / Math.PI;
};
//根据起点终点返回方向 1向上 2向下 3向左 4向右 0未滑动
var getDirection = function (startx, starty, endx, endy) {
    var angx = endx - startx;
    var angy = endy - starty;
    var result = 0;

    //如果滑动距离太短
    if (Math.abs(angx) < 2 && Math.abs(angy) < 2) {
        return result;
    }
    var angle = getAngle(angx, angy);
    if (angle >= -135 && angle <= -45) {
        result = 1;
    } else if (angle > 45 && angle < 135) {
        result = 2;
    } else if ((angle >= 135 && angle <= 180) || (angle >= -180 && angle < -135)) {
        result = 3;
    } else if (angle >= -45 && angle <= 45) {
        result = 4;
    }
    return result;
};

var _bodyTop;
var _flag = true;
ele.addEventListener('touchstart', function (e) {
    startx = e.touches[0].pageX;
    starty = e.touches[0].pageY;
    _bodyTop = $doc.body.scrollTop;
}, false);
//手指离开屏幕
ele.addEventListener('touchmove', function (e) {
    $doc.body.scrollTop = _bodyTop;
    e.stopPropagation();
    var endx, endy;
    endx = e.changedTouches[0].pageX;
    endy = e.changedTouches[0].pageY;
    var direction = getDirection(startx, starty, endx, endy);
    switch (direction) {
        case 0:
            //console.log("未滑动!");
            break;
        case 1:
            //console.log("向上!");
            //  判断是否达到底部
            if (ele.scrollTop + ele.clientHeight + 5>= ele.scrollHeight) {
                //console.log('已经达到底部');
                e.preventDefault();
                return false;
            }
            e.stopPropagation();
            //console.log(e.target.className);
            break;
        case 2:
            //console.log("向下!");
            //  判断是否达到顶部
            var _scroTop = ele.scrollTop;
            if (_scroTop <= 0) {
                //console.log('已经到达顶部!');
                e.preventDefault();
                return false;
            }
            break;
        default:
    }
}, false);

ele.addEventListener('touchend',function(e){
    $doc.body.scrollTop = _bodyTop;
    //alert('ni')
});


24,移动端滑动页面的时候,如果像获得当前页面是第几个页,例如京东的页码分页

var _arr = [];
for(var i = 0,len = $pLi.length;i<len;i++ ){
    var _top = $pLi[i].getBoundingClientRect().top; //元素顶端到可见区域顶端的距离
    var _bottom = $pLi[i].getBoundingClientRect().bottom;
    var _se = document.documentElement.clientHeight; //浏览器可见区域高度。

    if((_top <= _se) && (_bottom > 0) ) {
        var _cur = Number($pLi[i].getAttribute('data-cur-page'));
        _arr.push(_cur);
        var _num = Math.max.apply(null, _arr);
        _pag.innerHTML = _num;
    }
}

25,ajax原生封装

/**
     * 执行基本ajax请求,返回XMLHttpRequest
     *  Ajax.request({
    *  url
    *  async 是否异步 true(默认)
    *  method 请求方式 POST or GET(默认)
    *  data 请求参数 (键值对字符串)
    *  success 请求成功后响应函数,参数为xhr
    *  error 请求失败后响应函数,参数为xhr 11
    *  });
     */
    var Ajax = function () {
        function request(opt) {
            function fn() {
            }
            var url = opt.url || '';  //    获得url
            var async = opt.async !== false, method = opt.method || 'GET', data = opt.data
                || null, success = opt.success || fn, error = opt.failure
                || fn;
            method = method.toUpperCase();  //  默认都转换大写
            if (method == 'GET' && data) {
                var args = '';
                if (typeof data == 'string') {
                    args = data;
                } else if (typeof data == 'object') {
                    var arr = new Array();
                    for (var k in data) {
                        var v = data[k];
                        arr.push(k + '=' + v);
                    }
                    args = arr.join('&');
                }
                url += (url.indexOf('?') == -1 ? '?' : '&') + args;
                data = null;
            }
            // var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveObject('Microsoft.XMLHTTP');
            var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : '';
            xhr.onreadystatechange = function () {// 当请求被发送到服务器时,需要执行一些基于响应的任务
                _onStateChange(xhr, success, error);
            };
            xhr.open(method, url, async);// 创建一个请求,并准备向服务器发送
            if (method == 'POST') {//   如果是POST请求的时候,需要添加个请求消息头
                xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded;');
            }
            xhr.send(data);//   向服务器发送请求
            return xhr;
        }
        function _onStateChange(xhr, success, failure) {
            if (xhr.readyState == 4) {//    请求已完成,且响应已就绪
                var s = xhr.status;//   状态码
                if (s >= 200 && s < 300) {
                    success(xhr);//
                } else {
                    failure(xhr);
                }
            } else {
            }
        }
        return {
            request: request
        };
    }();

26,URL参数设定相关方法

///设置浏览器URL
    function setUrl(url) {
        var _stateObject = {};
        var _title = '';
        history.pushState(_stateObject, _title, url);
    }

    //替换指定传入参数的值,paramName为参数,replaceWith为新值
    function replaceParamVal(Url, paramName, replaceWith) {

        var pattern = paramName + '=([^&]*)';
        var replaceText = paramName + '=' + replaceWith;
        if (Url.match(pattern)) {
            var re = eval('/(' + paramName + '=)([^&]*)/gi');
            var tmp = Url.replace(re, paramName + '=' + replaceWith);

            return (tmp);
        }
        else {
            if (Url.match('[\?]')) {
                return Url + '&' + replaceText;
            }
            else {
                return Url + '?' + replaceText;
            }
        }
        return Url + '\n' + paramName + '\n' + replaceWith;
    }


    ///删除URL指定参数
    function delQueStr(url, ref) //删除参数值
    {
        var str = '';

        if (url.indexOf('?') != -1){
            str = url.substr(url.indexOf('?') + 1);
        }
        else{
            return url;
        }
        var arr = '';
        var returnurl = '';
        var setparam = '';
        if (str.indexOf('&') != -1) {
            arr = str.split('&');
            for (var i in arr) {
                if (arr[i].split('=')[0] != ref) {
                    returnurl = returnurl + arr[i].split('=')[0] + '=' + arr[i].split('=')[1] + '&';
                }
            }
            return url.substr(0, url.indexOf('?')) + '?' + returnurl.substr(0, returnurl.length - 1);
        }
        else {
            arr = str.split('=');
            if (arr[0] == ref){
                return url.substr(0, url.indexOf('?'));
            }
            else{
                return url;
            }
        }
    }

27,原生js懒加载

html:
<div class="p-list">
    <div class="imgs">
        <ul id="productlist">

            <li class="border-right">
                <a href="">
                    <span class="imgs">
                        <span class="lazy">
                            <span class="go-city">
                                <i class="iconfont icon-dingwei"></i>
                                <b class="city">上海出发</b>
                                <b class="how">邮轮</b>
                            </span>
                            <img data-original="https://r03.uzaicdn.com/content/hybrid/images/search/p9.jpg" src="https://r03.uzaicdn.com/content/hybrid/images/search/head-bg-default.png" alt="" class="lazys" οnerrοr="mySheleves.errorImg(this)">
                        </span>
                        <h2><【品质济首】韩国首尔+济州岛4晚5日>全程安排五花特<【品质济首】韩国首尔+济州岛4晚5日>全程安排五花特</h2>
                        <span class="price">
                            <b class="left">¥8888<i>起</i></b>
                            <del>¥9999</del>
                        </span>
                        <span class="label">
                            <b class="reduce">减</b>
                            <b class="self-support">自营</b>
                            <b class="recommend">推荐</b>
                            <b class="the-first">首发</b>
                            <b class="hot">热卖</b>
                            <b class="all">全包</b>
                            <b class="vip">会员</b>
                            <b class="custom">定制</b>
                        </span>
                        <span class="schedule">
                            <i class="iconfont icon-calendar"></i>
                            <b class="">
                                班期:
                                <em>5/6,7/9,12/12</em>
                            </b>
                        </span>
                        <span class="praise">
                            <i class="iconfont icon-pingjia"></i>
                            <b>
                                <em>666+人出游</em> <em class="pingjia">好评率100%</em>
                            </b>
                        </span>
                    </span>
                </a>
            </li>
	</ul>
   </div>
</div>


js:
                    var _imgs = $doc.getElementById('productlist');


                    //var _img = document.getElementsByClassName('lazys');
                    //for (var i = 0; i < _img.length; i++) {
                    //    if ((_img[i].offsetTop < (window.innerHeight + document.body.scrollTop)) && (_img[i].getAttribute('data-original'))) {
                    //        var src_ = _img[i].getAttribute('data-original');
                    //        _img[i].setAttribute('src', src_);
                    //        _img[i].removeAttribute('data-original');
                    //    }
                    //
                    //}
                    //console.log(_imgs[0].offsetTop);
                    if($doc.getElementById('productlist')){
                        var _li = _imgs.getElementsByTagName('li');
                        var _img,
                            _src;
                        for(var i = 0,len = _li.length;i<len;i++){
                            _img = _li[i].getElementsByClassName('lazys')[0];
                            if ((_li[i].offsetTop < (window.innerHeight + document.body.scrollTop)) && (_img.getAttribute('data-original'))){
                                _src = _img.getAttribute('data-original');
                                _img.setAttribute('src', _src);
                                _img.removeAttribute('data-original');
                            }
                        }
                    }

28,原生js处理input框第一个不能为空格

            var _inputValue = $doc.getElementsByClassName('serchinput')[0].value;
            //console.log(_inputValue.substr(0,1));

            if(_inputValue.substr(0,1) === ' '){
                $doc.getElementsByClassName('serchinput')[0].value = _inputValue.replace(/^ +| +$/g,'');
            }

29,删除字符串最后一个字符

substring(0,_inner.length-1);

















  • 1
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值