javascript Range对象跨浏览器常用操作

WPS宏编程-JS宏常用基础操作 WPS的JS宏基本用法 阅读详情

转摘自: http://kjah.iteye.com/blog/420624


最近在开发在线代码编辑器的过程中频繁接触Range对象,由于跨浏览器的需求,使用到ie下TextRange对象和标准Dom Range对象。开发的功能主要涉及即时代码着色(CodeColoring)和语法提示(CodeHints)功能,稍后会总结功能开发中问题或提供源码。

以下是个人对Range对象的了解和常用操作的实例和总结:

 

Range对象

Range对象表示文档的连续范围区域,如用户在浏览器窗口中用鼠标拖动选中的区域。

dom标准Range对象
http://www.w3school.com.cn/xmldom/dom_range.asp

在ie中使用TextRange对象
http://www.hbcms.com/main/dhtml/objects/obj_textrange.html

 

range对象常用的建立方法
在开发中除了上述文档中的标准建立方法,大多如下方式建立

标准dom:
var range=window.getSelection().getRangeAt(0);

ie:
var range=document.selection.createRange();

 

注意:标准dom是从window中获取selection对象,而ie是从document对象中获取。


标准dom range对象(以下称dom rang)和ie的TextRange对象(以下称TextRange),在操作模式上有很大区别,可以说dom range是基于dom结构控制的,TextRange是基于文本节点字节控制的,阅读下面示例会更好理解这二者的操作模式。以下所说的range对象是指在html结构中进行选择和更改(designMode=on contentEditable=true状态下)操作,在textarea中的操作比这简单,不是当前的研究环境。

 

range对象的具体方法和属性请查看上边列出的相关api文档,下面对实际开发过程中常用功能讲解

 

1.区域选择 获取区域中文本
   TextRange的区域选择
   TextRange对象主要使用以下方法控制区域的选择:moveStart moveEnd move
 这三个函数使用相同的参数语法:fn(sUnit [, iCount])
 第一个参数是指移动的单位,可以使用的参数:character(字符)、word(词)、sentence(段落)、textedit(整个编辑区)
    第二个参数指移动的数量单位,负数向所在位置之前移动,正数向所在位置之后移动。
    在实际开发中一般使用character,其他几个参数在中文环境和html编辑时,和预想位置有偏差。
 
 例1:TextRange选择光标前4个字符

Js代码    收藏代码
  1. var rg=document.selection.createRange();  
  2. rg.moveStart("character",-4);  
  3. rg.select();//显式选择文本区域,不调用此函数也可以获得选择的内容  
  4. var text=rg.text;//获得选择的文本  
  5. var htmlText=rg.htmlText;//获得选择文本的html代码  

 
 
    用rg.htmlText获得选择文本的html代码,但获得结果不尽人意,
    如:<b>aaaa</b>bb ,当选择aabb段时,.htmlTex返回的是<b>aa</b>bb而不是aa</b>bb
    其他常用位置控制函数:
    collapse: 合并前后选择点,true为开始点,false为结尾点。
    moveToPoint: 移动光标到坐标 moveToBookmark: 移动到书签。

 

   dom range的区域选择
   dom range对象选择区域主要以dom节点为为坐标,所有边界移动和区域选择函数都是以dom节点为参照的
 setEnd()setStart()是控制范围的前边界点和后边界点位置的函数,
 有两个参数,第一个参数是dom节点,第二个参数是偏移量,这个参数和TextRange.move中不同,是相对于dom节点的偏移量。
 如:有文字节点node1 nodeValue是aaabbbccc,setStart(node1,3)则设置开始位置在字符a、b之间
 那如何像例1一样选择光标前4个字符呢,这需要了解dom range对象的几个属性:
  endContainer    包含范围的结束点的 dom节点。 
  endOffset       endContainer 中的结束点位置。 
  startContainer  包含范围的开始点的 dom节点。 
  startOffset     startContainer 中的开始点位置。 
 例2:dom range选择光标前4个字符
  

