event/window.events 学习总结(javaScript)

本文详细介绍了浏览器事件处理中的关键属性和方法,包括type、srcElement/target、button等,并对比了IE与Firefox中的实现差异。

 Event属性和方法:

type:  事件的类型,如onlick中的click;
srcElement/target:    事件源,就是发生事件的元素;
button:   声明被按下的鼠标键,整型,1代表左键,2代表右键,4代表中键,如果按下多个键,就把这些值加起来,所以3就代表左右键同时按下;(firefox中 0代表左键,1代表中间键,2代表右键)
clientX/clientY:   事件发生的时候,鼠标相对于浏览器窗口可视文档区域的左上角的位置;(在DOM标准中,这两个属性值都不考虑文档的滚动情况,也就是说,无论文档滚动到哪里,只要事件发生在窗口左上角,clientX和clientY都是 0,所以在IE中,要想得到事件发生的坐标相对于文档开头的位置,要加上document.body.scrollLeft和 document.body.scrollTop)
offsetX,offsetY/layerX,layerY:  事件发生的时候,鼠标相对于源元素左上角的位置;
x,y/pageX,pageY:   检索相对于父要素鼠标水平坐标的整数;
altKey,ctrlKey,shiftKey等:   返回一个布尔值;
keyCode:  返回keydown(键盘按下)何keyup(键盘恢复)事件发生的时候按键的代码,以及keypress 事件的Unicode字符;(firefox2不支持 event.keycode,可以用 event.which替代 )
fromElement,toElement:     前者是指代mouseover事件中鼠标移动过的文档元素,后者指代mouseout事件中鼠标移动到的文档元素;
cancelBubble:一个布尔属性,把它设置为true的时候,将停止事件进一步起泡到包容层次的元素;(e.cancelBubble = true; 相当于 e.stopPropagation();)
returnValue:一个布尔属性,设置为false的时候可以组织浏览器执行默认的事件动作;(e.returnValue = false; 相当于 e.preventDefault();)
attachEvent(),detachEvent()/addEventListener(),removeEventListener:为制定DOM对象事件类型注册多个事件处理函数的方法,它们有两个参数,第一个是事件类型,第二个是事件处理函数。在attachEvent()事件执行的时候,this关键字指向的是window对象,而不是发生事件的那个元素;
screenX、screenY:鼠标指针相对于显示器左上角的位置,如果你想打开新的窗口,这两个属性很重要;
一些说明:

event代表事件的状态,例如触发event对象的元素、鼠标的位置及状态、按下的键等;
event对象只在事件发生的过程中才有效。
firefox里的event跟IE里的不同,IE里的是全局变量,随时可用;firefox里的要用参数引导才能用,是运行时的临时变量。
在IE/Opera中是window.event,在Firefox中是event;而事件的对象,在IE中是window.event.srcElement,在Firefox中是event.target,Opera中两者都可用。
下面两句效果相同
var evt = (evt) ? evt : ((window.event) ? window.event : null);
var evt = evt || window.event; // firefox下window.event为null, IE下event为null
IE中事件的起泡
IE中事件可以沿着包容层次一点点起泡到上层,也就是说,下层的DOM节点定义的事件处理函数,到了上层的节点如果还有和下层相同事件类型的事件处理函数,那么上层的事件处理函数也会执行。例如, div 标签包含了 a ,如果这两个标签都有onclick事件的处理函数,那么执行的情况就是先执行标签 a 的onclick事件处理函数,再执行 div 的事件处理函数。如果希望的事件处理函数执行完毕之后,不希望执行上层的 div 的onclick的事件处理函数了,那么就把cancelBubble设置为true即可。

该文章转载自德仔工作室:http://www.dezai.cn/article_show.asp?ArticleID=14638

