js将dom转图片或文件

前言

使用 dom-to-image 库

优点:体积小,使用简单

下载

npm 安装或去 github 下载;

用下面的代码直接创建(造福大家,不用去下载 0.0)

 dom-to-image.min.js

/*! dom-to-image 10-06-2017 */
!function(a){"use strict";function b(a,b){function c(a){return b.bgcolor&&(a.style.backgroundColor=b.bgcolor),b.width&&(a.style.width=b.width+"px"),b.height&&(a.style.height=b.height+"px"),b.style&&Object.keys(b.style).forEach(function(c){a.style[c]=b.style[c]}),a}return b=b||{},g(b),Promise.resolve(a).then(function(a){return i(a,b.filter,!0)}).then(j).then(k).then(c).then(function(c){return l(c,b.width||q.width(a),b.height||q.height(a))})}function c(a,b){return h(a,b||{}).then(function(b){return b.getContext("2d").getImageData(0,0,q.width(a),q.height(a)).data})}function d(a,b){return h(a,b||{}).then(function(a){return a.toDataURL()})}function e(a,b){return b=b||{},h(a,b).then(function(a){return a.toDataURL("image/jpeg",b.quality||1)})}function f(a,b){return h(a,b||{}).then(q.canvasToBlob)}function g(a){"undefined"==typeof a.imagePlaceholder?v.impl.options.imagePlaceholder=u.imagePlaceholder:v.impl.options.imagePlaceholder=a.imagePlaceholder,"undefined"==typeof a.cacheBust?v.impl.options.cacheBust=u.cacheBust:v.impl.options.cacheBust=a.cacheBust}function h(a,c){function d(a){var b=document.createElement("canvas");if(b.width=c.width||q.width(a),b.height=c.height||q.height(a),c.bgcolor){var d=b.getContext("2d");d.fillStyle=c.bgcolor,d.fillRect(0,0,b.width,b.height)}return b}return b(a,c).then(q.makeImage).then(q.delay(100)).then(function(b){var c=d(a);return c.getContext("2d").drawImage(b,0,0),c})}function i(a,b,c){function d(a){return a instanceof HTMLCanvasElement?q.makeImage(a.toDataURL()):a.cloneNode(!1)}function e(a,b,c){function d(a,b,c){var d=Promise.resolve();return b.forEach(function(b){d=d.then(function(){return i(b,c)}).then(function(b){b&&a.appendChild(b)})}),d}var e=a.childNodes;return 0===e.length?Promise.resolve(b):d(b,q.asArray(e),c).then(function(){return b})}function f(a,b){function c(){function c(a,b){function c(a,b){q.asArray(a).forEach(function(c){b.setProperty(c,a.getPropertyValue(c),a.getPropertyPriority(c))})}a.cssText?b.cssText=a.cssText:c(a,b)}c(window.getComputedStyle(a),b.style)}function d(){function c(c){function d(a,b,c){function d(a){var b=a.getPropertyValue("content");return a.cssText+" content: "+b+";"}function e(a){function b(b){return b+": "+a.getPropertyValue(b)+(a.getPropertyPriority(b)?" !important":"")}return q.asArray(a).map(b).join("; ")+";"}var f="."+a+":"+b,g=c.cssText?d(c):e(c);return document.createTextNode(f+"{"+g+"}")}var e=window.getComputedStyle(a,c),f=e.getPropertyValue("content");if(""!==f&&"none"!==f){var g=q.uid();b.className=b.className+" "+g;var h=document.createElement("style");h.appendChild(d(g,c,e)),b.appendChild(h)}}[":before",":after"].forEach(function(a){c(a)})}function e(){a instanceof HTMLTextAreaElement&&(b.innerHTML=a.value),a instanceof HTMLInputElement&&b.setAttribute("value",a.value)}function f(){b instanceof SVGElement&&(b.setAttribute("xmlns","http://www.w3.org/2000/svg"),b instanceof SVGRectElement&&["width","height"].forEach(function(a){var c=b.getAttribute(a);c&&b.style.setProperty(a,c)}))}return b instanceof Element?Promise.resolve().then(c).then(d).then(e).then(f).then(function(){return b}):b}return c||!b||b(a)?Promise.resolve(a).then(d).then(function(c){return e(a,c,b)}).then(function(b){return f(a,b)}):Promise.resolve()}function j(a){return s.resolveAll().then(function(b){var c=document.createElement("style");return a.appendChild(c),c.appendChild(document.createTextNode(b)),a})}function k(a){return t.inlineAll(a).then(function(){return a})}function l(a,b,c){return Promise.resolve(a).then(function(a){return a.setAttribute("xmlns","http://www.w3.org/1999/xhtml"),(new XMLSerializer).serializeToString(a)}).then(q.escapeXhtml).then(function(a){return'<foreignObject x="0" y="0" width="100%" height="100%">'+a+"</foreignObject>"}).then(function(a){return'<svg xmlns="http://www.w3.org/2000/svg" width="'+b+'" height="'+c+'">'+a+"</svg>"}).then(function(a){return"data:image/svg+xml;charset=utf-8,"+a})}function m(){function a(){var a="application/font-woff",b="image/jpeg";return{woff:a,woff2:a,ttf:"application/font-truetype",eot:"application/vnd.ms-fontobject",png:"image/png",jpg:b,jpeg:b,gif:"image/gif",tiff:"image/tiff",svg:"image/svg+xml"}}function b(a){var b=/\.([^\.\/]*?)$/g.exec(a);return b?b[1]:""}function c(c){var d=b(c).toLowerCase();return a()[d]||""}function d(a){return a.search(/^(data:)/)!==-1}function e(a){return new Promise(function(b){for(var c=window.atob(a.toDataURL().split(",")[1]),d=c.length,e=new Uint8Array(d),f=0;f<d;f++)e[f]=c.charCodeAt(f);b(new Blob([e],{type:"image/png"}))})}function f(a){return a.toBlob?new Promise(function(b){a.toBlob(b)}):e(a)}function g(a,b){var c=document.implementation.createHTMLDocument(),d=c.createElement("base");c.head.appendChild(d);var e=c.createElement("a");return c.body.appendChild(e),d.href=b,e.href=a,e.href}function h(){var a=0;return function(){function b(){return("0000"+(Math.random()*Math.pow(36,4)<<0).toString(36)).slice(-4)}return"u"+b()+a++}}function i(a){return new Promise(function(b,c){var d=new Image;d.onload=function(){b(d)},d.onerror=c,d.src=a})}function j(a){var b=3e4;return v.impl.options.cacheBust&&(a+=(/\?/.test(a)?"&":"?")+(new Date).getTime()),new Promise(function(c){function d(){if(4===g.readyState){if(200!==g.status)return void(h?c(h):f("cannot fetch resource: "+a+", status: "+g.status));var b=new FileReader;b.onloadend=function(){var a=b.result.split(/,/)[1];c(a)},b.readAsDataURL(g.response)}}function e(){h?c(h):f("timeout of "+b+"ms occured while fetching resource: "+a)}function f(a){console.error(a),c("")}var g=new XMLHttpRequest;g.onreadystatechange=d,g.ontimeout=e,g.responseType="blob",g.timeout=b,g.open("GET",a,!0),g.send();var h;if(v.impl.options.imagePlaceholder){var i=v.impl.options.imagePlaceholder.split(/,/);i&&i[1]&&(h=i[1])}})}function k(a,b){return"data:"+b+";base64,"+a}function l(a){return a.replace(/([.*+?^${}()|\[\]\/\\])/g,"\\$1")}function m(a){return function(b){return new Promise(function(c){setTimeout(function(){c(b)},a)})}}function n(a){for(var b=[],c=a.length,d=0;d<c;d++)b.push(a[d]);return b}function o(a){return a.replace(/#/g,"%23").replace(/\n/g,"%0A")}function p(a){var b=r(a,"border-left-width"),c=r(a,"border-right-width");return a.scrollWidth+b+c}function q(a){var b=r(a,"border-top-width"),c=r(a,"border-bottom-width");return a.scrollHeight+b+c}function r(a,b){var c=window.getComputedStyle(a).getPropertyValue(b);return parseFloat(c.replace("px",""))}return{escape:l,parseExtension:b,mimeType:c,dataAsUrl:k,isDataUrl:d,canvasToBlob:f,resolveUrl:g,getAndEncode:j,uid:h(),delay:m,asArray:n,escapeXhtml:o,makeImage:i,width:p,height:q}}function n(){function a(a){return a.search(e)!==-1}function b(a){for(var b,c=[];null!==(b=e.exec(a));)c.push(b[1]);return c.filter(function(a){return!q.isDataUrl(a)})}function c(a,b,c,d){function e(a){return new RegExp("(url\\(['\"]?)("+q.escape(a)+")(['\"]?\\))","g")}return Promise.resolve(b).then(function(a){return c?q.resolveUrl(a,c):a}).then(d||q.getAndEncode).then(function(a){return q.dataAsUrl(a,q.mimeType(b))}).then(function(c){return a.replace(e(b),"$1"+c+"$3")})}function d(d,e,f){function g(){return!a(d)}return g()?Promise.resolve(d):Promise.resolve(d).then(b).then(function(a){var b=Promise.resolve(d);return a.forEach(function(a){b=b.then(function(b){return c(b,a,e,f)})}),b})}var e=/url\(['"]?([^'"]+?)['"]?\)/g;return{inlineAll:d,shouldProcess:a,impl:{readUrls:b,inline:c}}}function o(){function a(){return b(document).then(function(a){return Promise.all(a.map(function(a){return a.resolve()}))}).then(function(a){return a.join("\n")})}function b(){function a(a){return a.filter(function(a){return a.type===CSSRule.FONT_FACE_RULE}).filter(function(a){return r.shouldProcess(a.style.getPropertyValue("src"))})}function b(a){var b=[];return a.forEach(function(a){try{q.asArray(a.cssRules||[]).forEach(b.push.bind(b))}catch(c){console.log("Error while reading CSS rules from "+a.href,c.toString())}}),b}function c(a){return{resolve:function(){var b=(a.parentStyleSheet||{}).href;return r.inlineAll(a.cssText,b)},src:function(){return a.style.getPropertyValue("src")}}}return Promise.resolve(q.asArray(document.styleSheets)).then(b).then(a).then(function(a){return a.map(c)})}return{resolveAll:a,impl:{readAll:b}}}function p(){function a(a){function b(b){return q.isDataUrl(a.src)?Promise.resolve():Promise.resolve(a.src).then(b||q.getAndEncode).then(function(b){return q.dataAsUrl(b,q.mimeType(a.src))}).then(function(b){return new Promise(function(c,d){a.onload=c,a.onerror=d,a.src=b})})}return{inline:b}}function b(c){function d(a){var b=a.style.getPropertyValue("background");return b?r.inlineAll(b).then(function(b){a.style.setProperty("background",b,a.style.getPropertyPriority("background"))}).then(function(){return a}):Promise.resolve(a)}return c instanceof Element?d(c).then(function(){return c instanceof HTMLImageElement?a(c).inline():Promise.all(q.asArray(c.childNodes).map(function(a){return b(a)}))}):Promise.resolve(c)}return{inlineAll:b,impl:{newImage:a}}}var q=m(),r=n(),s=o(),t=p(),u={imagePlaceholder:void 0,cacheBust:!1},v={toSvg:b,toPng:d,toJpeg:e,toBlob:f,toPixelData:c,impl:{fontFaces:s,images:t,util:q,inliner:r,options:{}}};"undefined"!=typeof module?module.exports=v:a.domtoimage=v}(this);

使用

演示直接加载方式

生成图片查看

<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="UTF-8" />
    <title>test</title>
    <script src="./dom-to-image.min.js"></script>
    <style>
      #app {
        padding-bottom: 20px;
        background-color: #fff;
      }
      p:nth-child(1) {
        background-color: yellow;
      }
      p:nth-child(3) {
        background-color: #489494;
      }
      p:nth-child(5) {
        background-color: red;
      }
      .button {
        width: 200px;
        padding: 5px 50px;
        cursor: pointer;
        border: 1px solid #ccc;
        background-color: #fafafa;
        border-radius: 5px;
        text-align: center;
      }
    </style>
  </head>

  <body>
    <div id="app">
      <p>6666666666</p>
      <p>6666666666</p>
      <p>6666666666</p>
      <p>6666666666</p>
      <p>6666666666</p>
      <p>6666666666</p>
    </div>
    <div class="button" onclick="createImg()">生成图片</div>
  </body>

  <script>
    function createImg() {
      let node = document.getElementById('app')
      domtoimage
        .toPng(node)
        .then(function (dataUrl) {
          console.log(dataUrl)
          var img = document.createElement('img')
          img.src = dataUrl
          document.body.appendChild(img)
        })
        .catch(function (error) {
          console.error('生成失败', error)
        })
    }
  </script>
</html>

生成文件并添加到formData(可发送到后端)

<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="UTF-8" />
    <title>test</title>
    <script src="./dom-to-image.min.js"></script>
    <style>
      #app {
        padding-bottom: 20px;
        background-color: #fff;
      }
      p:nth-child(1) {
        background-color: yellow;
      }
      p:nth-child(3) {
        background-color: #489494;
      }
      p:nth-child(5) {
        background-color: red;
      }
      .button{
        width: 200px;
        padding: 5px 50px;
        cursor: pointer;
        border: 1px solid #ccc;
        background-color: #fafafa;
        border-radius: 5px;
        text-align: center;
      }
    </style>
  </head>

  <body>
    <div id="app">
      <p>6666666666</p>
      <p>6666666666</p>
      <p>6666666666</p>
      <p>6666666666</p>
      <p>6666666666</p>
      <p>6666666666</p>
    </div>
    <div class="button" onclick="appendFormData()">生成文件添加到formData</div>
  </body>

  <script>
    function appendFormData() {
      let node = document.getElementById('app')
      domtoimage.toBlob(node).then(function (blob) {
        console.log(blob)
        let formData = new FormData()
        formData.append('image', blob, 'image.png')
        console.log(formData.get('image'))
      })
    }
  </script>
</html>

生成文件并下载

需要借助 FileSaver.js 库,可自行去下载;

以下直接提供(快说好人一生平安( ^_^ ))

 FileSaver.min.js

(function(a,b){if("function"==typeof define&&define.amd)define([],b);else if("undefined"!=typeof exports)b();else{b(),a.FileSaver={exports:{}}.exports}})(this,function(){"use strict";function b(a,b){return"undefined"==typeof b?b={autoBom:!1}:"object"!=typeof b&&(console.warn("Deprecated: Expected third argument to be a object"),b={autoBom:!b}),b.autoBom&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(a.type)?new Blob(["\uFEFF",a],{type:a.type}):a}function c(a,b,c){var d=new XMLHttpRequest;d.open("GET",a),d.responseType="blob",d.onload=function(){g(d.response,b,c)},d.onerror=function(){console.error("could not download file")},d.send()}function d(a){var b=new XMLHttpRequest;b.open("HEAD",a,!1);try{b.send()}catch(a){}return 200<=b.status&&299>=b.status}function e(a){try{a.dispatchEvent(new MouseEvent("click"))}catch(c){var b=document.createEvent("MouseEvents");b.initMouseEvent("click",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),a.dispatchEvent(b)}}var f="object"==typeof window&&window.window===window?window:"object"==typeof self&&self.self===self?self:"object"==typeof global&&global.global===global?global:void 0,a=/Macintosh/.test(navigator.userAgent)&&/AppleWebKit/.test(navigator.userAgent)&&!/Safari/.test(navigator.userAgent),g=f.saveAs||("object"!=typeof window||window!==f?function(){}:"download"in HTMLAnchorElement.prototype&&!a?function(b,g,h){var i=f.URL||f.webkitURL,j=document.createElement("a");g=g||b.name||"download",j.download=g,j.rel="noopener","string"==typeof b?(j.href=b,j.origin===location.origin?e(j):d(j.href)?c(b,g,h):e(j,j.target="_blank")):(j.href=i.createObjectURL(b),setTimeout(function(){i.revokeObjectURL(j.href)},4E4),setTimeout(function(){e(j)},0))}:"msSaveOrOpenBlob"in navigator?function(f,g,h){if(g=g||f.name||"download","string"!=typeof f)navigator.msSaveOrOpenBlob(b(f,h),g);else if(d(f))c(f,g,h);else{var i=document.createElement("a");i.href=f,i.target="_blank",setTimeout(function(){e(i)})}}:function(b,d,e,g){if(g=g||open("","_blank"),g&&(g.document.title=g.document.body.innerText="downloading..."),"string"==typeof b)return c(b,d,e);var h="application/octet-stream"===b.type,i=/constructor/i.test(f.HTMLElement)||f.safari,j=/CriOS\/[\d]+/.test(navigator.userAgent);if((j||h&&i||a)&&"undefined"!=typeof FileReader){var k=new FileReader;k.onloadend=function(){var a=k.result;a=j?a:a.replace(/^data:[^;]*;/,"data:attachment/file;"),g?g.location.href=a:location=a,g=null},k.readAsDataURL(b)}else{var l=f.URL||f.webkitURL,m=l.createObjectURL(b);g?g.location=m:location.href=m,g=null,setTimeout(function(){l.revokeObjectURL(m)},4E4)}});f.saveAs=g.saveAs=g,"undefined"!=typeof module&&(module.exports=g)});

//# sourceMappingURL=FileSaver.min.js.map

使用

<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="UTF-8" />
    <title>test</title>
    <script src="./dom-to-image.min.js"></script>
    <script src="./FileSaver.min.js"></script>
    <style>
      #app {
        padding-bottom: 20px;
        background-color: #fff;
      }
      p:nth-child(1) {
        background-color: yellow;
      }
      p:nth-child(3) {
        background-color: #489494;
      }
      p:nth-child(5) {
        background-color: red;
      }
      .button{
        width: 200px;
        padding: 5px 50px;
        cursor: pointer;
        border: 1px solid #ccc;
        background-color: #fafafa;
        border-radius: 5px;
        text-align: center;
      }
    </style>
  </head>

  <body>
    <div id="app">
      <p>6666666666</p>
      <p>6666666666</p>
      <p>6666666666</p>
      <p>6666666666</p>
      <p>6666666666</p>
      <p>6666666666</p>
    </div>
    <div class="button" onclick="createFile()">生成文件并下载</div>
  </body>

  <script>
    function createFile() {
      let node = document.getElementById('app')
      domtoimage.toBlob(node).then(function (blob) {
        window.saveAs(blob, 'my-node.png')
      })
    }
  </script>
</html>

记录一招不显示dom生成图片

给需要生成图片 dom 的上级加个隐身术(隐藏样式);

记得给 dom 本身加个宽度,否则它会随上级一起隐身了;

<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="UTF-8" />
    <title>test</title>
    <script src="./dom-to-image.min.js"></script>
    <style>
      #app {
        width: 900px;
        padding-bottom: 20px;
        background-color: #fff;
      }
      p:nth-child(1) {
        background-color: yellow;
      }
      p:nth-child(3) {
        background-color: #489494;
      }
      p:nth-child(5) {
        background-color: red;
      }
      .button {
        width: 200px;
        padding: 5px 50px;
        cursor: pointer;
        border: 1px solid #ccc;
        background-color: #fafafa;
        border-radius: 5px;
        text-align: center;
      }
    </style>
  </head>

  <body>
    <div style="width: 0px; height: 0px; overflow: hidden">
      <div id="app">
        <p>6666666666</p>
        <p>6666666666</p>
        <p>6666666666</p>
        <p>6666666666</p>
        <p>6666666666</p>
        <p>6666666666</p>
      </div>
    </div>
    <div class="button" onclick="createImg()">生成图片</div>
  </body>

  <script>
    function createImg() {
      let node = document.getElementById('app')
      domtoimage
        .toPng(node)
        .then(function (dataUrl) {
          console.log(dataUrl)
          var img = document.createElement('img')
          img.src = dataUrl
          document.body.appendChild(img)
        })
        .catch(function (error) {
          console.error('生成失败', error)
        })
    }
  </script>