Js代码    收藏代码
  1. var rg=window.getSelection().getRangeAt(0);  
  2. rg.setStart(rg.startContainer,rg.startOffset-4);//获得当前range strat所在节点和偏移量,计算后作为参数  
  3.       //在调用setStart后即显式选择,与TextRange不同  
  4. var text=rg.toString();//获得选择文本  
  5. rg.collapse(false);//collapse函数与TextRange.collapse相同  

 
 例2中range选择范围操作适用于单一的文本内容,如果是html内容就需要进一步计算才能正确得到,总的来看dom range在复杂dom结 构中进行相对范围选择是比较麻烦的。
 另外,dom range没有直接的方法获得选择内容的html代码。在html可编辑状态下可以通过surroundContents()方法用一个span之类的标签包裹住内容后再通过innerHTML获得内容,但是在选择范围边界点在html开始和结束标签内时(如:<a>123</a>边界点在a标签内)会抛出一个异常。


以下是测试用完整代码,包含例1和例2的代码和一个测试用html可编辑区。

 

Html代码    收藏代码
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">  
  2. <HTML>  
  3.  <HEAD>  
  4.   <TITLE> New Document </TITLE>  
  5.  </HEAD>  
  6.  <BODY>  
  7.   <SCRIPT LANGUAGE="JavaScript">  
  8.   <!--  
  9.     window.onload=function(){  
  10.         var iframeContent="";  
  11.         var divContent="";  
  12.         var divChange=false;  
  13.         var iframeChange=false;  
  14.         var $=function(s){return document.getElementById(s);}  
  15.         $("ifram_div").innerHTML+='<div id="infoIframe">iframe</div><iframe id="youretextarea" style="height:200px;width:99%;" class="_editbox"></iframe>';  
  16.         var fw=$("youretextarea").contentWindow;  
  17.         var f=fw.document;  
  18.         f.designMode = 'On';  
  19.         f.contentEditable = true;   
  20.         f.open();   
  21.         f.writeln('<html><style>p{margin:0px;padding:0px;}body{margin:0px;padding:0px;font:16/18px Arial;}</style><body><b>aaaa</b><u>bbbb</u>cccddd</body></html>');   
  22.         f.close();  
  23.         if(f.attachEvent){  
  24.             f.attachEvent("onkeyup",fun1);  
  25.         }else{  
  26.             fw.addEventListener("keyup",fun1,true);  
  27.         }  
  28.         function fun1(){  
  29.               
  30.             if(f.selection){  
  31.                 var rg=f.selection.createRange();  
  32.                 rg.moveStart("character",-4);  
  33.                 //rg.select();//显式选择文本区域,不调用此函数也可以获得选择的内容  
  34.                 var text=rg.text;//获得选择的文本  
  35.                 var htmlText=rg.htmlText;//获得选择文本的html代码  
  36.                 alert(text);  
  37.                   
  38.             }else{  
  39.                 var rg=fw.getSelection().getRangeAt(0);  
  40.                 rg.setStart(rg.startContainer,rg.startOffset-4);//获得当前range strat所在节点和偏移量,计算后作为参数  
  41.                                                                 //在调用setStart后即显式选择,与TextRange不同  
  42.                 var text=rg.toString();//获得选择文本  
  43.                 rg.collapse(false);//collapse函数与TextRange.collapse相同  
  44.                 alert(text);  
  45.             }  
  46.         }  
  47.     }  
  48.   //-->  
  49.   </SCRIPT>  
  50.   <div id="ifram_div"></div>  
  51.  </BODY>  
  52. </HTML>  

 

 2.插入文本

   TextRange插入文本

      使用TextRang插入文本比较简单,直接调用pasteHTML()方法就可以直接插入html代码。
    Dom Range插入文本

       使用Dom Range插入文本相对复杂一些,Dom Range对象使用insertNode()方法实现插入,但是insertNode是在Range的开始位置插入一 个节点,参数是一个节点而不是字符串,我们可以通过插入文本节点实现,如果使用document.createTextNode建立文本节点,文本中的HTML标记会自动转换,但空格是个特例,并不会自动转换为&nbsp;,这使我在开发代码缩进时很头疼,最后解决的办法,是使用Rang.createContextualFragment,这个方法虽然在文档中没有找到,但测试多个浏览器都支持此方法,此方法返回的是一个DocumentFragment对

