document.documentElement & e.srcElement &e.target

点击事件与jQuery的结合应用
本文通过一个实例展示了如何使用jQuery实现元素点击事件的基本功能,包括事件绑定、事件触发条件判断以及事件处理逻辑。


$(document.documentElement).bind("click",function(e){
var e = e||window.event;
var o = e.srcElement?e.srcElement:e.target
if(o){
alert(o.tagName);
}
});




一个小例子

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<script type="text/javascript" src="jquery-1.7.2.min.js"></script>
<style type="text/css">
#mesg{
width:152px;
height:120px;
background:#ECEEFE;
border:1px solid #CED3FC;
display:none;
position:absolute;
}
.btn{
cursor:pointer;
}
</style>
<script type="text/javascript">
<!--

var m = {};
$(function(){
m={c:1,show:false,to:null,mesg:$("#mesg")[0]};
$(document.documentElement).bind("click",function(e){
if(m.show && m.c >=2){
var e = e||window.event;
var o = e.srcElement?e.srcElement:e.target;
if(o != m.to[0] && o !=m.mesg){
m.show=false;
$(m.mesg).hide();
}
}
m.c++;
});

$(".btn").bind("click",function(){
if(m.show){
m.show=false;
$(m.mesg).hide();
}else{
var mg = $("#mesg");
var to = $(this).prev();
var of = to.offset();
mg.css({"left":of.left,"top":of.top+20}).show();
m.show=true;
m.to=to;
m.c=1;
}
});
});
//-->
</script>
</head>
<body>
<input id="t1"/><image src="qq.jpg" class="btn" >
<input /><image src="qq.jpg" class="btn" >
<br/>
<br/>
<br/>
<br/>
<input /><image src="qq.jpg" class="btn">
<div id="mesg"></div>
</body>
</html>