那个左右滑动切换的问题,我正在排查,最终定位到是赛事赛题列表组件的问题(隐藏这个组件可以滑动),我怀疑是报错信息未解决导致划动不了,我查看浏览器报错:WebSocket connection to 'wss://localhost.chasiwu-sit.chaspark.cn:8087/?token=lBdndKpQW9Jz' failed: createConnection @ client:755 connect @ client:426 connect @ client:764 connect @ client:279 connect @ client:372 (anonymous) @ client:861Understand this errorAI client:768 WebSocket connection to 'wss://localhost:8087/?token=lBdndKpQW9Jz' failed: createConnection @ client:768 connect @ client:426 connect @ client:775Understand this errorAI client:783 [vite] failed to connect to websocket. your current setup: (browser) localhost.chasiwu-sit.chaspark.cn:8087/ <--[HTTP]--> localhost:8087/ (server) (browser) localhost.chasiwu-sit.chaspark.cn:8087/ <--[WebSocket (failing)]--> localhost:8087/ (server) Check out your Vite / network configuration and https://vite.dev/config/server-options.html#server-hmr . connect @ client:783 await in connect connect @ client:279 connect @ client:372 (anonymous) @ client:861Understand this errorAI chunk-FPEHBWIL.js?v=a329eec5:521 Warning: withRouter(CacheSwitch2): Support for defaultProps will be removed from function components in a future major release. Use JavaScript default parameters instead. at C2 (https://localhost.chasiwu-sit.chaspark.cn:8087/node_modules/.vite/deps/chunk-R4H6Z5XC.js?v=a329eec5:792:37) at DataProvider (https://localhost.chasiwu-sit.chaspark.cn:8087/src/h5/Contexts/DataContext.js:7:3) at default (https://localhost.chasiwu-sit.chaspark.cn:8087/src/h5/routes/index.js?t=1764215092864:14:16) at Suspense at Switch2 (https://localhost.chasiwu-sit.chaspark.cn:8087/node_modules/.vite/deps/chunk-R4H6Z5XC.js?v=a329eec5:1131:33) at Router2 (https://localhost.chasiwu-sit.chaspark.cn:8087/node_modules/.vite/deps/chunk-R4H6Z5XC.js?v=a329eec5:875:34) at Provider (https://localhost.chasiwu-sit.chaspark.cn:8087/node_modules/.vite/deps/react-redux.js?v=a329eec5:918:3) at ConfigProvider (https://localhost.chasiwu-sit.chaspark.cn:8087/node_modules/.vite/deps/antd-mobile.js?v=a329eec5:489:5) at IntlProvider3 (https://localhost.chasiwu-sit.chaspark.cn:8087/node_modules/.vite/deps/react-intl.js?v=a329eec5:4204:45) at AppH5 at Suspense printWarning @ chunk-FPEHBWIL.js?v=a329eec5:521 error @ chunk-FPEHBWIL.js?v=a329eec5:505 validateFunctionComponentInDev @ chunk-FPEHBWIL.js?v=a329eec5:15067 mountIndeterminateComponent @ chunk-FPEHBWIL.js?v=a329eec5:15036 beginWork @ chunk-FPEHBWIL.js?v=a329eec5:15962 beginWork$1 @ chunk-FPEHBWIL.js?v=a329eec5:19806 performUnitOfWork @ chunk-FPEHBWIL.js?v=a329eec5:19251 workLoopConcurrent @ chunk-FPEHBWIL.js?v=a329eec5:19242 renderRootConcurrent @ chunk-FPEHBWIL.js?v=a329eec5:19217 performConcurrentWorkOnRoot @ chunk-FPEHBWIL.js?v=a329eec5:18728 workLoop @ chunk-FPEHBWIL.js?v=a329eec5:197 flushWork @ chunk-FPEHBWIL.js?v=a329eec5:176 performWorkUntilDeadline @ chunk-FPEHBWIL.js?v=a329eec5:384Understand this errorAI chunk-CZS4DZFE.js?v=a329eec5:183 Warning: [antd: Dropdown] `onVisibleChange` is deprecated which will be removed in next major version, please use `onOpenChange` instead. warning @ chunk-CZS4DZFE.js?v=a329eec5:183 call @ chunk-CZS4DZFE.js?v=a329eec5:202 warningOnce @ chunk-CZS4DZFE.js?v=a329eec5:207 warning4 @ antd.js?v=a329eec5:1070 (anonymous) @ antd.js?v=a329eec5:16296 Dropdown3 @ antd.js?v=a329eec5:16294 renderWithHooks @ chunk-FPEHBWIL.js?v=a329eec5:11596 mountIndeterminateComponent @ chunk-FPEHBWIL.js?v=a329eec5:14974 beginWork @ chunk-FPEHBWIL.js?v=a329eec5:15962 beginWork$1 @ chunk-FPEHBWIL.js?v=a329eec5:19806 performUnitOfWork @ chunk-FPEHBWIL.js?v=a329eec5:19251 workLoopSync @ chunk-FPEHBWIL.js?v=a329eec5:19190 renderRootSync @ chunk-FPEHBWIL.js?v=a329eec5:19169 performConcurrentWorkOnRoot @ chunk-FPEHBWIL.js?v=a329eec5:18728 workLoop @ chunk-FPEHBWIL.js?v=a329eec5:197 flushWork @ chunk-FPEHBWIL.js?v=a329eec5:176 performWorkUntilDeadline @ chunk-FPEHBWIL.js?v=a329eec5:384Understand this errorAI chunk-CZS4DZFE.js?v=a329eec5:183 Warning: [antd: Dropdown] `overlay` is deprecated. Please use `menu` instead. warning @ chunk-CZS4DZFE.js?v=a329eec5:183 call @ chunk-CZS4DZFE.js?v=a329eec5:202 warningOnce @ chunk-CZS4DZFE.js?v=a329eec5:207 warning4 @ antd.js?v=a329eec5:1070 Dropdown3 @ antd.js?v=a329eec5:16298 renderWithHooks @ chunk-FPEHBWIL.js?v=a329eec5:11596 mountIndeterminateComponent @ chunk-FPEHBWIL.js?v=a329eec5:14974 beginWork @ chunk-FPEHBWIL.js?v=a329eec5:15962 beginWork$1 @ chunk-FPEHBWIL.js?v=a329eec5:19806 performUnitOfWork @ chunk-FPEHBWIL.js?v=a329eec5:19251 workLoopSync @ chunk-FPEHBWIL.js?v=a329eec5:19190 renderRootSync @ chunk-FPEHBWIL.js?v=a329eec5:19169 performConcurrentWorkOnRoot @ chunk-FPEHBWIL.js?v=a329eec5:18728 workLoop @ chunk-FPEHBWIL.js?v=a329eec5:197 flushWork @ chunk-FPEHBWIL.js?v=a329eec5:176 performWorkUntilDeadline @ chunk-FPEHBWIL.js?v=a329eec5:384Understand this errorAI index.js:213 Warning: Each child in a list should have a unique "key" prop. Check the render method of `BetaSlots`. See https://reactjs.org/link/warning-keys for more information. at SpotItem (https://localhost.chasiwu-sit.chaspark.cn:8087/src/h5/components/FilterList/modules/SportingEventItem/index.js?t=1764145480809:13:5) at BetaSlots (https://localhost.chasiwu-sit.chaspark.cn:8087/src/h5/routes/contest/home/modules/BetaSlots/index.js?t=1764148443052:47:5) at div at div at div at https://localhost.chasiwu-sit.chaspark.cn:8087/node_modules/.vite/deps/antd-mobile.js?v=a329eec5:1859:50 at PullToRefresh (https://localhost.chasiwu-sit.chaspark.cn:8087/node_modules/.vite/deps/antd-mobile.js?v=a329eec5:16309:7) at div at Content (https://localhost.chasiwu-sit.chaspark.cn:8087/src/h5/routes/home/modules/Content/index.js?t=1764145480809:14:5) at div at window.$RefreshReg$ (https://localhost.chasiwu-sit.chaspark.cn:8087/src/h5/routes/home/modules/Layouts/index.js?t=1764214325461:19:20) at default (https://localhost.chasiwu-sit.chaspark.cn:8087/src/h5/routes/contest/home/index.js?t=1764214325461:17:41) at div at Suspense at Layouts (https://localhost.chasiwu-sit.chaspark.cn:8087/src/h5/components/Layouts/index.js?t=1764215092864:71:5) at https://localhost.chasiwu-sit.chaspark.cn:8087/src/h5/routes/loader.js?t=1764215092864:15:22 at Updatable2 (https://localhost.chasiwu-sit.chaspark.cn:8087/node_modules/.vite/deps/react-router-cache-route.js?v=a329eec5:885:9) at Suspender2 (https://localhost.chasiwu-sit.chaspark.cn:8087/node_modules/.vite/deps/react-router-cache-route.js?v=a329eec5:792:9) at Suspense at Freeze (https://localhost.chasiwu-sit.chaspark.cn:8087/node_modules/.vite/deps/react-router-cache-route.js?v=a329eec5:824:26) at DelayFreeze2 (https://localhost.chasiwu-sit.chaspark.cn:8087/node_modules/.vite/deps/react-router-cache-route.js?v=a329eec5:844:9) at Updatable$1 (https://localhost.chasiwu-sit.chaspark.cn:8087/node_modules/.vite/deps/react-router-cache-route.js?v=a329eec5:904:26) at div at CacheComponent2 (https://localhost.chasiwu-sit.chaspark.cn:8087/node_modules/.vite/deps/react-router-cache-route.js?v=a329eec5:587:9) at Route2 (https://localhost.chasiwu-sit.chaspark.cn:8087/node_modules/.vite/deps/chunk-R4H6Z5XC.js?v=a329eec5:1017:33) at CacheRoute2 (https://localhost.chasiwu-sit.chaspark.cn:8087/node_modules/.vite/deps/react-router-cache-route.js?v=a329eec5:917:9) at https://localhost.chasiwu-sit.chaspark.cn:8087/node_modules/.vite/deps/react-router-cache-route.js?v=a329eec5:1046:31 at Updatable2 (https://localhost.chasiwu-sit.chaspark.cn:8087/node_modules/.vite/deps/react-router-cache-route.js?v=a329eec5:885:9) at Suspender2 (https://localhost.chasiwu-sit.chaspark.cn:8087/node_modules/.vite/deps/react-router-cache-route.js?v=a329eec5:792:9) at Suspense at Freeze (https://localhost.chasiwu-sit.chaspark.cn:8087/node_modules/.vite/deps/react-router-cache-route.js?v=a329eec5:824:26) at DelayFreeze2 (https://localhost.chasiwu-sit.chaspark.cn:8087/node_modules/.vite/deps/react-router-cache-route.js?v=a329eec5:844:9) at Updatable$1 (https://localhost.chasiwu-sit.chaspark.cn:8087/node_modules/.vite/deps/react-router-cache-route.js?v=a329eec5:904:26) at CacheSwitch2 (https://localhost.chasiwu-sit.chaspark.cn:8087/node_modules/.vite/deps/react-router-cache-route.js?v=a329eec5:1077:9) at C2 (https://localhost.chasiwu-sit.chaspark.cn:8087/node_modules/.vite/deps/chunk-R4H6Z5XC.js?v=a329eec5:792:37) at DataProvider (https://localhost.chasiwu-sit.chaspark.cn:8087/src/h5/Contexts/DataContext.js:7:3) at default (https://localhost.chasiwu-sit.chaspark.cn:8087/src/h5/routes/index.js?t=1764215092864:14:16) at Suspense at Switch2 (https://localhost.chasiwu-sit.chaspark.cn:8087/node_modules/.vite/deps/chunk-R4H6Z5XC.js?v=a329eec5:1131:33) at Router2 (https://localhost.chasiwu-sit.chaspark.cn:8087/node_modules/.vite/deps/chunk-R4H6Z5XC.js?v=a329eec5:875:34) at Provider (https://localhost.chasiwu-sit.chaspark.cn:8087/node_modules/.vite/deps/react-redux.js?v=a329eec5:918:3) at ConfigProvider (https://localhost.chasiwu-sit.chaspark.cn:8087/node_modules/.vite/deps/antd-mobile.js?v=a329eec5:489:5) at IntlProvider3 (https://localhost.chasiwu-sit.chaspark.cn:8087/node_modules/.vite/deps/react-intl.js?v=a329eec5:4204:45) at AppH5 at Suspense printWarning @ react_jsx-dev-runtime.js?v=a329eec5:64 error @ react_jsx-dev-runtime.js?v=a329eec5:48 validateExplicitKey @ react_jsx-dev-runtime.js?v=a329eec5:724 validateChildKeys @ react_jsx-dev-runtime.js?v=a329eec5:737 jsxWithValidation @ react_jsx-dev-runtime.js?v=a329eec5:855 BetaSlots @ index.js:213 renderWithHooks @ chunk-FPEHBWIL.js?v=a329eec5:11596 updateFunctionComponent @ chunk-FPEHBWIL.js?v=a329eec5:14630 beginWork @ chunk-FPEHBWIL.js?v=a329eec5:15972 beginWork$1 @ chunk-FPEHBWIL.js?v=a329eec5:19806 performUnitOfWork @ chunk-FPEHBWIL.js?v=a329eec5:19251 workLoopSync @ chunk-FPEHBWIL.js?v=a329eec5:19190 renderRootSync @ chunk-FPEHBWIL.js?v=a329eec5:19169 performConcurrentWorkOnRoot @ chunk-FPEHBWIL.js?v=a329eec5:18728 workLoop @ chunk-FPEHBWIL.js?v=a329eec5:197 flushWork @ chunk-FPEHBWIL.js?v=a329eec5:176 performWorkUntilDeadline @ chunk-FPEHBWIL.js?v=a329eec5:384Understand this errorAI :8087/#/races:1 Access to fetch at 'https://gray.chaspark.net/chasiwu/media/v1/tinyimage/1140494973038608384.jpg?_t=1764224204789&lang=zh' from origin 'https://localhost.chasiwu-sit.chaspark.cn:8087' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.Understand this errorAI gray.chaspark.net/chasiwu/media/v1/tinyimage/1140494973038608384.jpg?_t=1764224204789&lang=zh:1 GET https://gray.chaspark.net/chasiwu/media/v1/tinyimage/1140494973038608384.jpg?_t=1764224204789&lang=zh net::ERR_FAILED Promise.then (anonymous) @ chunk-VSIV6B2H.js?v=a329eec5:89 execute @ chunk-VSIV6B2H.js?v=a329eec5:87 send @ fetch.js:178 (anonymous) @ fetch.js:204 img.onload @ utils.js:137Understand this errorAI utils.js:123 Uncaught (in promise) TypeError: Failed to fetch Promise.then (anonymous) @ chunk-VSIV6B2H.js?v=a329eec5:89 execute @ chunk-VSIV6B2H.js?v=a329eec5:87 send @ fetch.js:178 (anonymous) @ fetch.js:204 img.onload @ utils.js:137Understand this errorAI 你看看是否有
最新发布
11-28
<!DOCTYPE html> <html> <head> <title>HLS.js 播放 M3U8</title> <!-- 引入 HLS.js 库 --> <!-- <script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script> --> <script src="~/content/videoplayer/m3u8/hls.js"></script> </head> <body> <div>使用 HLS.js 原生实现(推荐)</div> <video id="hlsVideo" controls width="800" height="450" muted autoplay></video> <script> const video = document.getElementById('hlsVideo'); const m3u8Url = '/content/videoplayer/m3u8/demovideo/logo3/logo3.m3u8'; if (Hls.isSupported()) { // 检测浏览器支持性 const hls = new Hls(); hls.config.debug = true; //启用调试日志 // 配置请求拦截器 // hls.config.pLoader = (context) => { // // 修改TS文件的URL,可以添加token、时间戳等参数 // if (context.url.endsWith('.ts')) { // const url = new URL(context.url); // url.searchParams.append('token', 'your-dynamic-token'); // url.searchParams.append('timestamp', Date.now().toString()); // context.url = url.toString(); // } // return new Hls.DefaultConfig.loader(context); // }; hls.config.pLoader = (context) => { if (context.url.endsWith('.ts')) { // 使用URL重写而非添加参数 const originalUrl = context.url; const baseUrl = originalUrl.substring(0, originalUrl.lastIndexOf('/')); const segmentName = originalUrl.substring(originalUrl.lastIndexOf('/') + 1); // 重写为无扩展名路径 context.url = `${baseUrl}/segment-${segmentName.replace('.ts', '')}`; } return hls.createLoader(context); }; hls.loadSource(m3u8Url); hls.attachMedia(video); hls.on(Hls.Events.MANIFEST_PARSED, () => { video.play(); }); // 错误处理 hls.on(Hls.Events.ERROR, (event, data) => { console.error('HLS 错误:', data); }); } else if (video.canPlayType('application/vnd.apple.mpegurl')) { // Safari 原生支持 HLS video.src = m3u8Url; video.addEventListener('loadedmetadata', () => { video.play(); }); } else { alert('当前浏览器不支持 HLS 播放'); } </script> </body> </html> 请检查哪里出问题了,请修复并给出完整代码
10-22
<!DOCTYPE html> <html> <head> <title>HLS.js 播放 M3U8</title> <!-- 引入 HLS.js 库 --> <!-- <script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script> --> <script src="~/content/videoplayer/m3u8/hls.js"></script> </head> <body> <div>使用 HLS.js 原生实现(推荐)</div> <video id="hlsVideo" controls width="800" height="450" muted autoplay></video> <script> const video = document.getElementById('hlsVideo'); const m3u8Url = '/content/videoplayer/m3u8/demovideo/logo3/logo3.m3u8'; if (Hls.isSupported()) { // 检测浏览器支持性 const hls = new Hls({ maxBufferLength: 30, // 最大缓冲长度() maxMaxBufferLength: 60, // 绝对最大缓冲 enableWorker: true, // 启用WebWorker pLoader: (context) => { if (context.url.includes('.ts')) { const baseUrl = context.url.split('?')[0]; const newUrl = baseUrl.replace('.ts', ''); context.url = newUrl; } return Hls.DefaultConfig.loader(context); } }); // if (hls) { // hls.destroy(); // hls = null; // } hls.config.debug = true; //启用调试日志 // 配置请求拦截器 // hls.config.pLoader = (context) => { // // 修改TS文件的URL,可以添加token、时间戳等参数 // if (context.url.endsWith('.ts')) { // const url = new URL(context.url); // url.searchParams.append('token', 'your-dynamic-token'); // url.searchParams.append('timestamp', Date.now().toString()); // context.url = url.toString(); // } // return new Hls.DefaultConfig.loader(context); // }; // hls.config.pLoader = (context) => { // if (context.url.endsWith('.ts')) { // // 使用URL重写而非添加参数 // const originalUrl = context.url; // const baseUrl = originalUrl.substring(0, originalUrl.lastIndexOf('/')); // const segmentName = originalUrl.substring(originalUrl.lastIndexOf('/') + 1); // // 重写为无扩展名路径 // context.url = `${baseUrl}/segment-${segmentName.replace('.ts', '')}`; // } // return hls.createLoader(context); // }; hls.attachMedia(video); hls.on(Hls.Events.MANIFEST_PARSED, () => { video.play().catch(e => { console.log(`播放失败: ${e.message}`); }); console.log('媒体解析完成,开始播放'); }); hls.on(Hls.Events.ERROR, (event, data) => { handleHlsError(data); }); hls.loadSource(m3u8Url); //加载视频源 video.controls = true; // 错误处理 hls.on(Hls.Events.ERROR, (event, data) => { console.error('HLS 错误:', data); }); } else if (video.canPlayType('application/vnd.apple.mpegurl')) { // Safari 原生支持 HLS video.src = m3u8Url; video.addEventListener('loadedmetadata', () => { video.play(); }); } else { alert('当前浏览器不支持 HLS 播放'); } // 错误处理函数 function handleHlsError(data) { let errorMsg = '播放错误: '; if (data.fatal) { switch (data.type) { case Hls.ErrorTypes.NETWORK_ERROR: errorMsg += `网络错误(${data.details})`; hls.startLoad(); // 网络中断后重连 break; case Hls.ErrorTypes.MEDIA_ERROR: errorMsg += `媒体错误(${data.details})`; hls.recoverMediaError(); // 媒体错误恢复 break; default: errorMsg += `致命错误(${data.details})`; loadVideo(hls.url); // 重新加载 break; } } else { errorMsg += `非致命错误(${data.details})`; } console.log(errorMsg); } </script> </body> </html> 请修复这里无法打开video的BUG,并给出完整的代码
10-22
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值