象。以下是示例代码:
 例3:

Js代码    收藏代码
  1. var rg = window.getSelection().getRangeAt(0);   
  2. var fragment = rg.createContextualFragment(str);   
  3. rg.insertNode(fragment);  

 这段代码虽然实现插入了文本,但是光标位置却在插入文本之前,因为“insertNode是在Range的开始位置插入一 个节点”,接下来我们实现光标的控制,这需要设置Range对象的位置,并更新Selection对象的Range,代码如下:

例4:

Js代码    收藏代码
  1. var selection=window.getSelection();  
  2. var rg=selection.getRangeAt(0);  
  3. var fragment = rg.createContextualFragment(str);  
  4. var oLastNode = fragment.lastChild; //获得DocumentFragment的末尾位置  
  5. rg.insertNode(fragment);  
  6. rg.setEndAfter(oLastNode);//设置末尾位置  
  7. rg.collapse(false);//合并范围至末尾  
  8. selection.removeAllRanges();//清除range  
  9. selection.addRange(rg);//设置range  

 以下是一个代码缩进功能的部分代码作为示例:按tab键时会在当前位置,插入4个空格,解决在编辑时不能输入tab的问题。实际应用中的功能包括多行缩进和自动缩进。

Html代码    收藏代码
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">  
  2. <HTML>  
  3.  <HEAD>  
  4.   <TITLE> New Document </TITLE>  
  5.  </HEAD>  
  6.  <BODY>  
  7.   <SCRIPT LANGUAGE="JavaScript">  
  8.   <!--  
  9.     window.onload=function(){  
  10.         var iframeContent="";  
  11.         var divContent="";  
  12.         var divChange=false;  
  13.         var iframeChange=false;  
  14.         var $=function(s){return document.getElementById(s);}  
  15.         $("ifram_div").innerHTML+='<div id="infoIframe">iframe</div><iframe id="youretextarea" style="height:200px;width:99%;" class="_editbox"></iframe>';  
  16.         var fw=$("youretextarea").contentWindow;  
  17.         var f=fw.document;  
  18.         f.designMode = 'On';  
  19.         f.contentEditable = true;   
  20.         f.open();   
  21.         f.writeln('<html><style>p{margin:0px;padding:0px;}body{margin:0px;padding:0px;font:16/18px Arial;}</html>');   
  22.         f.close();  
  23.         if(f.attachEvent){  
  24.             f.attachEvent("onkeydown",fun1);  
  25.         }else{  
  26.             fw.addEventListener("keydown",fun1,true);  
  27.         }  
  28.         function fun1(e){  
  29.             ee=e||window.event;  
  30.             var code=e.charCode||e.keyCode;  
  31.             var strTab="&nbsp;&nbsp;&nbsp;&nbsp;";  
  32.             if(code==9){//tab键  
  33.                 if(f.selection){//ie  
  34.                     e.returnValue=false;//取消浏览器默认动作 ie  
  35.                     var rg=f.selection.createRange();  
  36.                     rg.pasteHTML(strTab);  
  37.                 }else{  
  38.                     e.preventDefault();//取消浏览器默认动作    
  39.                     var selection=fw.getSelection();  
  40.                     var rg=selection.getRangeAt(0);  
  41.                     var fragment = rg.createContextualFragment(strTab);  
  42.                     var oLastNode = fragment.lastChild; //获得DocumentFragment的末尾位置  
  43.                     rg.insertNode(fragment);  
  44.                     rg.setEndAfter(oLastNode);//设置末尾位置  
  45.                     rg.collapse(false);//合并范围至末尾  
  46.                     selection.removeAllRanges();//清除range  
  47.                     selection.addRange(rg);//设置range  
  48.                 }  
  49.             }  
  50.         }  
  51.     }  
  52.   //-->  
  53.   </SCRIPT>  
  54.   <div id="ifram_div"></div>  
  55.  </BODY>  
  56. </HTML>  

 