/* 框架页面js文件 */ // 渲染头像和昵称 document.querySelector(&#39;.avatar&#39;).innerHTML = ` &lt;img src=&quot;./img/10043.png&quot; alt=&quot;用户头像&quot; onclick=&quot;preview(&#39;./img/10043.png&#39;)&quot; onerror=&quot;this.src=&#39;./img/10043.png&#39;&quot; /&gt; &lt;div class=&quot;nickname&quot;&gt;${proof?.userinfo?.nickname || proof?.nickname || &#39;用户&#39;}&lt;/div&gt; `; // 映射菜单图表 const firstLevelIconMap = { 1: &#39;./img/IconBarChart.png&#39;, 2: &#39;./img/IconUserGroup.png&#39;, 3: &#39;./img/IconIdcard.png&#39;, 4: &#39;./img/IconCalendarClock.png&#39;, 5: &#39;./img/IconUser.png&#39;, 6: &#39;./img/IconApps.png&#39;, 7: &#39;./img/IconArchive.png&#39;, 10: &#39;./img/IconFile.png&#39;, 11: &#39;./img/IconImage.png&#39;, default: &#39;./img/default-icon.png&#39; //默认 }; let tree = []; //用于存储构建好的树形结构 let data; //用于存储经过处理后的树形结构数据,后续用于渲染页面 // 获取菜单数据 let menuData = proof.menu; // 构建树形结构 let menuTree = buildTree(menuData); data = menuTree; /** * 构建树形结构 * @param {Array} menu - 传参菜单数据数组 * @returns {Array} - 构建后的树形结构数组 */ function buildTree(menu) { tree = []; let mapped = {}; // 第一遍循环,初始化mapped对象并且初始化children属性 menu.forEach(menu =&gt; { mapped[menu.id] = menu; menu.children = menu.children || []; // 确保children属性始终是数组 }); // 第二遍循环,根据pid构建树形结构 menu.forEach(menu =&gt; { if (menu.pid !== 0) { if (mapped[menu.pid]) { mapped[menu.pid].children.push(menu); } } else { tree.push(menu); } }); return tree; } // 检查数据是否有效 if (data &amp;&amp; Array.isArray(data)) { // 渲染树形菜单 render(data); } // 将数据中的菜单赋值给 `menu` 变量,方便后续使用 let menu = data; // 声明数组 `arr`,用于后续渲染面包屑导航 let arr; /** * 渲染树形菜单的递归函数 * @param {Array} menu - 菜单数据数组 * @param {boolean} isFirstLevel - 标记是否为一级菜单 * @returns {string} 拼接好的 HTML 字符串 */ function render(menu, isFirstLevel = true) { let str = &#39;&#39;; // 菜单数据验证(原有逻辑保留) if (!menu || !Array.isArray(menu)) { console.error(&#39;Invalid menu data:&#39;, menu); return str; } for (let i in menu) { const menuItem = menu[i]; if (!menuItem || typeof menuItem !== &#39;object&#39;) continue; // 基础数据获取 const locale = menuItem.meta &amp;&amp; menuItem.meta.locale ? menuItem.meta.locale : &#39;未命名菜单&#39;; const menuId = menuItem.id || &#39;&#39;; // 一级菜单ID(用于匹配图标) const path = menuItem.path || &#39;#&#39;; // 仅一级菜单:匹配图标(从firstLevelIconMap取,无匹配用默认) let iconHtml = &#39;&#39;; // 存储图标HTML(子菜单为空) if (isFirstLevel) { // 仅当&quot;是一级菜单&quot;时,拼接图标HTML const iconSrc = firstLevelIconMap[menuId] || firstLevelIconMap.default; iconHtml = `&lt;img src=&quot;${iconSrc}&quot; alt=&quot;${locale}&quot; class=&quot;menu-icon&quot; /&gt;`; } // 3. 有子菜单的菜单项 if (menuItem.children &amp;&amp; Array.isArray(menuItem.children) &amp;&amp; menuItem.children.length &gt; 0) { str += `&lt;p class=&quot;option_parent&quot; data-menu-id=&quot;${menuId}&quot;&gt;`; str += iconHtml; str += `&lt;span class=&quot;nickname-text&quot;&gt;${locale}&lt;/span&gt;`; str += `&lt;img src=&quot;./img/arrows.png&quot; alt=&quot;&quot; data-arrow=&quot;true&quot; class=&quot;arrow-icon&quot; /&gt;&lt;/p&gt;`; str += `&lt;div class=&quot;child&quot; style=&quot;display:none;&quot;&gt;`; // 递归渲染子菜单 str += render(menuItem.children, false); str += `&lt;/div&gt;`; } // 4. 无子菜单的菜单项 else { str += `&lt;p class=&quot;option&quot; data-id=&quot;${menuId}&quot; onclick=&quot;navigateToMenu(1,&#39;${path}&#39;,&#39;${locale}&#39;,&#39;${menuId}&#39;)&quot;&gt;`; str += iconHtml; // 仅一级菜单插入图标 str += `&lt;span class=&quot;nickname-text&quot;&gt;${locale}&lt;/span&gt;&lt;/p&gt;`; } } return str; } // 调用 `render` 函数,开始渲染树形菜单 let str = render(menu); // 将渲染好的菜单项插入到页面的 .option_box 元素中 document.querySelector(&quot;.option_box&quot;).innerHTML = str; // 获取所有树形菜单中的选项元素 let tree_option = document.querySelectorAll(&quot;.option&quot;); // 监听 class 为 &#39;option_box&#39; 的鼠标松开事件(mouseup) document.getElementsByClassName(&#39;option_box&#39;)[0].addEventListener(&#39;mouseup&#39;, function (e) { e = e || window.event; let target = e.target || e.srcElement; // 关键修复:如果点击的是父菜单文字,向上找到对应的父菜单容器 if (target.classList.contains(&#39;nickname-text&#39;)) { target = target.closest(&#39;.option_parent&#39;); } // 如果点击的是图标或箭头,向上查找父菜单元素(option_parent 或 option) else if (target.classList.contains(&#39;menu-icon&#39;) || target.classList.contains(&#39;arrow-icon&#39;)) { target = target.parentElement; } // 点击子菜单选项(option):高亮当前子菜单 if (target?.className === &#39;option&#39;) { highlightTargetOnly(target); // 仅子菜单保留高亮 } // 点击父菜单选项(option_parent):仅展开,不高亮 else if (target?.className === &#39;option_parent&#39;) { // 此处删除 highlightTargetOnly(target); } // 处理子菜单的显示/隐藏逻辑(仅针对有子菜单的父菜单) if (target &amp;&amp; target.nextElementSibling !== null &amp;&amp; target.nextElementSibling.className === &#39;child&#39;) { const childMenu = target.nextElementSibling; childMenu.style.display = childMenu.style.display === &#39;none&#39; ? &#39;block&#39; : &#39;none&#39;; } // 处理箭头图标旋转状态(仅针对有箭头的父菜单) if (target) { const arrowIcon = target.querySelector(&#39;.arrow-icon&#39;); if (arrowIcon) { const isExpanded = arrowIcon.getAttribute(&#39;data-arrow&#39;) === &#39;false&#39;; if (isExpanded) { arrowIcon.classList.remove(&#39;arrowhead&#39;); arrowIcon.setAttribute(&#39;data-arrow&#39;, &#39;true&#39;); } else { arrowIcon.classList.add(&#39;arrowhead&#39;); arrowIcon.setAttribute(&#39;data-arrow&#39;, &#39;false&#39;); } } } }); // 检查 sessionStorage 中是否存在 &#39;main&#39; 键值对 if (sessionStorage.getItem(&#39;main&#39;)) { // 获取到面包屑数据,使用 JSON.parse 解析字符串为数组,在为arr赋值 arr = JSON.parse(sessionStorage.getItem(&#39;main&#39;)); } else { // arr没有值就将&quot;数据统计&quot;的数据放入 arr = [{ status: 1, path: menu[0].path, locale: menu[0].meta.locale, // 从meta中获取locale id: menu[0].id }]; } // 页面加载完成后恢复高亮状态 document.addEventListener(&#39;DOMContentLoaded&#39;, function () { addCrumb(arr); // 调用面包屑的渲染函数 restoreMenuHighlight(); // 恢复菜单高亮状态 }); // 面包屑点击添加函数,通过传参将状态,路径,名称,id传过去 function navigateToMenu(status, path, locale, id) { let obj = { status: status, path: path, locale: locale, id: id }; let isExists = false; // 检查是否已存在该菜单项 for (let i = 0; i &lt; arr.length; i++) { if (arr[i].id === id) { isExists = true; // 重置所有状态为默认,再将匹配项设为高亮 for (let j = 0; j &lt; arr.length; j++) { arr[j].status = 2; } arr[i].status = 1; break; } } // 不存在则添加新项 if (!isExists) { for (let i = 0; i &lt; arr.length; i++) { arr[i].status = 2; } arr.push(obj); arr[arr.length - 1].status = 1; } sessionStorage.setItem(&#39;main&#39;, JSON.stringify(arr)); addCrumb(arr); } // 面包屑渲染函数 function addCrumb(arr) { // 用于存储除首页外的面包屑 HTML 代码 let bread = &#39;&#39;; // 用于存储首页的面包屑 HTML 代码 let breads = &#39;&#39;; // 存储当前激活的菜单ID(用于后续高亮) let activeId = null; // 遍历传入的数组,处理每个面包屑项 for (let i in arr) { // 记录当前激活的菜单ID if (arr[i].status === 1) { activeId = arr[i].id; } // 渲染首页面包屑 if (arr[i].locale === &#39;数据统计&#39;) { breads = ` &lt;div class=&quot;home_bread ${arr[i].status === 1 ? &#39;highlighted&#39; : &#39;&#39;}&quot;&gt; &lt;img src=&quot;${arr[i].status === 1 ? &#39;./img/lightHome.png&#39; : &#39;./img/home.png&#39;}&quot; alt=&quot;首页图标&quot; class=&quot;home_icon&quot; /&gt; &lt;div class=&quot;page&quot; onclick=&quot;target(1, &#39;${arr[i].path}&#39;, &#39;${arr[i].locale}&#39;,&#39;${arr[i].id}&#39;)&quot;&gt;${arr[i].locale}&lt;/div&gt; &lt;/div&gt; `; } else { // 渲染其他面包屑 bread += ` &lt;div class=&quot;crumb ${arr[i].status === 1 ? &#39;highlighted&#39; : &#39;&#39;}&quot;&gt; &lt;p class=&quot;crumbName&quot; onclick=&quot;target(${arr[i].status},&#39;${arr[i].path}&#39;,&#39;${arr[i].locale}&#39;,&#39;${arr[i].id}&#39;)&quot;&gt;${arr[i].locale}&lt;/p&gt; &lt;div class=&quot;omit&quot; onclick=&quot;delete_btn(&#39;${arr[i].locale}&#39;, ${i})&quot;&gt; &lt;img src=&quot;./img/delete.png&quot; alt=&quot;删除图标&quot; /&gt; &lt;/div&gt; &lt;/div&gt; `; } // 更新 iframe 内容 if (arr[i].status === 1) { // 修复路径处理逻辑 let pathUrl = arr[i].path.startsWith(&#39;./&#39;) ? arr[i].path : arr[i].path.startsWith(&#39;/&#39;) ? &#39;.&#39; + arr[i].path + &#39;.html&#39; : &#39;./&#39; + arr[i].path + &#39;.html&#39;; checkUrl(pathUrl, function (isValid) { if (isValid) { // 如果路径有效,加载 iframe document.getElementById(&quot;page&quot;).style.display = &quot;block&quot;; document.getElementById(&quot;page&quot;).setAttribute(&quot;src&quot;, pathUrl); document.getElementById(&quot;devAlert&quot;).style.display = &quot;none&quot;; } else { // 如果路径无效,隐藏 iframe 并显示提示 document.getElementById(&quot;page&quot;).style.display = &quot;none&quot;; document.getElementById(&quot;devAlert&quot;).style.display = &quot;flex&quot;; } }); } } // 将面包屑 HTML 插入到容器中 document.querySelector(&#39;.crumb_content&#39;).innerHTML = bread; document.querySelector(&#39;.home&#39;).innerHTML = breads; // 恢复菜单高亮状态 restoreMenuHighlight(); } // 恢复菜单高亮状态函数 function restoreMenuHighlight() { if (!arr || arr.length === 0) return; // 查找当前激活的菜单项 let activeItem = arr.find(item =&gt; item.status === 1); if (!activeItem) return; // 移除所有菜单的高亮 document.querySelectorAll(&quot;.option, .option_parent&quot;).forEach(el =&gt; { el.classList.remove(&quot;backColor&quot;); }); // 高亮匹配的子菜单 document.querySelectorAll(`.option[data-id=&quot;${activeItem.id}&quot;]`).forEach(el =&gt; { el.classList.add(&quot;backColor&quot;); }); // 高亮匹配的父菜单 document.querySelectorAll(`.option_parent[data-menu-id=&quot;${activeItem.id}&quot;]`).forEach(el =&gt; { el.classList.add(&quot;backColor&quot;); }); // 动态控制父菜单箭头旋转 let activeElement = document.querySelector(&quot;.backColor&quot;); if (activeElement) { // 查找最近的父菜单容器 let parentContainer = activeElement.closest(&#39;.child&#39;); if (parentContainer &amp;&amp; parentContainer.style.display === &quot;none&quot;) { // 展开隐藏的子菜单 parentContainer.style.display = &quot;block&quot;; // 切换箭头方向 let arrowIcon = parentContainer.previousElementSibling.querySelector(&#39;.arrow-icon&#39;); if (arrowIcon) { arrowIcon.classList.add(&quot;arrowhead&quot;); arrowIcon.setAttribute(&quot;data-arrow&quot;, &quot;false&quot;); } } } } function highlightTargetOnly(target) { // 移除所有菜单(父 + 子)的高亮 document.querySelectorAll(&quot;.option, .option_parent&quot;).forEach(el =&gt; { el.classList.remove(&quot;backColor&quot;); }); // 为当前点击的菜单添加高亮 target.classList.add(&quot;backColor&quot;); } // 检查 URL 是否有效的函数 function checkUrl(url, callback) { const xhr = new XMLHttpRequest(); xhr.open(&quot;HEAD&quot;, url, true); xhr.onload = function () { // 如果状态码为 404,则说明路径不存在 if (xhr.status === 404) { callback(false); } else { callback(true); } }; xhr.onerror = function () { callback(false); // 如果请求发生错误,也视为路径不存在 }; xhr.send(); } // 面包屑的删除函数 function delete_btn(locale, index) { // 判断当前删除的如果是最后一个,并且最后一个时是当前高亮状态 if (index == arr.length - 1 &amp;&amp; arr[arr.length - 1].status == 1) { // 将当前删除后的最后一个设置为高亮 arr[arr.length - 2].status = 1; sessionStorage.setItem(&#39;main&#39;, JSON.stringify(arr)); } // 再判断当前删除的如果是高亮状态的,并且不是面包屑最后一个 if (arr[index].status == 1 &amp;&amp; arr[arr.length - 1].status != 1) { // 将当前删除面包屑后面的一个 arr[index + 1].status = 1; sessionStorage.setItem(&#39;main&#39;, JSON.stringify(arr)); } // 删除当前面包屑 arr.splice(index, 1); sessionStorage.setItem(&#39;main&#39;, JSON.stringify(arr)); // 重新调用一下渲染函数 addCrumb(arr); } // 面包屑的点击函数 function target(status, path, title, id) { // 将当前的面包屑循环一遍 for (let i in arr) { // 将全部的状态改为默认状态 arr[i].status = 2; // 再将当前的数据重新存储一下 sessionStorage.setItem(&#39;main&#39;, JSON.stringify(arr)); // 利用判断得到当前的面包屑 if (arr[i].id == id) { // 将当前面包屑的状态改为高亮状态 arr[i].status = 1; // 重新存储一下数据 sessionStorage.setItem(&#39;main&#39;, JSON.stringify(arr)); } } // 调用渲染函数,刷新页面状态 addCrumb(arr); } // 点击全屏开关函数 function full() { // 判断当前页面是否处于全屏状态 if (!document.fullscreenElement) { // 如果不是全屏状态,则请求将整个文档元素设置为全屏显示 document.documentElement.requestFullscreen(); // 切换全屏按钮的图标为退出全屏图标 document.querySelector(&quot;#screen img&quot;).setAttribute(&quot;src&quot;, `./img/screen.png`); } else { // 如果已经是全屏状态,则尝试退出全屏 if (document.exitFullscreen) { // 调用退出全屏的方法 document.exitFullscreen(); // 切换全屏按钮的图标为进入全屏图标 document.querySelector(&quot;#screen img&quot;).setAttribute(&quot;src&quot;, `./img/allScreen.png`); } } } document.addEventListener(&quot;fullscreenchange&quot;, updateIcon); // 该函数用于根据当前的全屏状态更新全屏按钮的图标 function updateIcon() { // 判断当前是否处于全屏状态,考虑了不同浏览器的兼容性 if ( document.fullscreenElement || // 标准的全屏元素属性 document.webkitFullscreenElement || // WebKit 浏览器(如 Safari)的全屏元素属性 document.mozFullScreenElement || // Firefox 浏览器的全屏元素属性 document.msFullscreenElement // IE 浏览器的全屏元素属性 ) { // 如果处于全屏状态,将全屏按钮的图标设置为退出全屏图标 document.querySelector(&quot;#screen img&quot;).setAttribute(&quot;src&quot;, `./img/screen.png`); } else { // 如果不是全屏状态,将全屏按钮的图标设置为进入全屏图标 document.querySelector(&quot;#screen img&quot;).setAttribute(&quot;src&quot;, `./img/allScreen.png`); } } // 刷新 function refresh() { document.querySelector(&quot;#refresh img&quot;).style.transform = &#39;rotate(360deg)&#39;; document.querySelector(&quot;#refresh img&quot;).style.transition = &#39;all 0.5s&#39;; // 延时500毫秒后刷新页面 setTimeout(function () { window.location.reload(); }, 500); } //点击跳转到锁屏页面 function lock() { window.location.replace(&#39;./lock.html&#39;); sessionStorage.setItem(&#39;lock&#39;, 1); } // 头像点击退出登录 function exit() { document.querySelector(&#39;.over&#39;).style.display = &#39;block&#39;; } function cancel() { document.querySelector(&#39;.over&#39;).style.display = &#39;none&#39;; } // 点击确定清空数据,并跳转到登录页 function sure() { sessionStorage.clear(); window.location.replace(&quot;./login.html&quot;); } // 全局变量,用于跟踪菜单折叠状态 let isMenuCollapsed = false; let deg = true; // 声明状态用于判断菜单是否展开 // 折叠 function toggle() { const treeBar = document.querySelector(&#39;.tree_bar&#39;); const content = document.querySelector(&#39;.content&#39;); const toolImg = document.querySelector(&#39;.tool_img img&#39;); if (deg) { // 折叠菜单 treeBar.classList.add(&#39;collapsed&#39;); content.classList.add(&#39;expanded&#39;); toolImg.style.transform = &#39;rotate(180deg)&#39;; isMenuCollapsed = true; // 折叠时强制收起所有子菜单 document.querySelectorAll(&#39;.child&#39;).forEach(child =&gt; { child.style.display = &#39;none&#39;; }); // 折叠时恢复所有箭头方向 document.querySelectorAll(&#39;.arrow-icon&#39;).forEach(icon =&gt; { icon.classList.remove(&#39;arrowhead&#39;); icon.setAttribute(&#39;data-arrow&#39;, &#39;true&#39;); }); } else { // 展开菜单 treeBar.classList.remove(&#39;collapsed&#39;); content.classList.remove(&#39;expanded&#39;); toolImg.style.transform = &#39;rotate(0deg)&#39;; isMenuCollapsed = false; // 展开时恢复菜单高亮状态 restoreMenuHighlight(); } deg = !deg; } // 将渲染好的菜单项插入到页面的 .option_box 元素中 document.querySelector(&quot;.option_box&quot;).innerHTML = str; // 获取所有一级父菜单 const parentMenus = document.querySelectorAll(&quot;.option_parent&quot;); let hoverTimer; // 用于延迟收起子菜单的计时器 parentMenus.forEach(parent =&gt; { // 悬浮进入:展开子菜单 parent.addEventListener(&quot;mouseenter&quot;, function () { // 仅当菜单处于折叠状态,且存在子菜单时,才展开 if (isMenuCollapsed) { const childMenu = this.nextElementSibling; // 子菜单容器 const arrowIcon = this.querySelector(&quot;.arrow-icon&quot;); if (childMenu &amp;&amp; childMenu.className === &quot;child&quot;) { childMenu.style.display = &quot;block&quot;; } if (arrowIcon) { arrowIcon.classList.add(&quot;arrowhead&quot;); arrowIcon.setAttribute(&quot;data-arrow&quot;, &quot;false&quot;); } } }); // 悬浮离开:延迟收起子菜单 parent.addEventListener(&quot;mouseleave&quot;, function () { // 仅当菜单处于折叠状态,且存在子菜单时,才延迟收起 if (isMenuCollapsed) { const childMenu = this.nextElementSibling; const arrowIcon = this.querySelector(&quot;.arrow-icon&quot;); // 延迟300ms收起(避免鼠标快速划过误触发) hoverTimer = setTimeout(() =&gt; { if (childMenu &amp;&amp; childMenu.className === &quot;child&quot;) { childMenu.style.display = &quot;none&quot;; // 收起子菜单 } if (arrowIcon) { arrowIcon.classList.remove(&quot;arrowhead&quot;); // 恢复箭头方向 arrowIcon.setAttribute(&quot;data-arrow&quot;, &quot;true&quot;); } }, 100); } }); // 子菜单区域悬浮:延续父菜单悬浮状态 const childMenu = parent.nextElementSibling; if (childMenu &amp;&amp; childMenu.className === &quot;child&quot;) { // 子菜单悬浮进入:清除延迟收起计时器 childMenu.addEventListener(&quot;mouseenter&quot;, function () { if (hoverTimer) clearTimeout(hoverTimer); }); // 子菜单悬浮离开:延迟收起 childMenu.addEventListener(&quot;mouseleave&quot;, function () { if (isMenuCollapsed) { hoverTimer = setTimeout(() =&gt; { childMenu.style.display = &quot;none&quot;; const arrowIcon = parent.querySelector(&quot;.arrow-icon&quot;); if (arrowIcon) { arrowIcon.classList.remove(&quot;arrowhead&quot;); arrowIcon.setAttribute(&quot;data-arrow&quot;, &quot;true&quot;); } }, 300); } }); } });怎么让子菜单在折叠情况下悬浮在父菜单右边?
最新发布
09-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值