</html>

其它参考:前端将dom转换成图片_js将dom元素转成图片-CSDN博客

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: html2canvas是一个JavaScript库,可以将动态创建的DOM元素换为图片。 动态创建DOM元素是指在页面加载完成后,通过JavaScript的createElement方法或者innerHTML属性创建新的DOM元素。而html2canvas可以将这些动态创建的DOM元素换为图片。 使用html2canvas进行换的步骤如下: 首先,在页面中引入html2canvas.js文件。 然后,通过JavaScript动态创建需要换为图片DOM元素。 接下来,使用html2canvas库的方法,传入动态创建的DOM元素作为参数,来实现换。例如,使用html2canvas(element)方法,其中element是要换的DOM元素。 最后,html2canvas会将这个DOM元素渲染为一张图片,并返回一个Canvas元素。我们可以将这个Canvas元素插入到页面中,或者将其换为图片格式进行下载、保存等操作。 需要注意的是,由于html2canvas是基于CanvasAPI实现的,所以换过程中会受到一些限制,比如换的DOM元素不能跨域访问,如果存在跨域图片,可能会导致换出错。 总之,html2canvas库可以帮助我们将动态创建的DOM元素换为图片,在一些需要将页面内容保存为图片或者进行截图等场景中十分有用。 ### 回答2: html2canvas是一个用于截图网页内容并将其换为图片的JavaScript库。它可以将DOM动态创建的元素换为图片。 使用html2canvas动态创建的DOM图片,需要按照以下步骤进行操作: 1. 引入html2canvas库。在HTML文件中添加以下代码: ```html <script src="html2canvas.js"></script> ``` 2. 在JavaScript代码中创建DOM元素,并将其添加到页面中。例如: ```javascript var element = document.createElement('div'); element.innerHTML = '这是动态创建的DOM元素'; document.body.appendChild(element); ``` 3. 使用html2canvas函数来截图动态创建的DOM元素。例如: ```javascript html2canvas(element).then(function(canvas) { // 将canvas换为图片 var image = canvas.toDataURL(); // 显示换后的图片 var imgElement = document.createElement('img'); imgElement.src = image; document.body.appendChild(imgElement); }); ``` 在上面的代码中,html2canvas函数接受一个要截图的DOM元素作为参数,并返回一个Promise对象。在Promise对象的回调函数中,可以使用canvas.toDataURL方法将canvas换为图片的Base64编码,并将其添加到页面中。 通过以上步骤,就可以使用html2canvas将动态创建的DOM元素换为图片,并将其显示在页面上。 ### 回答3: html2canvas是一个JavaScript库,用于将网页内容换为图像。它可以通过动态创建DOM元素并将其换为图像的方式,实现网页截图的功能。 首先,我们需要引入html2canvas库,并创建一个指定大小的canvas元素,用于呈现换后的图像。 接下来,我们可以使用JavaScript动态创建DOM元素,例如使用document.createElement()方法创建新的元素节点,并添加相应的属性和内容。 在创建完DOM元素后,我们需要将其加入到文档中,使其在网页中可见。可以通过document.body.appendChild()或其他适合的方法将DOM元素添加到文档中。 当所有DOM元素都创建完成并添加到文档中后,可以使用html2canvas库的函数将整个文档内容换为图像。可以通过传递canvas元素的引用以及其他可选参数,调用html2canvas()函数实现换。 最后,我们可以通过获取canvas元素的数据,生成图像并将其展示在网页上。可以使用canvas.toDataURL()方法将canvas元素为base64编码的URL,然后将其分配给img元素的src属性即可。 总结来说,使用html2canvas库动态创建DOM换为图像的过程包括:引入库、创建canvas元素、动态创建DOM元素、将DOM元素添加到文档中、调用html2canvas函数进行换、获取canvas数据并展示生成的图像。这样就可以实现将动态创建的DOM换为图像的功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值