js 模拟选择文件效果

 

代码来自网络

< html >
< head >
</ head >
ExpandedBlockStart.gifContractedBlock.gif
< style >
    body
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{}{
        padding-top
: 50px;
        padding-left
: 100px;
        padding-right
: 150px;
    
}

    .fileDiv
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{}{
        float
: left;
        width
: 100px;
        height
: 100px;
        text-align
: center;
        line-height
: 100px;
        font-size
: 12px;
        border
: 1px solid #cccccc;
        margin-right
: 10px;
        margin-bottom
: 10px;
    
}

    .seled
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{}{
        border
: 1px solid #ff0000;
        background-color
: #D6DFF7;
    
}

</ style >

ExpandedBlockStart.gifContractedBlock.gif
< script  type ="text/javascript" >
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/**//*--------------------------------- 以下4个方法 摘自网络 ----------------------------------------*/
ExpandedSubBlockStart.gifContractedSubBlock.gif    Array.prototype.remove 
= function(item) {
ExpandedSubBlockStart.gifContractedSubBlock.gif        
for (var i = 0; i < this.length; i++{
            
if (item == this[i])
                
break;
        }

        
if (i == this.length)
            
return;
ExpandedSubBlockStart.gifContractedSubBlock.gif        
for (var j = i; j < this.length - 1; j++{
            
this[j] = this[j + 1];
        }

        
this.length--;
    }


ExpandedSubBlockStart.gifContractedSubBlock.gif    String.prototype.replaceAll 
= function(AFindText, ARepText) { raRegExp = new RegExp(AFindText, "g"); return this.replace(raRegExp, ARepText); }

ExpandedSubBlockStart.gifContractedSubBlock.gif    
function getAllChildren(e) {
        
return e.all ? e.all : e.getElementsByTagName('*');
    }


ExpandedSubBlockStart.gifContractedSubBlock.gif    document.getElementsBySelector 
= function(selector) {

ExpandedSubBlockStart.gifContractedSubBlock.gif        
if (!document.getElementsByTagName) {
            
return new Array();
        }


        
var tokens = selector.split(' ');
        
var currentContext = new Array(document);
ExpandedSubBlockStart.gifContractedSubBlock.gif        
for (var i = 0; i < tokens.length; i++{
            token 
= tokens[i].replace(/^\s+/'').replace(/\s+$/''); ;
ExpandedSubBlockStart.gifContractedSubBlock.gif            
if (token.indexOf('#'> -1{

                
var bits = token.split('#');
                
var tagName = bits[0];
                
var id = bits[1];
                
var element = document.getElementById(id);
ExpandedSubBlockStart.gifContractedSubBlock.gif                
if (tagName && element.nodeName.toLowerCase() != tagName) {

                    
return new Array();
                }

                currentContext 
= new Array(element);
                
continue;
            }

ExpandedSubBlockStart.gifContractedSubBlock.gif            
if (token.indexOf('.'> -1{

                
var bits = token.split('.');
                
var tagName = bits[0];
                
var className = bits[1];
ExpandedSubBlockStart.gifContractedSubBlock.gif                
if (!tagName) {
                    tagName 
= '*';
                }


                
var found = new Array;
                
var foundCount = 0;
ExpandedSubBlockStart.gifContractedSubBlock.gif                
for (var h = 0; h < currentContext.length; h++{
                    
var elements;
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
if (tagName == '*'{
                        elements 
= getAllChildren(currentContext[h]);
ExpandedSubBlockStart.gifContractedSubBlock.gif                    }
 else {
                        elements 
= currentContext[h].getElementsByTagName(tagName);
                    }

ExpandedSubBlockStart.gifContractedSubBlock.gif                    
for (var j = 0; j < elements.length; j++{
                        found[foundCount
++= elements[j];
                    }

                }

                currentContext 
= new Array;
                
var currentContextIndex = 0;
ExpandedSubBlockStart.gifContractedSubBlock.gif                
for (var k = 0; k < found.length; k++{
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
if (found[k].className && found[k].className.match(new RegExp('\\b' + className + '\\b'))) {
                        currentContext[currentContextIndex
++= found[k];
                    }

                }

                
continue;
            }

ExpandedSubBlockStart.gifContractedSubBlock.gif            
if (token.match(/^(\w*)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/)) {
                
var tagName = RegExp.$1;
                
var attrName = RegExp.$2;
                
var attrOperator = RegExp.$3;
                
var attrValue = RegExp.$4;
ExpandedSubBlockStart.gifContractedSubBlock.gif                
if (!tagName) {
                    tagName 
= '*';
                }

                
var found = new Array;
                
var foundCount = 0;
ExpandedSubBlockStart.gifContractedSubBlock.gif                
for (var h = 0; h < currentContext.length; h++{
                    
var elements;
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
if (tagName == '*'{
                        elements 
= getAllChildren(currentContext[h]);
ExpandedSubBlockStart.gifContractedSubBlock.gif                    }
 else {
                        elements 
= currentContext[h].getElementsByTagName(tagName);
                    }

ExpandedSubBlockStart.gifContractedSubBlock.gif                    
for (var j = 0; j < elements.length; j++{
                        found[foundCount
++= elements[j];
                    }

                }

                currentContext 
= new Array;
                
var currentContextIndex = 0;
                
var checkFunction;
ExpandedSubBlockStart.gifContractedSubBlock.gif                
switch (attrOperator) {
                    
case '=':
ExpandedSubBlockStart.gifContractedSubBlock.gif                        checkFunction 
= function(e) return (e.getAttribute(attrName) == attrValue); };
                        
break;
                    
case '~':
ExpandedSubBlockStart.gifContractedSubBlock.gif                        checkFunction 
= function(e) return (e.getAttribute(attrName).match(new RegExp('\\b' + attrValue + '\\b'))); };
                        
break;
                    
case '|':
ExpandedSubBlockStart.gifContractedSubBlock.gif                        checkFunction 
= function(e) return (e.getAttribute(attrName).match(new RegExp('^' + attrValue + '-?'))); };
                        
break;
                    
case '^':
ExpandedSubBlockStart.gifContractedSubBlock.gif                        checkFunction 
= function(e) return (e.getAttribute(attrName).indexOf(attrValue) == 0); };
                        
break;
                    
case '$':
ExpandedSubBlockStart.gifContractedSubBlock.gif                        checkFunction 
= function(e) return (e.getAttribute(attrName).lastIndexOf(attrValue) == e.getAttribute(attrName).length - attrValue.length); };
                        
break;
                    
case '*':
ExpandedSubBlockStart.gifContractedSubBlock.gif                        checkFunction 
= function(e) return (e.getAttribute(attrName).indexOf(attrValue) > -1); };
                        
break;
                    
default:
ExpandedSubBlockStart.gifContractedSubBlock.gif                        checkFunction 
= function(e) return e.getAttribute(attrName); };
                }

                currentContext 
= new Array;
                
var currentContextIndex = 0;
ExpandedSubBlockStart.gifContractedSubBlock.gif                
for (var k = 0; k < found.length; k++{
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
if (checkFunction(found[k])) {
                        currentContext[currentContextIndex
++= found[k];
                    }

                }

                
continue;
            }

            tagName 
= token;
            
var found = new Array;
            
var foundCount = 0;
ExpandedSubBlockStart.gifContractedSubBlock.gif            
for (var h = 0; h < currentContext.length; h++{
                
var elements = currentContext[h].getElementsByTagName(tagName);
ExpandedSubBlockStart.gifContractedSubBlock.gif                
for (var j = 0; j < elements.length; j++{
                    found[foundCount
++= elements[j];
                }

            }

            currentContext 
= found;
        }

        
return currentContext;
    }



ExpandedSubBlockStart.gifContractedSubBlock.gif    
/**//*--------------------------------------------------------------------------------------------------------*/
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/**//*
    * author: 王永山 
    * version: 1.1 beta 
    * date: 2008-09-09 
    * email: [email]wangys0927@163.com[/email] 
    * 
    * update: 
    * 1. 针对前2个beta版,该版本修复了前两个版本出现的 bug , 
    * 2. 进行了代码的简单封装(由于本人初学js,对js掌握的很浅,因此面向对象的理解很差,封装的不好); 
    * 3. 增加了对 Ctrl 和 Shift 键的支持(目前shift键的功能和ctrl键的功能一样,还不能达到仿windows的选区Shift键的功能)。 
    * 4. 增加了获取“被选区选中元素”的方法,可以点击按钮“getRegions”看效果。 
    
*/



ExpandedSubBlockStart.gifContractedSubBlock.gif    
function addEvent(eventType, eventFunc, eventObj) {
        eventObj 
= eventObj || document;
        
if (window.attachEvent) eventObj.attachEvent("on" + eventType, eventFunc);
        
if (window.addEventListener) eventObj.addEventListener(eventType, eventFunc, false);
    }

ExpandedSubBlockStart.gifContractedSubBlock.gif    
function clearEventBubble(evt) {
        evt 
= evt || window.event;
        
if (evt.stopPropagation) evt.stopPropagation(); else evt.cancelBubble = true;
        
if (evt.preventDefault) evt.preventDefault(); else evt.returnValue = false;
    }


ExpandedSubBlockStart.gifContractedSubBlock.gif    
function posXY(event) {
        event 
= event || window.event;
        
var posX = event.pageX || (event.clientX +
            (document.documentElement.scrollLeft 
|| document.body.scrollLeft));
        
var posY = event.pageY || (event.clientY +
            (document.documentElement.scrollTop 
|| document.body.scrollTop));
ExpandedSubBlockStart.gifContractedSubBlock.gif        
return { x: posX, y: posY };
    }

    
//----------- 区域选择关键方法 ----------------------- 
    var _selectedRegions = [];
ExpandedSubBlockStart.gifContractedSubBlock.gif    
function RegionSelect(selRegionProp) {
        
this.regions = [];
        
var _regions = document.getElementsBySelector(selRegionProp["region"]);
ExpandedSubBlockStart.gifContractedSubBlock.gif        
if (_regions && _regions.length > 0{
            
var _self = this;
ExpandedSubBlockStart.gifContractedSubBlock.gif            
for (var i = 0; i < _regions.length; i++{
ExpandedSubBlockStart.gifContractedSubBlock.gif                _regions[i].onmousedown 
= function() {
                    
var evt = window.event || arguments[0];
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
if (!evt.shiftKey && !evt.ctrlKey) {
                        
// 清空所有select样式 
                        _self.clearSelections(_regions);
                        
this.className += " " + _self.selectedClass;
                        
// 清空selected数组,并加入当前select中的元素 
                        _selectedRegions = [];
                        _selectedRegions.push(
this);
ExpandedSubBlockStart.gifContractedSubBlock.gif                    }
 else {
ExpandedSubBlockStart.gifContractedSubBlock.gif                        
if (this.className.indexOf(_self.selectedClass) == -1{
                            
this.className += " " + _self.selectedClass;
                            _selectedRegions.push(
this);
ExpandedSubBlockStart.gifContractedSubBlock.gif                        }
 else {
                            
this.className = this.className.replaceAll(_self.selectedClass, "");
                            _selectedRegions.remove(
this);
                        }

                    }

                    clearEventBubble(evt);
                }

                
this.regions.push(_regions[i]);
            }

        }

        
this.selectedClass = selRegionProp["selectedClass"];
        
this.selectedRegion = [];
        
this.selectDiv = null;
        
this.startX = null;
        
this.startY = null;
    }


ExpandedSubBlockStart.gifContractedSubBlock.gif    RegionSelect.prototype.select 
= function() {
        
var _self = this;
ExpandedSubBlockStart.gifContractedSubBlock.gif        addEvent(
"mousedown"function() {
            
var evt = window.event || arguments[0];
            _self.onBeforeSelect(evt);
            clearEventBubble(evt);
        }
, document);

ExpandedSubBlockStart.gifContractedSubBlock.gif        addEvent(
"mousemove"function() {
            
var evt = window.event || arguments[0];
            _self.onSelect(evt);
            clearEventBubble(evt);
        }
, document);

ExpandedSubBlockStart.gifContractedSubBlock.gif        addEvent(
"mouseup"function() {
            _self.onEnd();
        }
, document);
    }


ExpandedSubBlockStart.gifContractedSubBlock.gif    RegionSelect.prototype.onBeforeSelect 
= function(evt) {
        
// 创建模拟 选择框 
ExpandedSubBlockStart.gifContractedSubBlock.gif
        if (!document.getElementById("selContainer")) {
            
this.selectDiv = document.createElement("div");
            
this.selectDiv.style.cssText = "position:absolute;width:0px;height:0px;font-size:0px;margin:0px;padding:0px;border:1px dashed #0099FF;background-color:#C3D5ED;z-index:1000;filter:alpha(opacity:60);opacity:0.6;display:none;";
            
this.selectDiv.id = "selContainer";
            document.body.appendChild(
this.selectDiv);
ExpandedSubBlockStart.gifContractedSubBlock.gif        }
 else {
            
this.selectDiv = document.getElementById("selContainer");
        }


        
this.startX = posXY(evt).x;
        
this.startY = posXY(evt).y;
        
this.isSelect = true;

    }


ExpandedSubBlockStart.gifContractedSubBlock.gif    RegionSelect.prototype.onSelect 
= function(evt) {
        
var _self = this;
ExpandedSubBlockStart.gifContractedSubBlock.gif        
if (_self.isSelect) {
            
if (_self.selectDiv.style.display == "none") _self.selectDiv.style.display = "";

            
var posX = posXY(evt).x;
            
var poxY = posXY(evt).y;

            _self.selectDiv.style.left 
= Math.min(posX, this.startX);
            _self.selectDiv.style.top 
= Math.min(poxY, this.startY);
            _self.selectDiv.style.width 
= Math.abs(posX - this.startX);
            _self.selectDiv.style.height 
= Math.abs(poxY - this.startY);

            
var regionList = _self.regions;
ExpandedSubBlockStart.gifContractedSubBlock.gif            
for (var i = 0; i < regionList.length; i++{
                
var r = regionList[i], sr = _self.innerRegion(_self.selectDiv, r);
ExpandedSubBlockStart.gifContractedSubBlock.gif                
if (sr && r.className.indexOf(_self.selectedClass) == -1{
                    r.className 
= r.className + " " + _self.selectedClass;
                    _selectedRegions.push(r);
ExpandedSubBlockStart.gifContractedSubBlock.gif                }
 else if (!sr && r.className.indexOf(_self.selectedClass) != -1{
                    r.className 
= r.className.replaceAll(_self.selectedClass, "");
                    _selectedRegions.remove(r);
                }


            }

        }

    }


ExpandedSubBlockStart.gifContractedSubBlock.gif    RegionSelect.prototype.onEnd 
= function() {
ExpandedSubBlockStart.gifContractedSubBlock.gif        
if (this.selectDiv) {
            
this.selectDiv.style.display = "none";
        }

        
this.isSelect = false;
        
//_selectedRegions = this.selectedRegion; 
    }


    
// 判断一个区域是否在选择区内 
ExpandedSubBlockStart.gifContractedSubBlock.gif
    RegionSelect.prototype.innerRegion = function(selDiv, region) {
        
var s_top = parseInt(selDiv.style.top);
        
var s_left = parseInt(selDiv.style.left);
        
var s_right = s_left + parseInt(selDiv.offsetWidth);
        
var s_bottom = s_top + parseInt(selDiv.offsetHeight);

        
var r_top = parseInt(region.offsetTop);
        
var r_left = parseInt(region.offsetLeft);
        
var r_right = r_left + parseInt(region.offsetWidth);
        
var r_bottom = r_top + parseInt(region.offsetHeight);

        
var t = Math.max(s_top, r_top);
        
var r = Math.min(s_right, r_right);
        
var b = Math.min(s_bottom, r_bottom);
        
var l = Math.max(s_left, r_left);

ExpandedSubBlockStart.gifContractedSubBlock.gif        
if (b > t + 5 && r > l + 5{
            
return region;
ExpandedSubBlockStart.gifContractedSubBlock.gif        }
 else {
            
return null;
        }


    }


ExpandedSubBlockStart.gifContractedSubBlock.gif    RegionSelect.prototype.clearSelections 
= function(regions) {
ExpandedSubBlockStart.gifContractedSubBlock.gif        
for (var i = 0; i < regions.length; i++{
            regions[i].className 
= regions[i].className.replaceAll(this.selectedClass, "");
        }

    }


ExpandedSubBlockStart.gifContractedSubBlock.gif    
function getSelectedRegions() {
        
return _selectedRegions;
    }

ExpandedSubBlockStart.gifContractedSubBlock.gif    
/**//*-------------------------------------- 区域选择方法结束 --------------------------------------------*/

ExpandedSubBlockStart.gifContractedSubBlock.gif    
function showSelDiv() {
        
var selInfo = "";
        
var arr = getSelectedRegions();
ExpandedSubBlockStart.gifContractedSubBlock.gif        
for (var i = 0; i < arr.length; i++{
            selInfo 
+= arr[i].innerHTML + "\n";
        }


        alert(
"共选择 " + arr.length + " 个文件,分别是:\n" + selInfo);

    }
 
     
</ script >

< body >
    
< button  onclick ="showSelDiv();" >
        getRegions
</ button >
    
< div  class ="fileDiv" >
        file1
</ div >
    
< div  class ="fileDiv" >
        file2
</ div >
    
< div  class ="fileDiv" >
        file3
</ div >
    
< div  class ="fileDiv" >
        file4
</ div >
    
< div  class ="fileDiv" >
        file5
</ div >
    
< div  class ="fileDiv" >
        file6
</ div >
    
< div  class ="fileDiv" >
        file7
</ div >
    
< div  class ="fileDiv" >
        file8
</ div >
    
< div  class ="fileDiv" >
        file9
</ div >
    
< div  class ="fileDiv" >
        file10
</ div >
    
< div  class ="fileDiv" >
        file11
</ div >
    
< div  class ="fileDiv" >
        file12
</ div >
    
< div  class ="fileDiv" >
        file13
</ div >
    
< div  class ="fileDiv" >
        file14
</ div >
    
< div  class ="fileDiv" >
        file15
</ div >
    
< div  class ="fileDiv" >
        file16
</ div >
    
< div  class ="fileDiv" >
        file17
</ div >
    
< div  class ="fileDiv" >
        file18
</ div >
    
< div  class ="fileDiv" >
        file19
</ div >
    
< div  class ="fileDiv" >
        file20
</ div >
    
< div  class ="fileDiv" >
        file21
</ div >
    
< div  class ="fileDiv" >
        file22
</ div >
    
< div  class ="fileDiv" >
        file23
</ div >
    
< div  class ="fileDiv" >
        file24
</ div >
    
< div  class ="fileDiv" >
        file25
</ div >
    
< div  class ="fileDiv" >
        file26
</ div >
    
< div  class ="fileDiv" >
        file27
</ div >
    
< div  class ="fileDiv" >
        file28
</ div >
    
< div  class ="fileDiv" >
        file29
</ div >
    
< div  class ="fileDiv" >
        file30
</ div >
    
< div  class ="fileDiv" >
        file31
</ div >
    
< div  class ="fileDiv" >
        file32
</ div >
    
< div  class ="fileDiv" >
        file33
</ div >
    
< div  class ="fileDiv" >
        file34
</ div >
    
< div  class ="fileDiv" >
        file35
</ div >
    
< div  class ="fileDiv" >
        file36
</ div >
    
< div  class ="fileDiv" >
        file37
</ div >
    
< div  class ="fileDiv" >
        file38
</ div >
    
< div  class ="fileDiv" >
        file39
</ div >
    
< div  class ="fileDiv" >
        file40
</ div >
    
< div  class ="fileDiv" >
        file41
</ div >
    
< div  class ="fileDiv" >
        file42
</ div >
    
< div  class ="fileDiv" >
        file43
</ div >
    
< div  class ="fileDiv" >
        file44
</ div >
    
< div  class ="fileDiv" >
        file45
</ div >
    
< div  class ="fileDiv" >
        file46
</ div >
    
< div  class ="fileDiv" >
        file47
</ div >
    
< div  class ="fileDiv" >
        file48
</ div >
    
< div  class ="fileDiv" >
        file49
</ div >
    
< div  class ="fileDiv" >
        file50
</ div >
    
< div  class ="fileDiv" >
        file51
</ div >
    
< div  class ="fileDiv" >
        file52
</ div >
    
< div  class ="fileDiv" >
        file53
</ div >
    
< div  class ="fileDiv" >
        file54
</ div >
    
< div  class ="fileDiv" >
        file55
</ div >
    
< div  class ="fileDiv" >
        file56
</ div >
    
< div  class ="fileDiv" >
        file57
</ div >
    
< div  class ="fileDiv" >
        file58
</ div >
    
< div  class ="fileDiv" >
        file59
</ div >
    
< div  class ="fileDiv" >
        file60
</ div >
    
< div  style ="float: left; width: 100%;" >
        
< button  onclick ="showSelDiv();" >
            getRegions
</ button ></ div >
</ body >

ExpandedBlockStart.gifContractedBlock.gif
< script >
ExpandedSubBlockStart.gifContractedSubBlock.gif    
new RegionSelect({
        region: 
'div.fileDiv',
        selectedClass: 
'seled'
    }
).select(); 
</ script >

</ html >
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
步骤一:引入JS文件 在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.2.0.js 备注:支持使用 AMD/CMD 标准模块加载方法加载 步骤二:通过config接口注入权限验证配置 所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用(同一个url仅需调用一次,对于变化url的SPA的web app可在每次url变化时进行调用,目前Android微信客户端不支持pushState的H5新特性,所以使用pushState来实现web app的页面会导致签名失败,此问题会在Android6.2中修复)。 wx.config({ debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: '', // 必填,企业号的唯一标识,此处填写企业号corpid timestamp: , // 必填,生成签名的时间戳 nonceStr: '', // 必填,生成签名的随机串 signature: '',// 必填,签名,见附录1 jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); 步骤三:通过ready接口处理成功验证 wx.ready(function(){ // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。 }); 步骤四:通过error接口处理失败验证 wx.error(function(res){ // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。 }); 接口调用说明 所有接口通过wx对象(也可使用jWeixin对象)来调用,参数是一个对象,除了每个接口本身需要传的参数之外,还有以下通用参数: success:接口调用成功时执行的回调函数。 fail:接口调用失败时执行的回调函数。 complete:接口调用完成时执行的回调函数,无论成功或失败都会执行。 cancel:用户点击取消时的回调函数,仅部分有用户取消操作的api才会用到。 trigger: 监听Menu中的按钮点击时触发的方法,该方法仅支持Menu中的相关接口。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值