3.替换
    综合介绍的选择和插入的方法可完成替换功能,TextRange比较简单pasteHTML方法会替换原来Range选中的文本,Dom Range的insertNode不会删除原range选中内容,需要调用deleteContents()方法先删除选择内容。



Range:Javascript 的 Range 对象 JavaScript 中的 Range 对象 Range 对象允许您消除循环 (for/while/do=while) 循环。 在某种程度上,Array 对象可用于替换循环 (map,forEach),但这涉及初始化数组。 对于大循环,这可能很昂贵。 Range 允许您对一系列值执行 forEach、map、forEach、filter 和 reduce 操作。 rangetest.js 会给你一个如何使用这个对象的想法。 这里提供了两种实现。 range.js 定义了一个经典的命令式实现——即方法是使用循环定义的,而 rangeFn.js 提供了一个使用尾递归函数的“函数式”实现。 (在后者的情况下,如果运行时不提供尾调用优化,堆栈可能会爆炸,因此目前可以考虑研究这些概念并比较两种方法之间的差异)。 两者都有 node.js 导出对象 - 要在浏览器环境中使用它,只需注释掉导出对 立即下载

相关推荐

量化数据采集实战:从App接口逆向到Python爬虫系统构建

数据采集是量化分析和自动化策略的基石,其核心原理是通过程序模拟客户端行为,从目标服务器获取结构化数据。在金融科技领域,高效、稳定的数据采集能力直接决定了策略研究的深度和时效性。面对金融App常见的反爬机制,如请求签名和身份认证,工程师需要掌握网络协议分析、接口逆向与模拟请求等关键技术。这些技术不仅能用于获取市场情绪、资金流向等高频数据,更是构建个人量化研究基础设施、实现从主观看盘到客观数据分析转型的关键一步。本文以实战为例,深入剖析了如何系统性地逆向分析数据接口、破解签名算法,并最终构建一个包含代理IP池与

weixin_29032489的博客 1479

js操作range

<!DOCTYPE HTML><html><head><meta charset="utf-8"><title>404</title><style>*,body{margin:0;padding:0;font-family:Microsoft YaHei,Tahoma,Verdana;font-size:...

dasong1992的博客 400

GD32F303串口DMA发送数据避坑指南:为什么你的发送函数会卡住?

本文深入解析GD32F303单片机串口DMA发送数据时常见的卡死问题,提供详细的避坑指南。从DMA传输完成中断时序、发送状态管理到双通道DMA的特别注意事项,全面剖析问题根源并给出解决方案,帮助开发者构建健壮的DMA发送机制。

weixin_27038245的博客 295

JS Range 对象的使用

一:什么是Range对象 Range是指html文档中的区域,如用户用鼠标拖动选中的区域,如下图: 通过Range对象,可以获取用户选中的区域,或者指定选中区域,得到Range的起点和终点、修改或者复制里边的文本,甚至是html。在富文本编辑器开发中,经常会使用到这些功能。 二:获取当前的选区 由于兼容性的问题,需要区分ie浏览器,...

weixin_34007291的博客 842

告别Sourceforge安装器!手把手教你下载MinGW-w64离线包并配置环境变量(Windows 10/11)

本文详细介绍了如何在Windows 10/11系统上通过下载MinGW-w64离线包并配置环境变量,完全绕过Sourceforge安装器的问题。从选择正确的版本、解压到本地目录,到设置系统环境变量和验证编译环境,手把手指导开发者快速搭建稳定的GCC编译环境,解决常见的安装困扰。

weixin_30896825的博客 336

pikachu靶场: 暴力破解第四关(token防爆破)

Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个 Token 同时将此 Token 返回给客户端。此外,Token 是有时效的,一段时间之后或下一次请求时用户需要重新验证。

X_shiguang的博客 1720

Range对象

一、Range对象的概念Range对象代表页面上一段连续的区域,通过Range对象可以获取或者修改页面上任何区域的内容。也可以通过Range的方法进行复制和移动页面任何区域的元素。在Js的document文档中有一个方法用来创建一个Range对象,代码如下:var range = document.createRange();在html5中,每一个浏览器窗口都会有一个selection对象,代表用

China_chen_p_l的博客 1796

在 Ansys CFX Pre 中配置 RGP 表的分步指南

掌握在 Ansys CFX Pre 中设置 RGP 表的技巧,以优化仿真精度和效率。

jkh920184196的博客 1664

JavaScript 中的 Range 和 Selection 对象

最近在做鼠标框选的需求,鼠标框选就需要用到Range和Selection对象。Range表示选择的区间范围,Selection表示选择的文档内容。下面就详细说下这两个对象。

guoqkmiss的博客 2279

ABAQUS二次开发中创建SET

在ABAQUS中创建加载、边界条件时,需要使用set,创建set时需要使用对象集合对象中的Set函数,这个函数需要提供加入对象集合的列表,但这个对象列表好像并不能自行创建,只能通过ABAQUS各类对象集合中的findAt、getSequenceFromMask、getByBoundingSphere、getByBoundingCylinder或getByBoundingSphere函数得到,但这几个函数在直接使用PYTHON编程时都不太好用。这个函数返回一个字典,如下所示。

hohoyu的专栏 2482

[VCS]门级仿真及SDF反标

摘要:门级仿真在STA工具普及后仍是验证的重要环节,主要用于检查SDC完备性、异步电路时序、网表完整性及为功耗分析提供波形。门级仿真分为不带时序反标的前仿和带SDF反标的后仿,后仿需加载SDF文件提供精确延时信息。VCS提供多种仿真选项控制时序检查行为,SDF反标可通过命令或系统函数实现。后仿需特别注意关闭notimingcheck选项以确保时序检查有效性,并建议检查SDF反标报告和波形验证延时一致性。

元直的博客 9792

“选区”和“光标”

“选区”和“光标”

qq_44882018的博客 947

uniapp(全端兼容) - 最新详细实现预览pdf文件功能,uniapp安卓苹果app、H5网页、微信小程序、nvue等端打开本地或在线PDF文档进行预览,uniapp预览pdf教程(详细示例代码)

uni-app,pdf,打开预览PDF,安卓app,苹果app,微信小程序,移动端,H5网页,手机网站,微信小程序、支付宝小程序,手机app端,nvue,uniapp预览PDF,App端 实现pdf文件预览,在app端怎么预览pdf,网页h5怎么预览pdf,pdf下载、上传和预览,H5预览pdf文件,小程序预览pdf,nvue平台怎么打开预览pdf呢,除了uni.opendocument还有什么方法打开,预览pdf的插件,pdf预览组件,uni-app实现PDF预览功能,app查看下载pdf文件,如何做pd

✅ 精选推荐文章 1万+

转:javascript Range对象跨浏览器常用操作

第一次听到Range这个概念是在空间编辑器的技术交流会上,当时作者给我们提到编辑器中最重要的概念就是Range,通过操作range,就可以实现编辑器的所有操作。到底具体什么是range呢,其实简单点就是选区,大家对矩形可能有概念,其实range可以理解为矩形,只要我们选定了一个文本,那么这个文本就占有空间了,所以range是有起始和结束位置的。 一、关于浏览器的兼容性    目前主要有3种关于

影子的影子在这里看你 2007

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

javascript range 转为 html,javascript Range对象跨浏览器常用操作

开发的功能主要涉及即时代码着色(CodeColoring)和语法提示(CodeHints)功能,稍后会总结功能开发中问题或提供源码。以下是个人对Range对象的了解和常用操作的实例和总结:Range对象Range对象表示文档的连续范围区域,如用户在浏览器窗口中用鼠标拖动选中的区域。dom标准Range对象http://www.w3school.com.cn/xmldom/dom_range.asp...

weixin_35315019的博客 273

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

javascript Range对象跨浏览器常用操作(上)

最近在开发在线代码编辑器的过程中频繁接触Range对象,由于跨浏览器的需求,使用到ie下TextRange对象和标准Dom Range对象。开发的功能主要涉及即时代码着色(CodeColoring)和语法提示(CodeHints)功能,稍后会总结功能开发中问题或提供源码。 以下是个人对Range对象的了解和常用操作的实例和总结:   Range对象 Range对象表示文档的连续范围区域,如...

kjah 430

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

javascript Range对象跨浏览器常用操作(下)

上一篇(http://kjah.iteye.com/blog/420624)介绍了Range对象:ie用的TextRange对象和标准Dom Range对象,并分别介绍使用这两个对象如何进行区域选择,这篇将介绍使用Range对象进行常用的插入文本和替换操作。    2.插入文本    TextRange插入文本       使用TextRang插入文本比较简单,直接调用pasteHTML(...

kjah 189

【JavaScript编程】Selection对象和Range对象

说明:用户可以通过在页面上选择一段文字来创建选中区(即Selection对象),如果需要对选中区进行修改,比如:增加一个节点或是添加一段文字,这个时候就需要使用脚本操作Selection对象和Range对象来实现。 一、什么是 1、什么是Selection对象? 每一个浏览器窗口都有一个Selection对象,代表用户鼠标在页面中所选取的区域。可以通过如下代码得到一个Selection对象: var selection = window.getSelection(); // IE浏览器 var s.

猿始森林 2959

antd Anchor 的 targetOffset:精确控制滚动偏移与高亮定位的完整实践

在单页应用(SPA)中,当页面顶部存在固定导航栏、标题块时,`<Anchor>` 点击锚点后目标元素常被遮挡,滚动监听的高亮判断也会随之错位。本文围绕 antd 锚点组件的 `targetOffset` 演示场景(锚点目标滚动到屏幕正中间)展开,完整还原该示例的实现思路,并结合 [Anchor 源码](https://link.gitcode.com/i/848aa12addd42681fd9ed

gitblog_00566的博客 452

Range对象详解

http://hi.baidu.com/hmhaoao/item/afb92c168caf71088fbde43d Range对象详解 需求:很多时候,我们要通过js向文本输入框(textarea)里添加内容,这些内容有部分文字需要直接选择,然后方便用户修改。这时候就需要用到对象Range。 这里,我们就详细介绍Range对象。 通常,Range代表用户的一个选择区域。本文集中于获

梦想狂奔的专栏 2274

JavaScript 的 Range 和 DocumentFragment

Range对象表示文档中节点和文本节点的一部分。它允许你创建、操作和检测文档中的任意部分。文档:https://developer.mozilla.org/en-US/docs/Web/API/Range。

Korbin的博客 2035

Electron powerMonitor 深度解析:在桌面应用中监听系统电源、休眠与热状态

Electron 的 `powerMonitor` 模块让主进程能够感知操作系统级的电源事件——休眠/恢复、电池/交流电切换、热状态变化、屏幕锁屏乃至系统关机。本文基于 Electron 仓库的 API 文档 [docs/api/power-monitor.md](https://link.gitcode.com/i/60e5590073b765872f3313e1cc7727d7),结合 [li

gitblog_00303的博客 752

JS 之DOM range对象

DOM范围 DOM中的range对象是DOM2中新定义的接口。通过这个对象可以选择文档中的某个区域,而不必考虑节点的界限。 创建范围 document.createRange()创建一个范围,这个范围是range类型的实例。包含下面这些属性和方法。 startContainer:包含范围起点的节点(选区中第一个节点的父节点)。 startOffset:范围在startContain...

u014644574的博客 990

js中的Range

js中的Range js获取光标位置的坐标

u014644574的博客 5459
上一篇: Fiddler AutoResponse redir 高级使用
下一篇: 在mac上安装nginx
FuDesign2008
博客等级 码龄18年 44粉丝 119原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值