mirror of
https://github.com/xuxiaobo-bobo/boda_jsEnv.git
synced 2025-04-20 03:19:56 +08:00
'frist'
This commit is contained in:
parent
640ea01c32
commit
e99ec079b9
@ -1,471 +0,0 @@
|
||||
<html lang="zh-cmn">
|
||||
|
||||
<head>
|
||||
<script>
|
||||
(function () {
|
||||
if (isMobile()) {
|
||||
location.replace("https://wap.mail.qq.com");
|
||||
}
|
||||
|
||||
function isMobile() {
|
||||
return navigator.userAgent.match(/Mobile|iPhone|iPad|Android/i) || Math.min(screen.height, screen.width) <= 480;
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
<script>
|
||||
(function () {
|
||||
if (location.protocol == "http:") {
|
||||
document.cookie = "edition=; expires=-1; path=/; domain=.mail.qq.com";
|
||||
location.href = "https://mail.qq.com";
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
<title>登录QQ邮箱</title>
|
||||
<style type="text/css">
|
||||
/*html, img {*/
|
||||
/*!* 灰度滤镜 *!*/
|
||||
/*filter: grayscale(100%);*/
|
||||
/*-webkit-filter: grayscale(100%);*/
|
||||
/*-moz-filter: grayscale(100%);*/
|
||||
/*-ms-filter: grayscale(100%);*/
|
||||
/*-o-filter: grayscale(100%);*/
|
||||
/*filter: progid:DXImageTransform.Microsoft.BasicImage(grayscale=1);*/
|
||||
/*-webkit-filter: grayscale(1);*/
|
||||
/*}*/
|
||||
</style>
|
||||
<meta name="renderer" content="webkit">
|
||||
<meta name="save" content="history">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=gb18030">
|
||||
<meta name="description"
|
||||
content="QQ邮箱,为亿万用户提供高效稳定便捷的电子邮件服务。你可以在电脑网页、iOS/iPad客户端、及Android客户端上使用它,通过邮件发送3G的超大附件,体验文件中转站、日历、记事本、漂流瓶等特色功能。QQ邮箱,常联系。">
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="https://rescdn.qqmail.com/zh_CN/htmledition/style/webp/loginpage5f319c.css">
|
||||
<link rel="icon" type="images/png" sizes="16*16" href="/zh_CN/htmledition/images/favicon/qqmail_favicon_16h.png">
|
||||
<link rel="icon" type="images/png" sizes="32*32" href="/zh_CN/htmledition/images/favicon/qqmail_favicon_32h.png">
|
||||
<link rel="icon" type="images/png" sizes="48*48" href="/zh_CN/htmledition/images/favicon/qqmail_favicon_48h.png">
|
||||
<link rel="icon" type="images/png" sizes="96*96" href="/zh_CN/htmledition/images/favicon/qqmail_favicon_96h.png">
|
||||
<meta name="theme-color" content="gray">
|
||||
<script type="text/javascript" src="https://rescdn.qqmail.com/qqmail/assets/deviceString.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<script type="text/javascript">
|
||||
var reportPtlogin = (function () {
|
||||
var gbIsPTReport = false,
|
||||
gnPTTimer = setTimeout(function () {
|
||||
reportPtlogin(-1);
|
||||
}, 5000);
|
||||
return function (_anRet) {
|
||||
clearTimeout(gnPTTimer);
|
||||
|
||||
if (!gbIsPTReport) {
|
||||
gbIsPTReport = true;
|
||||
|
||||
var _oImg = document.createElement("img"),
|
||||
_sUserName = document.getElementById("u") && encodeURIComponent(document.getElementById("u").value) || "",
|
||||
_sDomain = "https://rl.mail.qq.com" || "https://rl.mail.qq.com",
|
||||
_sStat = _sDomain + "/cgi-bin/getinvestigate?stat=loginerr&code=#code#&err=&un=" + _sUserName + "&r=" + Math.random();
|
||||
_sStat = _sStat.replace("#code#", ({ "1": 920, "0": 921, "-1": 922 })[_anRet]);
|
||||
_oImg.src = _sStat;
|
||||
_oImg.style.display = "none";
|
||||
document.body.appendChild(_oImg);
|
||||
_oImg = null;
|
||||
}
|
||||
}
|
||||
})();
|
||||
</script><img src="https://ssl.ptlogin2.qq.com/testimg" style="display:none" onload="reportPtlogin(1)"
|
||||
onerror="reportPtlogin(0)">
|
||||
<div class="container">
|
||||
<div class="header"><a class="header_logo" href="/">QQ邮箱</a>
|
||||
<div class="header_link"><a href="https://wap.mail.qq.com">基本版</a> | <a
|
||||
href="https://en.mail.qq.com">English</a> | <a href="https://app.mail.qq.com/"
|
||||
target="_blank">手机版</a> | <a href="https://exmail.qq.com?referrer=index_top"
|
||||
target="_blank">企业邮箱</a></div>
|
||||
</div>
|
||||
<div class="content">
|
||||
<div id="downError" class="login_msg" style="display:none;">
|
||||
<p><span class="login_msg_warning"></span>由于加载安全组件失败,为了您的帐号安全,无法正常登录邮箱,解决方法:</p>
|
||||
<ul>
|
||||
<li>按下F5重新刷新页面。</li>
|
||||
<li>打开浏览器“选项”菜单,选择“Internet选项”,执行清空缓存功能,确定后按F5刷新本页面。</li>
|
||||
<li>如上述方式仍然无法解决问题,请登录<a href="http://maildisk.bbs.qq.com" target="_blank">邮箱论坛通知我们</a>,我们将尽快为您解决。
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="content_wrapper">
|
||||
<div class="xm_login_container login_container" id="login"
|
||||
style="width: 330px; height: 336px; visibility: visible;">
|
||||
<div class="xm_login_card">
|
||||
<div class="xm_login_card_tab">
|
||||
<div class="xm_login_card_tab_item" id="wxLoginTab">微信登录</div>
|
||||
<div class="xm_login_card_tab_item xm_login_card_tab_item_Active" id="qqLoginTab">QQ登录</div>
|
||||
</div>
|
||||
<div class="xm_login_card_cnt" style="height: 347px;">
|
||||
<div class="xm_login_card_wx" id="wxLoginCard"><iframe id="login_wx_iframe"
|
||||
class="login_loginBox_wx_iframe" height="100%" width="100%" frameborder="no"
|
||||
scrolling="no"
|
||||
src="https://open.weixin.qq.com/connect/qrconnect?appid=wx5e893ac3cc590290&redirect_uri=https%3A%2F%2Fwx.mail.qq.com%2Flist%2Freadtemplate%3Fname%3Dlogin_jump.html%26return_target%3D5%26lt%3Dwechat%26ds%3Ddcf3dc6b30ee3e8b593b01a310d35002&self_redirect=false&response_type=code&scope=snsapi_login&state=state&href=https%3A%2F%2Fres.wx.qq.com%2Fa%2Fwebmail%2Fxmail%2Fres%2Fcss%2Fiframe_wx38793b.css#wechat_redirect"></iframe>
|
||||
<div class="xm_login_card_state">
|
||||
<p id="auto_login" class="auto_login_line" data-check="0">
|
||||
<a></a><span>下次自动登录</span><img
|
||||
src="https://rescdn.qqmail.com/qqmail/images/notice.png" alt=""
|
||||
style="width: 13px; margin-left: 3px; margin-top: 1px;"
|
||||
class="auto_login_tips" id="auto_login_tips"><img
|
||||
src="https://rescdn.qqmail.com/qqmail/images/hover.png"
|
||||
class="login_hover_text" alt="" id="login_hover_text"></p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="xm_login_card_qq" id="qqLoginCard" style="left: 0px;"><iframe id="login_frame"
|
||||
name="login_frame" height="100%" scrolling="no" width="100%" frameborder="0"
|
||||
test="jostinsu1"
|
||||
src="https://xui.ptlogin2.qq.com/cgi-bin/xlogin?target=self&appid=522005705&daid=4&s_url=https://wx.mail.qq.com/list/readtemplate?name=login_jump.html%26target=&style=25&low_login=1&proxy_url=https://mail.qq.com/proxy.html&need_qr=0&hide_border=1&border_radius=0&self_regurl=https%3A%2F%2Freg.mail.qq.com&app_id=11005?t=regist&pt_feedback_link=http://support.qq.com/discuss/350_1.shtml&css=https://res.mail.qq.com/zh_CN/htmledition/style/ptlogin_input_for_xmail5f319c.css"></iframe>
|
||||
<div class="xm_login_card_state" style="top: 252px; left: 166px;">
|
||||
<p id="auto_login_qq" class="auto_login_line"
|
||||
style="display: flex; align-items: center; width: 114px;" data-check="0">
|
||||
<a></a><span>下次自动登录</span><img
|
||||
src="https://rescdn.qqmail.com/qqmail/images/notice.png"
|
||||
style="width: 13px; margin-left: 3px; margin-top: 1px;" alt=""
|
||||
class="auto_login_tips" id="auto_login_tips1"><img
|
||||
src="https://rescdn.qqmail.com/qqmail/images/hover.png"
|
||||
class="login_hover_text" alt="" id="login_hover_text1"></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="login_box second_login_box" style="display:none;">
|
||||
<div class="login_box_header">
|
||||
<h1 class="login_box_title">登录QQ邮箱</h1>
|
||||
</div>
|
||||
<div id="msgContainer" class="login_box_msg" style="display:none;"></div><noscript>
|
||||
<div class="login_box_msg noScript">您的浏览器不支持或已经禁止网页脚本,您无法正常登录。<a
|
||||
href="/zh_CN/help/error_noscript.html" title="了解网页脚本限制的更多信息" target="_blank"><img
|
||||
src="https://rescdn.qqmail.com/zh_CN/htmledition/images/webp/ico_help1e9c5d.gif"
|
||||
style="margin:0 2px;" align="absmiddle" />如何解除脚本限制</a></div>
|
||||
</noscript>
|
||||
<div class="login_box_msg noCookie" id="infobarNoCookie" style="display:none">
|
||||
你的浏览器不支持或已经禁止使用Cookie,导致无法正常登录。请<a
|
||||
href="http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=7&&no=1001007#chrome"
|
||||
title="了解Cookie的更多信息" target="_blank">启用Cookie<img
|
||||
src="https://rescdn.qqmail.com/zh_CN/htmledition/images/webp/ico_help1e9c5d.gif"
|
||||
style="margin:0 2px;" align="absmiddle"></a>后重试。</div>
|
||||
<div style="display:none" id="qlogin" class="qlogin"></div>
|
||||
<div class="login_operate" id="web_login">
|
||||
<form id="loginform" onsubmit="return QMLogin.checkInput();" method="post" name="loginform"
|
||||
target="_self" autocomplete="on">
|
||||
<div class="login_submit" style=""><input class="login_button" id="btlogin"
|
||||
name="btlogin" type="submit" value="登录" tabindex="5"></div>
|
||||
</form>
|
||||
</div><a class="login_box_forgotpassword"
|
||||
href="https://aq.qq.com/cn2/findpsw/pc/pc_find_pwd_input_account?pw_type=6&aquin=&source_id=2705"
|
||||
target="_blank">忘了密码?</a>
|
||||
<div style="display:none;" id="switch" class="lineright" onmouseup="QMLogin.switchMode()"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="login_pictures">
|
||||
<div class="login_pictures_picture"
|
||||
style="background-image:url('https://rescdn.qqmail.com/zh_CN/htmledition/images/webp/tg-mail20f1b0.gif');background-position:right 100px;">
|
||||
</div>
|
||||
<div class="login_pictures_txt">
|
||||
<p class="login_pictures_title">QQ邮箱,常联系!</p>
|
||||
<p>1987年9月14日21时07分</p>
|
||||
<p>中国第一封电子邮件</p>
|
||||
<p>从北京发往德国</p>
|
||||
<p>“越过长城,走向世界”</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="footer" style="line-height: 28px; padding: 6px 20px;"><a href="https://www.tencent.com"
|
||||
target="_blank">关于腾讯</a> | <a
|
||||
href="https://wx.mail.qq.com/list/readtemplate?name=app_intro.html#/agreement/mailService"
|
||||
target="_blank">服务条款</a> | <a
|
||||
href="https://wx.mail.qq.com/list/readtemplate?name=app_intro.html#/agreement/appPolicy"
|
||||
target="_blank">隐私政策</a> | <a href="https://kf.qq.com/product/email.html"
|
||||
target="_blank">客服中心</a> | <a href="https://open.mail.qq.com/feedback/feedbackhome"
|
||||
target="_blank">联系我们</a> | <a href="https://service.mail.qq.com"
|
||||
target="_blank">帮助中心</a> | <span class="gray">©1998 - 2023 Tencent Inc. All Rights
|
||||
Reserved.</span>
|
||||
<style>
|
||||
.commonFrame_recordnumber {
|
||||
line-height: 20px;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.commonFrame_recordnumber a {
|
||||
color: #868686;
|
||||
margin-right: 16px;
|
||||
}
|
||||
|
||||
.commonFrame_recordnumber a.last {
|
||||
margin-right: 0;
|
||||
}
|
||||
</style>
|
||||
<div class="commonFrame_recordnumber"><a
|
||||
href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=44030002000001"
|
||||
target="_blank">粤公网安备 44030002000001号</a><a
|
||||
href="https://beian.miit.gov.cn/#/Integrated/index"
|
||||
target="_blank">ICP备案号 粤B2-20090059</a><a
|
||||
href="https://rescdn.qqmail.com/qqmail/images/B2_20090059.jpg" class="last"
|
||||
target="_blank">增值电信业务经营许可证 粤B2-20090059</a></div>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
|
||||
if (typeof window.postMessage !== 'undefined') {
|
||||
window.onmessage = function (event) {
|
||||
var msg = event || window.event; var data;
|
||||
if (typeof JSON !== 'undefined') data = JSON.parse(msg.data);
|
||||
else
|
||||
data = str2JSON(msg.data);
|
||||
|
||||
switch (data.action) {
|
||||
case 'close':
|
||||
ptlogin2_onClose();
|
||||
break;
|
||||
case 'resize':
|
||||
ptlogin2_onResize(data.width, data.height);
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
}
|
||||
function str2JSON(str) {
|
||||
eval('var __pt_json=' + str);
|
||||
return __pt_json;
|
||||
}
|
||||
function ptlogin2_onResize(width, height) {
|
||||
var login_wnd = document.getElementById("login");
|
||||
if (login_wnd) {
|
||||
login_wnd.style.width = width + "px";
|
||||
login_wnd.style.height = height + "px";
|
||||
login_wnd.style.visibility = "hidden";
|
||||
login_wnd.style.visibility = "visible";
|
||||
}
|
||||
}
|
||||
|
||||
(function () {
|
||||
var _sLen = document.cookie.length,
|
||||
_nCookieNum = Math.random(),
|
||||
_sTestCookie = ["test", _nCookieNum, "test=test", ";expires=Thu, 01 Jan 9970 00:00:00 GMT", ";path=/", ";domain=.mail.qq.com"].join("");
|
||||
document.cookie = _sTestCookie;
|
||||
if (document.cookie.length == _sLen) {
|
||||
document.getElementById("infobarNoCookie").style.display = "";
|
||||
}
|
||||
_sTestCookie = ["test", _nCookieNum, "test=test", ";expires=Thu, 01 Jan 1970 00:00:00 GMT", ";path=/", ";domain=.mail.qq.com"].join("");
|
||||
document.cookie = _sTestCookie;
|
||||
})();
|
||||
</script>
|
||||
<script type="text/javascript">
|
||||
// 2018-12-25 为支持微信登录添加的逻辑 mark by jostinsu
|
||||
function ready(fn) {
|
||||
if (document.addEventListener) {
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
document.removeEventListener('DOMContentLoaded', arguments.callee, false);
|
||||
fn()
|
||||
}, false)
|
||||
} else if (document.attachEvent) {
|
||||
document.attachEvent('onreadystatechange', function () {
|
||||
if (document.readyState == 'complete') {
|
||||
document.detachEvent('onreadystatechange', arguments.callee);
|
||||
fn()
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
function getLoginTypeFromCookie(cb) {
|
||||
var cookies = document.cookie.split(';')
|
||||
for (var index = 0; index <= cookies.length; index++) {
|
||||
var item = cookies[index]
|
||||
if (typeof item === 'string' && item.indexOf('qm_logintype') !== -1) {
|
||||
var cookie = item.split('=')
|
||||
if (cookie[1] && cookie[1] === 'wx') {
|
||||
cb('wx')
|
||||
} else {
|
||||
cb('qq')
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function init() {
|
||||
document.domain = 'mail.qq.com'
|
||||
var wxLoginTab = document.getElementById('wxLoginTab')
|
||||
var qqLoginTab = document.getElementById('qqLoginTab')
|
||||
var wxLoginCard = document.getElementById('wxLoginCard')
|
||||
var qqLoginCard = document.getElementById('qqLoginCard')
|
||||
// var wxLoginIframe = document.getElementById('wxLoginCard_iframe')
|
||||
|
||||
// 根据用户上次登录情况选择显示“微信登录”还是'QQ'登录
|
||||
getLoginTypeFromCookie(function (type) {
|
||||
if (type === 'wx') {
|
||||
qqLoginCard.style.left = '-100%'
|
||||
clickWxLoginTab()
|
||||
} else {
|
||||
qqLoginCard.style.left = '0'
|
||||
clickQQLoginTab()
|
||||
}
|
||||
})
|
||||
|
||||
// 添加onload事件,待微信 iframe 样式加载回来再显示出来,不然会有闪烁
|
||||
// if (wxLoginIframe.attachEvent){
|
||||
// wxLoginIframe.attachEvent("onload", hadLoadedWXIframe);
|
||||
// } else {
|
||||
// wxLoginIframe.onload = hadLoadedWXIframe
|
||||
// }
|
||||
// setTimeout(function() { // 兜底的策略,在2s后必须显示微信登录框
|
||||
// hadLoadedWXIframe()
|
||||
// }, 2000)
|
||||
// function hadLoadedWXIframe() {
|
||||
// wxLoginIframe.style = ''
|
||||
// }
|
||||
|
||||
// 'QQ登录'和‘微信登录’tab的切换事件
|
||||
wxLoginTab.onclick = clickWxLoginTab
|
||||
qqLoginTab.onclick = clickQQLoginTab
|
||||
function clickWxLoginTab() {
|
||||
if (wxLoginTab.className.indexOf('xm_login_card_tab_item_Active') === -1) {
|
||||
wxLoginTab.className += ' xm_login_card_tab_item_Active'
|
||||
qqLoginTab.className = qqLoginTab.className.replace(' xm_login_card_tab_item_Active', '')
|
||||
qqLoginCard.style.left = '-100%'
|
||||
|
||||
var target = document.getElementById('auto_login')
|
||||
if (target.getAttribute('data-check') == 1) {
|
||||
setPendStateCookie(1)
|
||||
} else {
|
||||
deletePendStateCookie(-1)
|
||||
}
|
||||
}
|
||||
}
|
||||
function clickQQLoginTab() {
|
||||
if (qqLoginTab.className.indexOf('xm_login_card_tab_item_Active') === -1) {
|
||||
qqLoginTab.className += ' xm_login_card_tab_item_Active'
|
||||
wxLoginTab.className = wxLoginTab.className.replace(' xm_login_card_tab_item_Active', '')
|
||||
qqLoginCard.style.left = '0'
|
||||
|
||||
var target = document.getElementById('auto_login_qq')
|
||||
if (target.getAttribute('data-check') == 1) {
|
||||
setPendStateCookie(1)
|
||||
} else {
|
||||
deletePendStateCookie(-1)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
ready(init)
|
||||
|
||||
// 2019-09-02 微信登录增加延长登录态逻辑
|
||||
ready(pendFunc)
|
||||
function pendFunc() {
|
||||
var target = document.getElementById('auto_login')
|
||||
var targetChild = document.getElementById('auto_login').getElementsByTagName('a')[0]
|
||||
var targetQQ = document.getElementById('auto_login_qq')
|
||||
var targetChildQQ = document.getElementById('auto_login_qq').getElementsByTagName('a')[0]
|
||||
pendState(target, targetChild)
|
||||
pendState(targetQQ, targetChildQQ)
|
||||
}
|
||||
function pendState(target, targetChild) {
|
||||
if (document.addEventListener) {
|
||||
target.addEventListener('click', function () {
|
||||
console.log('pendstate1')
|
||||
if (target.getAttribute('data-check') == 1) {
|
||||
target.setAttribute('data-check', 0)
|
||||
targetChild.className = ''
|
||||
deletePendStateCookie(-1)
|
||||
} else {
|
||||
target.setAttribute('data-check', 1)
|
||||
targetChild.className = 'xm_login_card_checked'
|
||||
setPendStateCookie(1)
|
||||
}
|
||||
})
|
||||
} else {
|
||||
target.attachEvent('click', function () {
|
||||
target.addEventListener('click', function () {
|
||||
console.log('pendstate12')
|
||||
if (target.getAttribute('data-check') == 1) {
|
||||
target.setAttribute('data-check', 0)
|
||||
targetChild.className = ''
|
||||
deletePendStateCookie(-1)
|
||||
} else {
|
||||
target.setAttribute('data-check', 1)
|
||||
targetChild.className = 'xm_login_card_checked'
|
||||
setPendStateCookie(1)
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
function setPendStateCookie(day) {
|
||||
var date = new Date()
|
||||
date.setTime(date.getTime() + day * 24 * 60 * 60 * 1000)
|
||||
var expires = '; expires=' + date.toGMTString()
|
||||
document.cookie = 'xm_pstate' + '=' + true + expires + '; path=/; domain=.mail.qq.com'
|
||||
}
|
||||
// 初始化进入页面 删除cookie
|
||||
ready(deletePendStateCookie)
|
||||
function deletePendStateCookie() {
|
||||
setPendStateCookie(-1)
|
||||
}
|
||||
ready(hoverFunc)
|
||||
function hoverFunc() {
|
||||
var notice = document.getElementById('auto_login_tips')
|
||||
var hoverText = document.getElementById('login_hover_text')
|
||||
notice && showHover(notice, hoverText)
|
||||
var notice1 = document.getElementById('auto_login_tips1')
|
||||
var hoverText1 = document.getElementById('login_hover_text1')
|
||||
notice1 && showHover(notice1, hoverText1)
|
||||
var notice2 = document.getElementById('auto_login_tips2')
|
||||
var hoverText2 = document.getElementById('login_hover_text2')
|
||||
notice2 && showHover(notice2, hoverText2)
|
||||
}
|
||||
function showHover(notice, hoverText) {
|
||||
notice.addEventListener('mouseenter', function () {
|
||||
hoverText.style.display = 'inline-block'
|
||||
})
|
||||
|
||||
notice.addEventListener('mouseout', function () {
|
||||
hoverText.style.display = 'none'
|
||||
})
|
||||
}
|
||||
</script>
|
||||
<script type="text/javascript">
|
||||
var gsAgent = navigator.userAgent.toLowerCase(),
|
||||
gbIsOpera = gsAgent.indexOf("opera") > -1,
|
||||
gbIsIE = (gsAgent.indexOf("compatible") > -1 && !gbIsOpera),
|
||||
gnIEVer = /MSIE (\d+.\d+);/i.test(gsAgent) && parseFloat(RegExp["$1"]);
|
||||
|
||||
var isIE11 = gsAgent.indexOf('trident') > -1 && gsAgent.indexOf("rv:11.0") > -1;
|
||||
// IE 置灰首页
|
||||
// if (isIE11 || (gbIsIE && gnIEVer > 6)) {
|
||||
// // background: rgb(221, 221, 221); filter: Alpha(opacity=50); opacity: 0.5;
|
||||
// document.documentElement.style.background = 'rgb(221, 221, 221)';
|
||||
// document.documentElement.style.height = '100%';
|
||||
// document.body.style.opacity = '0.5';
|
||||
// document.body.style.height = '100%';
|
||||
// var footer = document.querySelector('.footer');
|
||||
// if (footer) footer.style.opacity = '0.5';
|
||||
// }
|
||||
|
||||
if (!gbIsIE || gnIEVer > 9) {
|
||||
// ie9以上
|
||||
if (!window.Promise) {
|
||||
window.Promise = ES6Promise;
|
||||
}
|
||||
FingerprintJS.load().then(function (fp) {
|
||||
fp.get().then(function (data) {
|
||||
console.log('data.visitorId:', data.visitorId);
|
||||
if (data.visitorId) {
|
||||
// 加上指纹
|
||||
document.getElementById('login_wx_iframe').src =
|
||||
'https://open.weixin.qq.com/connect/qrconnect?appid=wx5e893ac3cc590290&redirect_uri=https%3A%2F%2Fwx.mail.qq.com%2Flist%2Freadtemplate%3Fname%3Dlogin_jump.html%26return_target%3D5%26lt%3Dwechat%26ds%3D' + data.visitorId + '&self_redirect=false&response_type=code&scope=snsapi_login&state=state&href=https%3A%2F%2Fres.wx.qq.com%2Fa%2Fwebmail%2Fxmail%2Fres%2Fcss%2Fiframe_wx38793b.css#wechat_redirect';
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
</script><img
|
||||
src="https://rl.mail.qq.com/cgi-bin/getinvestigate?stat=loginerr&code=920&err=&un=&r=0.1254247840942504"
|
||||
style="display: none;">
|
||||
</body>
|
||||
|
||||
</html>
|
File diff suppressed because one or more lines are too long
@ -1,25 +0,0 @@
|
||||
<!DOCTYPE html
|
||||
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<meta
|
||||
content="{qk674l4096hiY4osq1kpYVhftWS8eHv9Vpr1.VZzT477rSm6S0rRs7i77K.lq7TFzzmG5_vGBiiUhhmWr4r0HseS5_6I9w5yy4UaqqqQrzVSykIGJX36gs4jW50d4shBH50u~Rr9T1IKQkRs22rO0MQbRVrb76VKyBEsWnMsykqs0nspJLkKqpQDYJi9LVFP2aqkTMU2JIkkrURYSmKK0v1nSOrO0FFSeJHklvw0zrpmScUrg0ls0VwnxkpsETF0xIJUAhWG9nDkTE110TSvs2WdECeDuHY8fXBU4nA.TSB6UWW8r7_k55wZAe_lvYFQfhTUk0JFxd.OIu3Zx.amIaAHmTTu65sdeAuVOxwHfW2u_R3W2n0b6c3xmtZV5FtWGavsFQWNALS6KYIyzCgl.TREYl6ooltJAaGsFqWLqL06KrFBJq6CuYpEexTKcXHIJWP6cswt0T.2_LFdaSZY82R3zdGC5.Wtq{HFNR3.m_2VHQl4GhdkdQt.YcBK_AldfuxkQq8upPJceAFZadVDQgmSGj3VxfR9pvHDWGHalsoke9JCpg8http:3Dw11rlzTZkWI3TUmRrjQA:80qqqqqqqq!x7z,aac,amr,asm,avi,bak,bat,bmp,bin,c,cab,css,csv,com,cpp,dat,dll,doc,dot,docx,exe,eot,fla,flc,fon,fot,font,gdb,gif,gz,gho,hlp,hpp,htc,ico,ini,inf,ins,iso,js,jar,jpg,jpeg,json,java,lib,log,mid,mp4,mpa,m4a,mp3,mpg,mkv,mod,mov,mim,mpp,msi,mpeg,obj,ocx,ogg,olb,ole,otf,py,pyc,pas,pgm,ppm,pps,ppt,pdf,pptx,png,pic,pli,psd,qif,qtx,ra,rm,ram,rmvb,reg,res,rtf,rar,so,sbl,sfx,swa,swf,svg,sys,tar,taz,tif,tiff,torrent,txt,ttf,vsd,vss,vsw,vxd,woff,woff2,wmv,wma,wav,wps,xbm,xpm,xls,xlsx,xsl,xml,z,zip,apk,plist,ipaqqqqqqqt1083179008haX2k1DnXixFYhyHeRbnwlgieL151v_wh.r0VA.fuOvKJ8gN4PU8iwLfuqr0r7vQIJ82ScqlE3V2aiVDwQR2fnIUxEIbr1mUy3m9fgkqrZqs38piGqcpqxVlffihcQ3[awo3BkYRotuLyJrWtpS3UsVQNhV7CJcIVmwqTLl43DBl3_YOLq873TYP.pQyqafvQx5xJ_A6zldV35lUbsIpleYFBhdGr5SP0DXa3ePb6Yj08yrMhHJEGef_sDHQb0VsEkQ7DesKmsBWF6rODKWVrarOaKESoSkdnqXpJyT.lhW32Gl6IxdZTGqh5YLqBTAoADxlFnSOst8SKeVK0JIVJPq1oA30refDNEHg9.SX4W5yi2fj4DtJ3BGDeDEe3ZVDpsi3YykifDh9DP1FEsh3IXsF9hReKy15iq303ufjKDEGNnYM8pM3.OuFXEFwWLnKCDJg1zuc.WhWm00_NDL33bmPMqRL3j2OFJNZdGSUHHFg_9nnxlL7C8OwhxYxMQ2Q5hb7qFf9.D60RR1GbY0Gu3OSXlmAg1srMkcqVYVmjic0fUAA0s0aMMp2TKUAqwS2rKsZCwkxLpTlgwlJvAS3BIpJIWUabwTzNYSWXpqroDAqMKr2ctqJUw9pMira1wqpvhAAyVcxupqLZwpJ5Jr2HRSzEDYxRVAq7DpSR3kWfhsg6kqlUlsQ0lf9yHUZ0ofWVWPSUwcgfqkaRIp7vDsZL8mQwmPQwoaW.Ea9MlaV_os78o906iK3VA9Z_DSQRkT9tqq9RiT2mi13FhpZbkSgmkpLExO9_tV3QAqGylTwxhfLqDp2FDaERmcfYYnL1kT7RHr3ytsavWXZ0eGIUt7LPuS1vse0MZfv9K8QqyfvKKFg2yudBAZG9aAovmtQBdPhSkFVMdfvCY_EXeakCDMQM_pvSthxUuO.orXg39OXJky0d6n.sx5pMe0DRrEfHZrBRDQmRaqkkD8TR9nojD8pk4G6VozfMCquAALGyysk6hwTUfn4AqJWR4rX0DFgL4T8Qr_WBGa5lHN73P0CfmgVb2ACUi.Al4V5hD_ARB2beqhGRPmv0m4mce9i5ii0l7ObhHRaBZc5Ro.QO9mI3hL0qPrvxDyWRPnOlYgaO.S_QAFWezu1JWMqUBcK4WWEKassKs_gMGSbMKR3q2pbvKw9sOO57HLNDfOygh99ohqxWknNoV1xrYk0zRGJ2DP33IfNGtnmVFqyOo6G48PV9kvAeEcAGAm008OpjmuzWApfXDvrFQaJnD9xFqfmRiSL2mnStWvLwsGYUrG3r3szZADSVmPTkq0EFqSfmD20.o2pFJowqqSY4x6gZ1fLis2plYuzDp6aUolS9DkVFhYL7qnZFDYNvoogiEGWvqnaS80YdEcEfxOVKEpz3lYp.hA9zQY9OluwRJa3vKs9DWm9BrsgloSWuqO7lQrLxmAA3lpWnrcQRqpJxlGEYDGZRqOLUDpQrrVeFDGAFlnTFt2pwqp3VKSQmr29UrSeUqaLsckV8DqGskT91oSas4GU9K8Vseu.zm8q3epHhod7cjT.5rHgs01XfDH7FgnXZYHNlynsYh508Lqd2h7ZH0fXXq_EueOD5sW33_S.uK7gkup.dKLl390MArzZQ_r4kpeqFSYO7q8Jqe14BYxVz6GHwDNg3Sf.3ty2VCAI8xi0BuShwxdQmnpd3D5g05OKLm5JWbpPCDjfFjaijDNNF_G1upx9GBrbZJM01XchZKELY9TPFl_xV4PC4q4LF5SPzD.V.e217E49gbS10Kh9UPliak_LI2kOwHFQUSlnZDx0FfYjlqgQF7Y.Hq3WFLlivDyQlPftepyVB.A5nsgRiBTskhRAk2S.ADEGF9PXcKCgcMpzIIAqr2Da67074qqqqqqqq|vJa7h322ZAv9U89ydVP0Y8YyCV6RRJfwZVn7Y1Df6KUY38TJlFkgUQTRuVPEYlaetMbmSYUNuFowcVK38UTe98Kmb3KJ8sve7prNqo9yupUJGITxCVmyg86JyKarPYlRpwA2cYoNiATpB1bf6Ykr4El3XYq2XqbYeKDfGQUAiAkrOHAqtUr9kl20QM1Tsxblg8kp_JUaPRbpohCq3DAx4qqW8QDGriCVFMn2lRTmcmSwKk9EDc9RHlTGaKkx5llVaDsrYrT7OYpSHrCQ8mVgqqqqqqq">
|
||||
<!--[if lt IE 9]><script r='m'>document.createElement("section")</script><![endif]-->
|
||||
<script type="text/javascript" charset="iso-8859-1" src="/datasearch/1eeUmXQiFksL/fjtvkgf7LVI2.a670748.js"
|
||||
r='m'></script>
|
||||
<script type="text/javascript" r="m">
|
||||
</script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<script type='text/javascript' r='m'>
|
||||
_$El('IEAy');
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
<script type="text/javascript" r="m">
|
||||
_$2_();
|
||||
</script>
|
File diff suppressed because one or more lines are too long
@ -1,16 +0,0 @@
|
||||
{
|
||||
"targets":[
|
||||
{
|
||||
"target_name":"boda",
|
||||
"sources":['./c++_src/main.cc'],
|
||||
"include_dirs":['<!@(node -p "require(\'node-addon-api\').include")'],
|
||||
"dependencies":['<!(node -p "require(\'node-addon-api\').gyp")'],
|
||||
"cflags_cc":[
|
||||
"-std-c++17"
|
||||
],
|
||||
"cflags!":["-fno-exceptions"],
|
||||
"cflags_cc!":['-fno-exceptions'],
|
||||
"defines":['NAPI_DISABLE_CPP_EXCEPTIONS']
|
||||
}
|
||||
]
|
||||
}
|
@ -1,37 +0,0 @@
|
||||
/*
|
||||
|
||||
1.最新版npm
|
||||
windows 管理员运行 npm install --global windows-build-tools,
|
||||
如果卡在Successfully install Python2.7,就在c:\用户名\AppDate\Local\TEMP下新建
|
||||
一个文件,名称dd_client_.log 内容 Closing installer. Return code: 3010.
|
||||
|
||||
3.npm install --global node-gyp
|
||||
4.当前目录下放入bingding.gyp
|
||||
|
||||
5.初始化项目
|
||||
1.npm init
|
||||
2.npm i node-addon-api
|
||||
3.安装vscode c++拓展
|
||||
4.执行node-gyp configure 查看Dnode_root_dir,确认头文件 '-Dnode_root_dir=C:\\Users\\徐晓波\\AppData\\Local\\node-gyp\\Cache\\14.18.2',
|
||||
5.c_cpp_properties.json(vscode ctrl+shift+p ) includePath 中加入 C:\Users\徐晓波\AppData\Local\node-gyp\Cache\14.18.2\include\node
|
||||
|
||||
6.编译
|
||||
1.根目录放入bingding.gyp
|
||||
2.cmd执行node-gyp rebuild 编译
|
||||
|
||||
3.报错
|
||||
File "C:\Users\徐晓波\AppData\Roaming\npm\node_modules\node-gyp\gyp\pylib\gyp\input.py", line 983, in ExpandVariables
|
||||
replacement = result.stdout.decode("utf-8").rstrip()
|
||||
AttributeError: 'str' object has no attribute 'decode' while trying to load binding.gyp
|
||||
解决办法,进入C:\Users\徐晓波\AppData\Roaming\npm\node_modules\node-gyp\gyp\pylib\gyp\input.py", line 983
|
||||
修改该行代码为replacement = result.stdout.rstrip()
|
||||
|
||||
7.安装npm install bindings
|
||||
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,123 +0,0 @@
|
||||
# -*- coding = utf-8 -*-
|
||||
# @Time: 2023-02-03 22:59
|
||||
# @Author: xiaobo 徐晓波
|
||||
# @Site:
|
||||
# @File: test.py
|
||||
# @Software: PyCharm
|
||||
bbb=[
|
||||
'EventTarget',
|
||||
'WindowProperties',
|
||||
'Window',
|
||||
'Node',
|
||||
'Element',
|
||||
'HTMLElement',
|
||||
'HTMLCollection',
|
||||
'NetworkInformation',
|
||||
'CustomElementRegistry',
|
||||
'Event',
|
||||
'UIEvent',
|
||||
'MouseEvent',
|
||||
'Document',
|
||||
'HTMLDocument',
|
||||
'Location',
|
||||
'Storage',
|
||||
'CharacterData',
|
||||
'Text',
|
||||
'Database',
|
||||
'CloseEvent',
|
||||
'Notification',
|
||||
'IDBDatabase',
|
||||
'IDBRequest',
|
||||
'IDBOpenDBRequest',
|
||||
'IDBFactory',
|
||||
'History',
|
||||
'Screen',
|
||||
'CSSStyleDeclaration',
|
||||
'CanvasRenderingContext2D',
|
||||
'WebGLRenderingContext',
|
||||
'MediaQueryList',
|
||||
'CSSRuleList',
|
||||
'Attr',
|
||||
'Navigation',
|
||||
'MediaStream',
|
||||
'TrustedTypePolicyFactory',
|
||||
'Scheduler',
|
||||
'CookieStore',
|
||||
'CacheStorage',
|
||||
'OffscreenCanvasRenderingContext2D',
|
||||
'VisualViewport',
|
||||
'BeforeInstallPromptEvent',
|
||||
'BarProp',
|
||||
'BaseAudioContext',
|
||||
'BluetoothUUID',
|
||||
'StyleMedia',
|
||||
'Audio',
|
||||
'Crypto',
|
||||
'CDATASection',
|
||||
'Comment',
|
||||
'DocumentFragment',
|
||||
'DocumentType',
|
||||
'DOMParser',
|
||||
'External',
|
||||
'WebSocket',
|
||||
'SourceBuffer',
|
||||
'DOMStringList',
|
||||
'Headers',
|
||||
'IDBObjectStore',
|
||||
'IDBTransaction',
|
||||
'IDBVersionChangeEvent',
|
||||
'TextTrackList',
|
||||
'SpeechSynthesisUtterance',
|
||||
'MediaEncryptedEvent',
|
||||
'MutationObserver',
|
||||
'NamedNodeMap',
|
||||
'NodeList',
|
||||
'OfflineAudioContext',
|
||||
'Path2D',
|
||||
'Performance',
|
||||
'ScreenOrientation',
|
||||
'PerformanceEntry',
|
||||
'PerformancePaintTiming',
|
||||
'Permissions',
|
||||
'PermissionStatus',
|
||||
'Request',
|
||||
'SVGElement',
|
||||
'SVGGraphicsElement',
|
||||
'SVGPatternElement',
|
||||
'SVGGeometryElement',
|
||||
'SVGPathElement',
|
||||
'SVGSVGElement',
|
||||
'SVGSymbolElement',
|
||||
'SVGUseElement',
|
||||
'WebGLShader',
|
||||
'WebGLShaderPrecisionFormat',
|
||||
'RTCPeerConnection',
|
||||
'WebGLBuffer',
|
||||
'WebGLProgram',
|
||||
'CSS',
|
||||
'Navigator',
|
||||
'BatteryManager',
|
||||
'Plugin',
|
||||
'PluginArray',
|
||||
'MimeType',
|
||||
'MimeTypeArray',
|
||||
'XMLHttpRequestEventTarget',
|
||||
'XMLHttpRequest',
|
||||
'globalThis'
|
||||
]
|
||||
|
||||
import os
|
||||
lists=os.listdir(r'D:\My_Dir\环境框架_xbb_lastest\env')
|
||||
for i in lists:
|
||||
name=i.split('.')[0]
|
||||
if name not in bbb:
|
||||
print(name)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,81 +0,0 @@
|
||||
/**
|
||||
*
|
||||
* 安装: nodejs
|
||||
* 然后: npm install vm2 npm install canvas npm install jsdom
|
||||
* 提示: 建议每一个编写完事的js 建议用fd的js调试工具压缩一下,减少占用行数
|
||||
*
|
||||
* 使用vm2之前,先修改vm2本地文件
|
||||
*
|
||||
* 1、修改vm.js里的
|
||||
* // Create a new context for this vm.
|
||||
* //原本下面这句话 const _context = createContext(undefined, {
|
||||
* //被修改成了这句话 const _context = createContext(options, {
|
||||
* //外界在new VM的时候 把全局变量通过对象形式传递过来,全局的context就会继承这个全局变量!
|
||||
*
|
||||
*
|
||||
* 2、修改contextify.js里的 搜索Contextify.setGlobal =
|
||||
* (1)、try {
|
||||
global[prop] = value;//Contextify.value(value); //这里是为了在调试代码里不显示proxy 已被代理
|
||||
* (2)、去掉vm2特征global
|
||||
* //下面这段屏蔽了
|
||||
* Object.defineProperties(global, {
|
||||
* global: {value: global},
|
||||
* GLOBAL: {value: global},
|
||||
* root: {value: global},
|
||||
* isVM: {value: true}
|
||||
* });
|
||||
*
|
||||
*
|
||||
* 3、修改main.js里的
|
||||
* //如果想让vm2报错不是内部错误,修改890行
|
||||
* throw e;//this._internal.Decontextify.value(e); //原本是这句话throw this._internal.Decontextify.value(e); 改成了 throw e
|
||||
*
|
||||
* 关于vm2报错本地文件,但是找不到那个报错的调试文件解决方法:
|
||||
* const {VM,VMScript} = require("vm2");//这个是修改过的
|
||||
* const CodeGenerate = require("./node_tools/CodeGenerate.js");
|
||||
* //内存的概念,并非真正的内存,只是变量存储。
|
||||
* let Vm2Cfg = {memory:{prototypes:{},examples:{}},DefPrototype(prototypeName,constructor,basePrototype){}};
|
||||
* let savepath = `${__dirname}/vm_testScript/VM2_debug.js`; //提前把文件路径保存到变量里。
|
||||
* let code = CodeGenerate(path_,savepath); //把加载完事的文件code直接写到本地
|
||||
* let vm = new VM();
|
||||
* let catvm = Object.assign(Vm2Cfg,{vm:this});//内存配置导入
|
||||
* vm.setGlobal("catvm",catvm);//导入到全局里,这里的名字随便改,整体形成代码形式的话。就不要随意修改了。
|
||||
* vm.run(new VMScript(code,savepath)); //运行前 savepath 要保存到本地,那么调试报错时才能找到位置。
|
||||
*
|
||||
*
|
||||
* VScode 环境联调配置nodejs执行配置文件内容 launch.json
|
||||
* //运行js时添加nodejs配置文件 launch.json ,测试代码路径如下:
|
||||
* //C:\Users\AdministratorLr\Desktop\NewCode3_2022_10_15\.vscode\launch.json
|
||||
* //配置文件内容入下:
|
||||
*
|
||||
*{
|
||||
* "version": "0.2.0",
|
||||
* "configurations": [
|
||||
* {
|
||||
* "name": "v1 本地调试",
|
||||
* "type": "node",
|
||||
* "request": "launch",
|
||||
* "program": "${workspaceFolder}/index.js", //它只是跟在可执行文件后面的 一个参数了,要调试的js代码,不管你想执行哪个配置文件,这里配置即可
|
||||
* "runtimeExecutable": "D:\\nodejs\\node.exe" // 这里是 v16 版本的node路径,不管你安装几个版本的node都可以指定全局配置。这里配置完就可以随意切换了
|
||||
* },
|
||||
* {
|
||||
* "name": "v2 浏览器无环境联调",
|
||||
* "type": "node",
|
||||
* "request": "launch",
|
||||
* "program": "--inspect-brk", //它只是跟在可执行文件后面的 一个参数了
|
||||
* "args": ["${workspaceFolder}/index.js"],//它只是跟在可执行文件后面的 一个参数了
|
||||
* "runtimeExecutable": "D:\\nodejs\\node.exe" // 这里是 v16 版本的node路径,不管你安装几个版本的node都可以指定全局配置。这里配置完就可以随意切换了
|
||||
* },
|
||||
* {
|
||||
* "name": "v3 cmd参数详解", //演示所有参数的含义 , 控制台执行的结果是: D:\nodejs\node.exe args1 args2 args3 args4 args5 所以根据想要的功能自行设定和删减
|
||||
* "type": "node",
|
||||
* "request": "launch",
|
||||
* "program": "args3", //它只是跟在可执行文件后面的 一个参数了
|
||||
* "args": ["args4", "args5"],//它只是跟在可执行文件后面的 一个参数了
|
||||
* "runtimeArgs": ["args1", "args2"],//它只是跟在可执行文件后面的 一个参数了
|
||||
* "runtimeExecutable": "D:\\nodejs\\node.exe" // 这里是 v16 版本的node路径,不管你安装几个版本的node都可以指定全局配置。这里配置完就可以随意切换了
|
||||
* }
|
||||
* ]
|
||||
*}
|
||||
*
|
||||
**/
|
@ -1,146 +0,0 @@
|
||||
//全局对象配置
|
||||
var myloglist=[]
|
||||
var myloglistindex=0
|
||||
bodavm = {
|
||||
|
||||
"toolsFunc": {}, //功能函数相关,插件
|
||||
"envFunc": {},//环境相关
|
||||
"config": {}, //配置相关
|
||||
"memory":{},
|
||||
"toolsPlugin": {} //Plugin相关
|
||||
}
|
||||
bodavm.config.isdebug=false; //是否开启debugger
|
||||
|
||||
bodavm.config.proxy = false; //是否代理
|
||||
|
||||
bodavm.config.printLog=true; //是否打开日志
|
||||
bodavm.memory.isproxy= {}
|
||||
bodavm.memory.filterProxyProp=['toJSON','undefined','splice','String','fromCharCode','apply','prototype','__proto__','toString','Object','Array',"eval",'Symbol(Symbol.toStringTag)','Symbol.toStringTag','bodavm.memory.symbolData',"Symbol(Symbol.species)",'Symbol(Symbol.hasInstance)'] //需要过滤 的属性
|
||||
bodavm.memory.symbolData=Symbol("data") //用来保存当前对象上的原型属性
|
||||
bodavm.memory.globalInit={}
|
||||
//存储tag标签
|
||||
bodavm.memory.tag=[]
|
||||
// bodavm.memory.localStorage={};
|
||||
bodavm.memory.cookie1='' //用来存储555
|
||||
bodavm.memory.cookie2={} //用来存储"a=10"
|
||||
bodavm.memory.cookie=''; //拼接cookie1 和cookie2
|
||||
|
||||
bodavm.memory.asyncEvent={};
|
||||
bodavm.memory.globalInit.timeoutID=0;
|
||||
// "Verdana;Helvetica Neue LT Pro 35 Thin;tahoma;verdana;times new roman;Courier New;Microsoft Himalaya;helvetica;LG-FZKaTong-M19-V2.2;Georgia;georgia;courier new;Arial;arial;cursive;times;fantasy;courier;serif;monospace;Times New Roman"
|
||||
bodavm.memory.globalInit.fontList = ["SimHei", "SimSun", "NSimSun", "FangSong", "KaiTi",'Verdana','tahoma','helvetica','Georgia','georgia','Arial','arial','cursive','fantasy','courier','serif','monospace'];
|
||||
bodavm.memory.font={
|
||||
"font-family":'',
|
||||
"fontFamily":''
|
||||
}
|
||||
|
||||
|
||||
bodavm.memory.location={
|
||||
origin:"http://101.43.230.100",
|
||||
hash:"",
|
||||
pathname:"/",
|
||||
search:"",
|
||||
href:"http://101.43.230.100/",
|
||||
port:"",
|
||||
protocol:"http:",
|
||||
host:"101.43.230.100",
|
||||
ancestorOrigins:"{}",
|
||||
hostname:"101.43.230.100"
|
||||
};
|
||||
|
||||
bodavm.memory.document={
|
||||
URL:"http://101.43.230.100/",
|
||||
referrer:"",
|
||||
documentURI:"http://101.43.230.100/",
|
||||
compatMode:"CSS1Compat",
|
||||
dir:"",
|
||||
title:"QQ会员等级 - QQ等级 - 好莱坞等级 查询",
|
||||
designMode:"off",
|
||||
readyState:"complete",
|
||||
contentType:"text/html",
|
||||
inputEncoding:"UTF-8",
|
||||
domain:"101.43.230.100",
|
||||
characterSet:"UTF-8",
|
||||
charset:"UTF-8",
|
||||
hidden:"false",
|
||||
onmousemove:"null",
|
||||
onselectionchange:"null",
|
||||
|
||||
};
|
||||
|
||||
bodavm.memory.htmldivelement={
|
||||
align:"undefined",
|
||||
|
||||
};
|
||||
|
||||
bodavm.memory.history={
|
||||
scrollRestoration:"auto"
|
||||
};
|
||||
|
||||
bodavm.memory.screen={
|
||||
width:1440,
|
||||
height:960,
|
||||
availWidth:1440,
|
||||
availHeight:920,
|
||||
pixelDepth:24,
|
||||
colorDepth:24,
|
||||
availLeft:0,
|
||||
availTop:0,
|
||||
isExtended:undefined,
|
||||
orientation:{},
|
||||
onchange:undefined,
|
||||
};
|
||||
|
||||
bodavm.memory.navigator={
|
||||
language:"zh-CN",
|
||||
userAgent:"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36",
|
||||
appVersion:"5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36",
|
||||
vendor:"Google Inc.",
|
||||
appName:"Netscape",
|
||||
appCodeName:"Mozilla",
|
||||
cookieEnabled:true,
|
||||
languages:["zh-CN","zh"],
|
||||
productSub:"20030107",
|
||||
userAgentData:undefined,
|
||||
xr:undefined,
|
||||
platform:'Win32',
|
||||
webkitPersistentStorage:{},
|
||||
connection:{},
|
||||
javaEnabled:false
|
||||
};
|
||||
bodavm.memory.window={
|
||||
indexedDB:{},
|
||||
name:"",
|
||||
};
|
||||
|
||||
bodavm.memory.canvas={};
|
||||
bodavm.memory.canvas2D={
|
||||
direction: "ltr",
|
||||
fillStyle: "#000000",
|
||||
filter: "none",
|
||||
font: "10px sans-serif",
|
||||
fontKerning: "auto",
|
||||
fontStretch: "normal",
|
||||
fontVariantCaps: "normal",
|
||||
globalAlpha: 1,
|
||||
globalCompositeOperation: "source-over",
|
||||
imageSmoothingEnabled: true,
|
||||
imageSmoothingQuality: "low",
|
||||
letterSpacing: "0px",
|
||||
lineCap: "butt",
|
||||
lineDashOffset: 0,
|
||||
lineJoin: "miter",
|
||||
lineWidth: 1,
|
||||
miterLimit: 10,
|
||||
shadowBlur: 0,
|
||||
shadowColor: "rgba(0, 0, 0, 0)",
|
||||
shadowOffsetX: 0,
|
||||
shadowOffsetY: 0,
|
||||
strokeStyle: "#000000",
|
||||
textAlign: "start",
|
||||
textBaseline: "alphabetic",
|
||||
textRendering: "auto",
|
||||
wordSpacing: "0px",
|
||||
}
|
||||
// bodavm.memory.localStorage={}
|
||||
|
File diff suppressed because one or more lines are too long
@ -1,230 +0,0 @@
|
||||
// 代理器失效 1.没有使用代理对象 2.代理器脱钩 目标代码通过 this 绕过代理器
|
||||
// 解决办法
|
||||
window = this;
|
||||
window = new Proxy(window, this)
|
||||
// globalThis=new Proxy(globalThis,'globalThis')
|
||||
// window.mythis=function(){
|
||||
/// 网站扣下的代码
|
||||
// }
|
||||
// mythis()
|
||||
|
||||
//2自执行
|
||||
for (let name in global) {
|
||||
switch (name) {
|
||||
case "window":
|
||||
continue;
|
||||
case "global":
|
||||
continue;
|
||||
}
|
||||
window[name] = global[name];
|
||||
delete global[name];
|
||||
}
|
||||
|
||||
window = myProxy(window, "window");
|
||||
Object.setPrototypeOf(global, window);
|
||||
!function () { }()
|
||||
|
||||
|
||||
|
||||
//全局hook
|
||||
bobomyHookfilter={
|
||||
'location':true,
|
||||
'Function':true,
|
||||
'Object':true,
|
||||
'window':true,
|
||||
'Window':true,
|
||||
'document':true,
|
||||
'bobomyHook':true,
|
||||
"hookObjs":true,
|
||||
'objlist':true,
|
||||
'JSON':true,
|
||||
'bobomyHookfilter':true,
|
||||
'Math':true,
|
||||
'Intl':true,
|
||||
'Reflect':true,
|
||||
'console':true,
|
||||
'CSS':true,
|
||||
'Atomics':true,
|
||||
'top':true,
|
||||
|
||||
|
||||
}
|
||||
hookObjs = {
|
||||
|
||||
}
|
||||
objlist=[
|
||||
{
|
||||
'name':"window",
|
||||
'obj':window
|
||||
},
|
||||
{
|
||||
'name':"document",
|
||||
'obj':document
|
||||
},
|
||||
{
|
||||
'name':"screen",
|
||||
'obj':screen
|
||||
},
|
||||
{
|
||||
'name':"history",
|
||||
'obj':history
|
||||
},
|
||||
{
|
||||
'name':"localStorage",
|
||||
'obj':localStorage
|
||||
},
|
||||
{
|
||||
'name':'navigation',
|
||||
'obj':navigation
|
||||
},
|
||||
{
|
||||
'name':'webkitStorageInfo',
|
||||
'obj':webkitStorageInfo
|
||||
},
|
||||
{
|
||||
'name':'speechSynthesis',
|
||||
'obj':speechSynthesis
|
||||
|
||||
},
|
||||
{
|
||||
'name':'sessionStorage',
|
||||
'obj':sessionStorage
|
||||
|
||||
},
|
||||
{
|
||||
'name':'customElements',
|
||||
'obj':customElements
|
||||
},
|
||||
{
|
||||
'name':'clientInformation',
|
||||
'obj':clientInformation
|
||||
},
|
||||
{
|
||||
'name':'menubar',
|
||||
'obj':menubar
|
||||
},
|
||||
{
|
||||
'name':'toolbar',
|
||||
'obj':toolbar
|
||||
},
|
||||
{
|
||||
'name':'visualViewport',
|
||||
'obj':visualViewport
|
||||
},
|
||||
|
||||
{
|
||||
'name':'styleMedia',
|
||||
'obj':styleMedia
|
||||
},
|
||||
|
||||
{
|
||||
'name':'scheduler',
|
||||
'obj':scheduler
|
||||
},
|
||||
|
||||
{
|
||||
'name':'indexedDB',
|
||||
'obj':indexedDB
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
'name':'trustedTypes',
|
||||
'obj':trustedTypes
|
||||
},
|
||||
|
||||
{
|
||||
'name':'cookieStore',
|
||||
'obj':cookieStore
|
||||
},
|
||||
{
|
||||
'name':'external',
|
||||
'obj':external
|
||||
|
||||
}
|
||||
|
||||
|
||||
]
|
||||
for (let i = 0; i < objlist.length; i++) {
|
||||
let name = objlist[i]['name'];
|
||||
let obj= objlist[i]['obj']
|
||||
hookObjs[name] = {}
|
||||
bobomyHook(obj,name)
|
||||
}
|
||||
function bobomyHook(obj,name) {
|
||||
|
||||
let boboobjname = Object.getOwnPropertyNames(obj)
|
||||
for (let i =0; i<boboobjname.length;i++) {
|
||||
//i name
|
||||
if (bobomyHookfilter[boboobjname[i]]){continue}
|
||||
let bobodesc = Object.getOwnPropertyDescriptor(obj, boboobjname[i])
|
||||
// console.log(bobodesc)
|
||||
let boboconfigurable_ = bobodesc['configurable']
|
||||
let boboenumerable_ = bobodesc['enumerable']
|
||||
let bobovalue_ = bobodesc['value']
|
||||
let bobowritable_ = bobodesc['writable']
|
||||
let boboget_ = bobodesc['get']
|
||||
let boboset_ = bobodesc['set']
|
||||
// console.log(bobodesc)
|
||||
// get set 与value writable不能共存 configurable enumerable这两个是肯定有的
|
||||
try{
|
||||
if (boboget_ || boboset_) {
|
||||
hookObjs[name][boboobjname[i] + '_get'] = boboget_
|
||||
hookObjs[name][boboobjname[i] + '_set'] = boboset_
|
||||
const myvalue=boboobjname[i]
|
||||
Object.defineProperty(obj,myvalue,{
|
||||
configurable:boboconfigurable_,
|
||||
enumerable:boboenumerable_,
|
||||
get:boboget_?function (){
|
||||
let args=arguments
|
||||
let result=hookObjs[name][myvalue + '_get'].apply(this,arguments)
|
||||
console.log(`${name} get-> ${myvalue} arg->${JSON.stringify(args)} -> result -> ${result}`)
|
||||
return result
|
||||
}:undefined,
|
||||
set:boboset_?function(){
|
||||
let args=arguments
|
||||
let result=hookObjs[name][myvalue + '_set'].apply(this,arguments)
|
||||
console.log(`${name} set-> ${myvalue} -> arg->${JSON.stringify(args)} value -> ${result}`)
|
||||
return result
|
||||
}:undefined
|
||||
})
|
||||
|
||||
} else {
|
||||
hookObjs[name][boboobjname[i] + '_value']=bobovalue_
|
||||
if (typeof bobovalue_ =='object'){
|
||||
const myvalue=boboobjname[i]
|
||||
console.log(`${name} value-> ${myvalue} result ->${bobovalue_}`);
|
||||
Object.defineProperty(obj,boboobjname[i],{
|
||||
configurable:boboconfigurable_,
|
||||
enumerable:boboenumerable_,
|
||||
writable:bobowritable_,
|
||||
value:bobovalue_
|
||||
})
|
||||
|
||||
}else if (typeof bobovalue_ =='function'){
|
||||
const myvalue=boboobjname[i]
|
||||
Object.defineProperty(obj,boboobjname[i],{
|
||||
configurable:boboconfigurable_,
|
||||
enumerable:boboenumerable_,
|
||||
writable:bobowritable_,
|
||||
value:function (){
|
||||
let args=arguments
|
||||
let result=hookObjs[name][myvalue + '_value'].apply(this,arguments)
|
||||
console.log(`${name} value apply -> ${myvalue} arg->${JSON.stringify(args)} result ->${result}`);
|
||||
return result
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}catch{}
|
||||
|
||||
}
|
||||
|
||||
if (obj.__proto__ !=null){
|
||||
bobomyHook(obj.__proto__,name)
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
// window.atob('123')
|
@ -1 +0,0 @@
|
||||
JSON.stringify(console)
|
@ -1,26 +0,0 @@
|
||||
<div id="parentElement">
|
||||
<span id="childElement">foo bar</span>
|
||||
</div>
|
||||
|
||||
{/* <script> */}
|
||||
// 创建要插入的节点
|
||||
var newNode = document.createElement("span");
|
||||
|
||||
// 获得父节点的引用
|
||||
var parentDiv = document.getElementById("childElement").parentNode;
|
||||
|
||||
//实验一:referenceNode 存在 --> 正确返回
|
||||
var sp2 = document.getElementById("childElement");
|
||||
parentDiv.insertBefore(newNode, sp2);
|
||||
//实验一结束
|
||||
|
||||
//实验二:referenceNode 为 undefined
|
||||
var sp2 = undefined; // Not exist a node of id "childElement"
|
||||
parentDiv.insertBefore(newNode, sp2); //隐式转换到节点类型
|
||||
//实验二结束
|
||||
|
||||
//实验三:referenceNode 为字符类型的 "undefined"
|
||||
var sp2 = "undefined"; //不存在 id 为"childElement"的 referenceNode
|
||||
parentDiv.insertBefore(newNode, sp2); // Generate "Type Error: Invalid Argument"
|
||||
//实验三结束
|
||||
{/* </script> */}
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,46 +0,0 @@
|
||||
(function n(i, r, t, e, l, a, f, u) {
|
||||
var c, o, h, s, p, g, m, y, d, v, w, b, C, F, j, S, k, q, x, z, A, B, D, E, G, H, I, J, K, L, M, N, O, P, Q, R, T,
|
||||
U, V;
|
||||
if (this.constructor != n) {
|
||||
if (e || ((e = [this]).n = e[0], e.t = [], (o = {}).s = !1, o.v = !1, e.t.push(o), n.r = n.g = n), h = e[e.length - 1], -3 == t || -2 == t) {
|
||||
if (-2 == t) {
|
||||
for (a = 0, f = 0; i[r] > 127;) f += i[r++] - 128 << 7 * a++;
|
||||
f += i[r++] << 7 * a
|
||||
} else f = (r = (s = n(i, r, -2)).i) + (a = s.n) - 1, r += a;
|
||||
return {n: f, i: r}
|
||||
}
|
||||
if (l === n) {
|
||||
for (p = new n.g, g = [].slice.call(u), m = 0; m < a.length; m++) p[a[m]] = g[m];
|
||||
return p.arguments = u, (y = [].concat(e).concat(p)).n = f, y.t = [], n(i, r, t, y)
|
||||
}
|
||||
if (d = r || 0, c = t || i.length, v = i[d++], s = n(i, d, -2), d = s.i, s.n, w = 0, 6 == v || 10 == v ? w = 1 : 30 == v ? w = 2 : 29 == v && (w = 3), 6 == v || 10 == v || 30 == v || 29 == v) {
|
||||
for (o = e.t && e.t[e.t.length - 1], b = []; d < c;) {
|
||||
if (C = d++, s = n(i, d, -3), d = s.i, F = s.n, b.push(n(i, C, F, e)), 3 != w && e.a) return b[b.length - 1];
|
||||
if (2 == w && o && (o.v || o.s)) return b[b.length - 1]
|
||||
}
|
||||
if (2 != w) return b
|
||||
}
|
||||
if (25 == v) {
|
||||
if (j = n(i, d++, (s = n(i, d, -3), d = s.i, s.n), e), g = n(i, d++, (s = n(i, d, -3), d = s.i, s.n), e), n.bind) return new (n.bind.apply(j, [null].concat(g)));
|
||||
for (S = [], m = 0; m < g.length; m++) S[m] = "a[" + m + "]";
|
||||
return n.constructor("F,a", "return new F(" + S.join(",") + ")")(j, g)
|
||||
}
|
||||
if (80 != v) {
|
||||
if (125 == v) throw n(i, d++, (s = n(i, d, -3), d = s.i, s.n), e);
|
||||
if (18 == v || 113 == v) {
|
||||
for (I = i[d++], s = n(i, d, -2), d = s.i, J = s.n, K = [], m = 0; m < J; m++) s = n(i, d, -2), d = s.i, L = s.n, K.push(L);
|
||||
return M = String.fromCharCode.apply(null, K), 113 == v || e.m ? M : l ? [e[I], M] : e[I][M]
|
||||
}
|
||||
return 0 == v ? (e.m = !0, N = n(i, d++, (s = n(i, d, -3), d = s.i, s.n), e), e.m = !1, h[N] = e.u, n(i, d++, (s = n(i, d, -3), d = s.i, s.n), e)) : 67 == v ? (91 == i[d++] && (O = i[d++]), O) : 34 == v ? a != f : 89 == v ? n(i, d++, (s = n(i, d, -3), d = s.i, s.n), e) : 58 == v ? null : 57 == v ? n(i, d++, (s = n(i, d, -3), d = s.i, s.n), e, 0, n(i, d++, (s = n(i, d, -3), d = s.i, s.n), e), n(i, d++, (s = n(i, d, -3), d = s.i, s.n), e)) : 78 == v ? (P = n(i, d++, (s = n(i, d, -3), d = s.i, s.n), e), Q = n(i, d++, (s = n(i, d, -3), d = s.i, s.n), e), e.m = !P, R = n(i, d++, (s = n(i, d, -3), d = s.i, s.n), e), e.m = !1, l ? [Q, R] : Q[R]) : 88 == v ? n(i, d++, (s = n(i, d, -3), d = s.i, s.n), e) ? n(i, d++, (s = n(i, d, -3), d = s.i, s.n), e) : (s = n(i, ++d, -3), d = s.i, s.n, n(i, d++, (s = n(i, d, -3), d = s.i, s.n), e)) : 95 == v ? (T = n(i, d++, (s = n(i, d, -3), d = s.i, s.n), e, !0), U = n(i, d++, (s = n(i, d, -3), d = s.i, s.n), e), T instanceof n.constructor ? n.apply.call(T, e[0].n, U) : (V = T[0][T[1]], T[0] instanceof n.g ? n.apply.call(V, e.n, U) : n.apply.call(V, T[0], U))) : void 0
|
||||
}
|
||||
k = d++, s = n(i, d, -3), d = s.i, q = s.n, x = d++, s = n(i, d, -3), d = s.i, z = s.n, A = d++, s = n(i, d, -3), d = s.i, B = s.n;
|
||||
try {
|
||||
if (D = n(i, k, q, e), e.a) return D
|
||||
} catch (W) {
|
||||
if (e.u = W, E = n(i, x, z, e), e.a) return E
|
||||
} finally {
|
||||
if (G = e.a, e.a = !1, H = n(i, A, B, e), e.a) return H;
|
||||
e.a = G
|
||||
}
|
||||
}
|
||||
})([6, 198, 8, 10, 195, 8, 80, 192, 8, 30, 252, 7, 30, 249, 7, 88, 154, 1, 57, 127, 34, 0, 78, 111, 67, 2, 91, 0, 78, 97, 67, 2, 91, 0, 95, 84, 78, 42, 67, 2, 91, 0, 18, 8, 0, 6, 79, 98, 106, 101, 99, 116, 18, 26, 0, 24, 103, 101, 116, 79, 119, 110, 80, 114, 111, 112, 101, 114, 116, 121, 68, 101, 115, 99, 114, 105, 112, 116, 111, 114, 29, 38, 78, 28, 67, 2, 91, 0, 18, 10, 0, 8, 100, 111, 99, 117, 109, 101, 110, 116, 18, 10, 0, 8, 108, 111, 99, 97, 116, 105, 111, 110, 113, 6, 0, 4, 104, 114, 101, 102, 18, 5, 0, 3, 103, 101, 116, 18, 6, 0, 4, 110, 97, 109, 101, 113, 10, 0, 8, 103, 101, 116, 32, 104, 114, 101, 102, 30, 21, 30, 19, 125, 17, 25, 15, 18, 7, 0, 5, 69, 114, 114, 111, 114, 29, 4, 113, 2, 0, 0, 58, 0, 88, 154, 1, 57, 127, 34, 0, 78, 111, 67, 2, 91, 0, 78, 97, 67, 2, 91, 0, 95, 84, 78, 42, 67, 2, 91, 0, 18, 8, 0, 6, 79, 98, 106, 101, 99, 116, 18, 26, 0, 24, 103, 101, 116, 79, 119, 110, 80, 114, 111, 112, 101, 114, 116, 121, 68, 101, 115, 99, 114, 105, 112, 116, 111, 114, 29, 38, 78, 28, 67, 2, 91, 0, 18, 10, 0, 8, 100, 111, 99, 117, 109, 101, 110, 116, 18, 10, 0, 8, 108, 111, 99, 97, 116, 105, 111, 110, 113, 6, 0, 4, 104, 97, 115, 104, 18, 5, 0, 3, 103, 101, 116, 18, 6, 0, 4, 110, 97, 109, 101, 113, 10, 0, 8, 103, 101, 116, 32, 104, 97, 115, 104, 30, 21, 30, 19, 125, 17, 25, 15, 18, 7, 0, 5, 69, 114, 114, 111, 114, 29, 4, 113, 2, 0, 0, 58, 0, 88, 154, 1, 57, 127, 34, 0, 78, 111, 67, 2, 91, 0, 78, 97, 67, 2, 91, 0, 95, 84, 78, 42, 67, 2, 91, 0, 18, 8, 0, 6, 79, 98, 106, 101, 99, 116, 18, 26, 0, 24, 103, 101, 116, 79, 119, 110, 80, 114, 111, 112, 101, 114, 116, 121, 68, 101, 115, 99, 114, 105, 112, 116, 111, 114, 29, 38, 78, 28, 67, 2, 91, 0, 18, 10, 0, 8, 100, 111, 99, 117, 109, 101, 110, 116, 18, 10, 0, 8, 108, 111, 99, 97, 116, 105, 111, 110, 113, 6, 0, 4, 104, 111, 115, 116, 18, 5, 0, 3, 103, 101, 116, 18, 6, 0, 4, 110, 97, 109, 101, 113, 10, 0, 8, 103, 101, 116, 32, 104, 111, 115, 116, 30, 21, 30, 19, 125, 17, 25, 15, 18, 7, 0, 5, 69, 114, 114, 111, 114, 29, 4, 113, 2, 0, 0, 58, 0, 88, 163, 1, 57, 135, 1, 34, 0, 78, 115, 67, 2, 91, 0, 78, 101, 67, 2, 91, 0, 95, 88, 78, 42, 67, 2, 91, 0, 18, 8, 0, 6, 79, 98, 106, 101, 99, 116, 18, 26, 0, 24, 103, 101, 116, 79, 119, 110, 80, 114, 111, 112, 101, 114, 116, 121, 68, 101, 115, 99, 114, 105, 112, 116, 111, 114, 29, 42, 78, 28, 67, 2, 91, 0, 18, 10, 0, 8, 100, 111, 99, 117, 109, 101, 110, 116, 18, 10, 0, 8, 108, 111, 99, 97, 116, 105, 111, 110, 113, 10, 0, 8, 112, 114, 111, 116, 111, 99, 111, 108, 18, 5, 0, 3, 103, 101, 116, 18, 6, 0, 4, 110, 97, 109, 101, 113, 14, 0, 12, 103, 101, 116, 32, 112, 114, 111, 116, 111, 99, 111, 108, 30, 21, 30, 19, 125, 17, 25, 15, 18, 7, 0, 5, 69, 114, 114, 111, 114, 29, 4, 113, 2, 0, 0, 58, 0, 88, 159, 1, 57, 131, 1, 34, 0, 78, 113, 67, 2, 91, 0, 78, 99, 67, 2, 91, 0, 95, 86, 78, 42, 67, 2, 91, 0, 18, 8, 0, 6, 79, 98, 106, 101, 99, 116, 18, 26, 0, 24, 103, 101, 116, 79, 119, 110, 80, 114, 111, 112, 101, 114, 116, 121, 68, 101, 115, 99, 114, 105, 112, 116, 111, 114, 29, 40, 78, 28, 67, 2, 91, 0, 18, 10, 0, 8, 100, 111, 99, 117, 109, 101, 110, 116, 18, 10, 0, 8, 108, 111, 99, 97, 116, 105, 111, 110, 113, 8, 0, 6, 111, 114, 105, 103, 105, 110, 18, 5, 0, 3, 103, 101, 116, 18, 6, 0, 4, 110, 97, 109, 101, 113, 12, 0, 10, 103, 101, 116, 32, 111, 114, 105, 103, 105, 110, 30, 21, 30, 19, 125, 17, 25, 15, 18, 7, 0, 5, 69, 114, 114, 111, 114, 29, 4, 113, 2, 0, 0, 58, 0, 88, 163, 1, 57, 135, 1, 34, 0, 78, 115, 67, 2, 91, 0, 78, 101, 67, 2, 91, 0, 95, 88, 78, 42, 67, 2, 91, 0, 18, 8, 0, 6, 79, 98, 106, 101, 99, 116, 18, 26, 0, 24, 103, 101, 116, 79, 119, 110, 80, 114, 111, 112, 101, 114, 116, 121, 68, 101, 115, 99, 114, 105, 112, 116, 111, 114, 29, 42, 78, 28, 67, 2, 91, 0, 18, 10, 0, 8, 100, 111, 99, 117, 109, 101, 110, 116, 18, 10, 0, 8, 108, 111, 99, 97, 116, 105, 111, 110, 113, 10, 0, 8, 104, 111, 115, 116, 110, 97, 109, 101, 18, 5, 0, 3, 103, 101, 116, 18, 6, 0, 4, 110, 97, 109, 101, 113, 14, 0, 12, 103, 101, 116, 32, 104, 111, 115, 116, 110, 97, 109, 101, 30, 21, 30, 19, 125, 17, 25, 15, 18, 7, 0, 5, 69, 114, 114, 111, 114, 29, 4, 113, 2, 0, 0, 58, 0, 89, 50, 95, 48, 78, 22, 67, 2, 91, 0, 18, 9, 0, 7, 99, 111, 110, 115, 111, 108, 101, 18, 5, 0, 3, 108, 111, 103, 29, 22, 113, 20, 0, 6, 175, 231, 1, 131, 177, 1, 161, 208, 1, 140, 181, 2, 144, 196, 1, 159, 165, 1, 0, 61, 18, 3, 0, 1, 101, 30, 54, 30, 52, 89, 50, 95, 48, 78, 22, 67, 2, 91, 0, 18, 9, 0, 7, 99, 111, 110, 115, 111, 108, 101, 18, 5, 0, 3, 108, 111, 103, 29, 22, 113, 20, 0, 6, 175, 231, 1, 131, 177, 1, 161, 208, 1, 140, 181, 2, 177, 178, 1, 165, 154, 2, 58, 0]);
|
File diff suppressed because one or more lines are too long
@ -1,11 +0,0 @@
|
||||
<body id="oldBodyElement"></body>
|
||||
|
||||
|
||||
|
||||
alert(document.body.id); // "oldBodyElement"
|
||||
|
||||
var aNewBodyElement = document.createElement("body");
|
||||
|
||||
aNewBodyElement.id = "newBodyElement";
|
||||
document.body = aNewBodyElement;
|
||||
alert(document.body.id); // "newBodyElement"
|
@ -1,57 +0,0 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<title>getElementsByTagName example</title>
|
||||
</head>
|
||||
<body style="border: solid green 3px">
|
||||
<p>Some outer text</p>
|
||||
<p>Some outer text</p>
|
||||
|
||||
<div id="div1" style="border: solid blue 3px">
|
||||
<p>Some div1 text</p>
|
||||
<p>Some div1 text</p>
|
||||
<p>Some div1 text</p>
|
||||
|
||||
<div id="div2" style="border: solid red 3px">
|
||||
<p>Some div2 text</p>
|
||||
<p>Some div2 text</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p>Some outer text</p>
|
||||
<p>Some outer text</p>
|
||||
|
||||
<button onclick="getAllParaElems();">
|
||||
show all p elements in document</button><br />
|
||||
|
||||
<button onclick="div1ParaElems();">
|
||||
show all p elements in div1 element</button><br />
|
||||
|
||||
<button onclick="div2ParaElems();">
|
||||
show all p elements in div2 element</button>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
`
|
||||
<script>
|
||||
function getAllParaElems() {
|
||||
var allParas = document.getElementsByTagName("p");
|
||||
var num = allParas.length;
|
||||
alert("There are " + num + " paragraph in this document");
|
||||
}
|
||||
|
||||
function div1ParaElems() {
|
||||
var div1 = document.getElementById("div1");
|
||||
var div1Paras = div1.getElementsByTagName("p");
|
||||
var num = div1Paras.length;
|
||||
alert("There are " + num + " paragraph in #div1");
|
||||
}
|
||||
|
||||
function div2ParaElems() {
|
||||
var div2 = document.getElementById("div2");
|
||||
var div2Paras = div2.getElementsByTagName("p");
|
||||
var num = div2Paras.length;
|
||||
alert("There are " + num + " paragraph in #div2");
|
||||
}
|
||||
</script>`
|
@ -1,21 +0,0 @@
|
||||
<html>
|
||||
<body>
|
||||
|
||||
<div id="parent-id">
|
||||
<p>hello world 1</p>
|
||||
<p class="test">hello world 2</p>
|
||||
<p>hello world 3</p>
|
||||
<p>hello world 4</p>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
var parentDOM = document.getElementById("parent-id");
|
||||
|
||||
var test = parentDOM.getElementsByClassName("test"); // 匹配类名的元素集合,不是元素本身
|
||||
console.log(test); //HTMLCollection[1]
|
||||
|
||||
var testTarget = parentDOM.getElementsByClassName("test")[0]; // 我们想要取到的第一个元素
|
||||
console.log(testTarget); //<p class="test">hello world 2</p>
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
File diff suppressed because one or more lines are too long
@ -1,29 +0,0 @@
|
||||
// <!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title></title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="bb">
|
||||
<div class="box1"></div>
|
||||
<div class="box">
|
||||
<p title="hhhh">第1</p>
|
||||
<p dataId="2">第2</p>
|
||||
<p>第3</p>
|
||||
<p>第4</p>
|
||||
</div>
|
||||
<div class="box2"></div>
|
||||
</div>
|
||||
<script
|
||||
type="text/javascript"> ;
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
console.log(pp.parentNode);
|
||||
console.log(pp.parentElement);
|
||||
console.log(pp.parentElement.parentElement.parentElement.parentElement.nodeName); //报错:000.html:37 Uncaught TypeError: Cannot read property 'nodeName' of null
|
||||
console.log(pp.parentNode.parentNode.parentNode.parentNode.nodeName);// #document
|
||||
|
||||
|
@ -1,3 +0,0 @@
|
||||
navigator.getBattery()
|
||||
StorageManager.prototype.estimate()
|
||||
navigator.storage.estimate()
|
@ -1,23 +0,0 @@
|
||||
// <!--Sample HTML code-->
|
||||
<div id="top" align="center"> </div>
|
||||
|
||||
{/* <script type="text/javascript"> */}
|
||||
var top = document.getElementById("top");
|
||||
var nested = document.getElementById("nested");
|
||||
var garbage = top.removeChild(nested);
|
||||
//Test Case 2: the method throws the exception (2)
|
||||
{/* </script> */}
|
||||
|
||||
// <!--Sample HTML code-->
|
||||
<div id="top" align="center">
|
||||
<div id="nested"></div>
|
||||
</div>
|
||||
|
||||
{/* <script type="text/javascript"> */}
|
||||
var top = document.getElementById("top");
|
||||
var nested = document.getElementById("nested");
|
||||
var garbage = top.removeChild(nested);
|
||||
// This first call remove correctly the node
|
||||
garbage = top.removeChild(nested);
|
||||
// Test Case 1: the method in the second call here, throws the exception (1)
|
||||
// </script>
|
File diff suppressed because one or more lines are too long
@ -1,8 +0,0 @@
|
||||
console.log(top==window)
|
||||
console.log(top==parent)
|
||||
|
||||
console.log(top.self==window)
|
||||
console.log(top.self.window==window.top.self)
|
||||
console.log(self.window.top==top.window.self);
|
||||
console.log(self.window.top.self.top==top.window.self);
|
||||
console.log(self.window.top.self.top==top.window.self.window);
|
File diff suppressed because one or more lines are too long
@ -1,111 +0,0 @@
|
||||
//WindowProperties 删除构造方法
|
||||
delete WindowProperties.prototype.constructor;
|
||||
|
||||
|
||||
|
||||
//代理失效
|
||||
var window_=this; 底下用window_
|
||||
|
||||
//两个都需要补
|
||||
Object.getOwnPropertyDescriptors(Window)
|
||||
Object.getOwnPropertyDescriptors(Window.prototype)
|
||||
|
||||
//location检测
|
||||
|
||||
//代理检测
|
||||
// self=window;
|
||||
// top=window
|
||||
// window==self ; ///true
|
||||
// window =new Proxy(window,{});
|
||||
// window==self;//false
|
||||
|
||||
//需要连续赋值,可以过代理检测
|
||||
// top=self=window=new Proxy(window,{})
|
||||
|
||||
|
||||
|
||||
//解决重复代理
|
||||
bodavm.memory.symbolProxy=Symbol("proxy") //独一无二的属性,标记是否代理
|
||||
if (bodavm.memory.symbolProxy in obj){
|
||||
return obj
|
||||
}
|
||||
//解决重复代理
|
||||
Object.defineProperty(obj,bodavm.memory.symbolProxy,{
|
||||
configurable:false,
|
||||
enumerable:false,
|
||||
writable:false,
|
||||
value:true
|
||||
})
|
||||
|
||||
|
||||
|
||||
|
||||
//代理失效 ,代理的对象没有被代理上
|
||||
console.log(document.createElement===document.createElement)
|
||||
|
||||
|
||||
|
||||
|
||||
//实现Document.prototype.activeElement()调用报错
|
||||
if(Object.getOwnPropertyDescriptor(obj,"constructor")!==undefined){
|
||||
if (Object.getOwnPropertyDescriptor(self,"constructor") !==undefined){
|
||||
return bodavm.toolsFunc.throwError("TypeError","Illegal invocation")
|
||||
}
|
||||
}
|
||||
|
||||
//过滤bodavm.memory.symbolProxy与"eval"
|
||||
|
||||
|
||||
//node环境和vm2环境中的监测点过滤
|
||||
// 删除浏览器中不存在的对象
|
||||
delete global;
|
||||
delete GLOBAL;
|
||||
delete VMError;
|
||||
delete Buffer;
|
||||
delete WindowProperties
|
||||
delete process;
|
||||
delete root;
|
||||
|
||||
|
||||
//在原型对象上不能通过原型对象获取,不在自身上可以通过自身获取
|
||||
a=document.createElement("div")
|
||||
a.align=123
|
||||
Object.getOwnPropertyDescriptors(a,'align')
|
||||
|
||||
|
||||
|
||||
//鼠标轨迹
|
||||
|
||||
|
||||
//检测点
|
||||
function test(){}
|
||||
Object.getOwnPropertyDescriptor(window,'test')
|
||||
|
||||
|
||||
|
||||
//
|
||||
var r={}
|
||||
r.__proto__=document
|
||||
r.location
|
||||
|
||||
var b={}
|
||||
b=Screen.prototype
|
||||
b.width
|
||||
var b={}
|
||||
b.__proto__=Screen.prototype
|
||||
b.width
|
||||
|
||||
|
||||
//document.all
|
||||
|
||||
|
||||
|
||||
//window.length iframe
|
||||
|
||||
|
||||
|
||||
// JSON.stringify(console)
|
||||
|
||||
|
||||
|
||||
"FSSBBIl1UgzbN7N80T=4B.zKNh3jQsKMZLAyeqQs7QJwaZPeSafzY3KH2cdc0RyVUYgsIPrb_buCwzg59VBqHJbjQAXky9B_J5am_szA1nWrHhagAii3e0x52q2c0st02n4qjdiGKI_Q5W2b2xEaLujGn0notNXB0uevYFRYKwQ0R.naBqJsjWQK8SQD9HVg8kzNCXC0W1OLMLWFS4AGvo2i_BMtcTi.IyV2X5xsDcz9;"
|
File diff suppressed because one or more lines are too long
@ -1,36 +0,0 @@
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<title>浏览器事件补齐</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="testDiv" style="width: 100px;height: 100px;background-color: red">
|
||||
|
||||
</div>
|
||||
</body>
|
||||
<script>
|
||||
window.addEventListener("load", function (event) {
|
||||
debugger
|
||||
let span = document.createElement("span");
|
||||
if (event.isTrusted) {
|
||||
span.id = "loadTest";
|
||||
span.innerText = "load事件触发";
|
||||
document.body.append(span);
|
||||
};
|
||||
});
|
||||
|
||||
|
||||
document.getElementById("testDiv").addEventListener("click", function (event) {
|
||||
|
||||
debugger
|
||||
if (event.isTrusted) {
|
||||
event.target.innerText = "testDiv被点击";
|
||||
};
|
||||
});
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
</html>
|
@ -1,943 +0,0 @@
|
||||
"<span style="font-family:mmllii;font-size:114px">mmmmmmmmmmmlliii</span>" offsetWidth :1327 offsetHeight:151
|
||||
|
||||
DFPhelvetica 1327 151
|
||||
|
||||
"Tibetan Machine Uni" 1327 151
|
||||
|
||||
Cooljazz 1327 151
|
||||
|
||||
Verdana 1376 139
|
||||
|
||||
Helvetica Neue LT Pro 35 Thin 1376 139
|
||||
|
||||
tahoma 1184 137
|
||||
|
||||
"LG Smart_H test Regular" 1327 151
|
||||
|
||||
DINPro-light 1327 151
|
||||
|
||||
DINPro-light 1327 151
|
||||
|
||||
HelveM_India 1327 151
|
||||
|
||||
"SECRobotoLight Bold" 1327 151
|
||||
|
||||
"OR Mohanty Unicode Regular" 1327 151
|
||||
|
||||
"Droid Sans Thai" 1327 151
|
||||
|
||||
"Kannada Sangam MN" 1327 151
|
||||
|
||||
"DDC Uchen" 1327 151
|
||||
|
||||
"DDC Uchen" 1327 151
|
||||
|
||||
SamsungKannadaRegular 1327 151
|
||||
|
||||
"MI LANTING Bold" 1327 151
|
||||
|
||||
"SamsungSansNum3L Light" 1327 151
|
||||
|
||||
verdana 1376 139
|
||||
|
||||
HelveticaNeueThin 1327 151
|
||||
|
||||
SECFallback 1327 151
|
||||
|
||||
SamsungEmoji 1327 151
|
||||
|
||||
"Telugu Sangam MN" 1327 151
|
||||
|
||||
"Carrois Gothic SC" 1327 151
|
||||
|
||||
"Flyme Light Roboto Light" 1327 151
|
||||
|
||||
"SoMA-Digit Light" 1327 151
|
||||
|
||||
"SoMC Sans Regular" 1327 151
|
||||
|
||||
HYXiYuanJ 1327 151
|
||||
|
||||
sst 1327 151
|
||||
|
||||
samsung-sans-num4T 1327 151
|
||||
|
||||
gm_mengmeng 1327 151
|
||||
|
||||
"Lohit Kannada" 1327 151
|
||||
|
||||
"times new roman" 1134 126
|
||||
|
||||
samsung-sans-num4L 1327 151
|
||||
|
||||
serif-monospace 1327 151
|
||||
|
||||
"SamsungSansNum-3T Thin" 1327 151
|
||||
|
||||
ColorOSUI-XThin 1327 151
|
||||
|
||||
"Droid Naskh Shift Alt" 1327 151
|
||||
|
||||
SamsungTeluguRegular 1327 151
|
||||
|
||||
"Bengali OTS" 1327 151
|
||||
|
||||
"MI LanTing_GB Outside YS" 1327 151
|
||||
|
||||
FZMiaoWu_GB18030 1327 151
|
||||
|
||||
helve-neue-regular 1327 151
|
||||
|
||||
"SST Medium" 1327 151
|
||||
|
||||
"Courier New" 1095 129
|
||||
|
||||
"Khmer Mondulkiri Bold" 1327 151
|
||||
|
||||
"Khmer Mondulkiri Bold" 1327 151
|
||||
|
||||
"Khmer Mondulkiri Bold" 1327 151
|
||||
|
||||
"Roboto Medium" 1327 151
|
||||
|
||||
"Droid Sans Bold" 1327 151
|
||||
|
||||
goudy 1327 151
|
||||
|
||||
sans-serif-condensed-light 1327 151
|
||||
|
||||
SFinder 1327 151
|
||||
|
||||
noto-sans-cjk-medium 1327 151
|
||||
|
||||
miui 1327 151
|
||||
|
||||
"MRocky PRC Bold" 1327 151
|
||||
|
||||
"AndroidClock Regular" 1327 151
|
||||
|
||||
"SamsungSansNum-4L Light" 1327 151
|
||||
|
||||
sans-serif-thin 1327 151
|
||||
|
||||
AaPangYaer 1327 151
|
||||
|
||||
casual 1327 151
|
||||
|
||||
"BN MohantyOT Bold" 1327 151
|
||||
|
||||
x-sst 1327 151
|
||||
|
||||
NotoSansMyanmarZawgyi 1327 151
|
||||
|
||||
NotoSansMyanmarZawgyi 1327 151
|
||||
|
||||
"AshleyScriptMT Alt" 1327 151
|
||||
|
||||
"Noto Sans Devanagari UI" 1327 151
|
||||
|
||||
"Roboto Condensed Bold" 1327 151
|
||||
|
||||
"Roboto Medium Italic" 1327 151
|
||||
|
||||
miuiex 1327 151
|
||||
|
||||
"Noto Sans Gurmukhi UI" 1327 151
|
||||
|
||||
"SST Vietnamese Light" 1327 151
|
||||
|
||||
LG_Oriya 1327 151
|
||||
|
||||
hycoffee 1327 151
|
||||
|
||||
x-sst-ultralight 1327 151
|
||||
|
||||
DFHeiAW7-A 1327 151
|
||||
|
||||
FZZWXBTOT_Unicode 1327 151
|
||||
|
||||
"Devanagari Sangam MN Bold" 1327 151
|
||||
|
||||
sans-serif-monospace 1327 151
|
||||
|
||||
"Padauk Book Bold" 1327 151
|
||||
|
||||
"Padauk Book Bold" 1327 151
|
||||
|
||||
"Padauk Book Bold" 1327 151
|
||||
|
||||
"Padauk Book Bold" 1327 151
|
||||
|
||||
"Microsoft Himalaya" 759 114
|
||||
|
||||
SamsungSansFallback 1327 151
|
||||
|
||||
"SST Medium Italic" 1327 151
|
||||
|
||||
AndroidEmoji 1327 151
|
||||
|
||||
SamsungSansNum-3R 1327 151
|
||||
|
||||
"ITC Stone Serif" 1327 151
|
||||
|
||||
sans-serif-smallcaps 1327 151
|
||||
|
||||
x-sst-medium 1327 151
|
||||
|
||||
LG_Sinhalese 1327 151
|
||||
|
||||
"Roboto Thin Italic" 1327 151
|
||||
|
||||
century-gothic 1327 151
|
||||
|
||||
Clockopia 1327 151
|
||||
|
||||
Luminous_Sans 1327 151
|
||||
|
||||
"Floridian Script Alt" 1327 151
|
||||
|
||||
"Noto Sans Gurmukhi Bold" 1327 151
|
||||
|
||||
"LTHYSZK Bold" 1327 151
|
||||
|
||||
GS_Thai 1327 151
|
||||
|
||||
SamsungNeoNum_3T_2 1327 151
|
||||
|
||||
Arabic 1327 151
|
||||
|
||||
hans-sans-normal 1327 151
|
||||
|
||||
"Lohit Telugu" 1327 151
|
||||
|
||||
"HYQiHei-50S Light" 1327 151
|
||||
|
||||
"Lindsey for Samsung" 1327 151
|
||||
|
||||
"AR Crystalhei DB" 1327 151
|
||||
|
||||
"Samsung Sans Medium" 1327 151
|
||||
|
||||
samsung-sans-num45 1327 151
|
||||
|
||||
hans-sans-bold 1327 151
|
||||
|
||||
Luminous_Script 1327 151
|
||||
|
||||
"SST Condensed" 1327 151
|
||||
|
||||
SamsungDevanagariRegular 1327 151
|
||||
|
||||
"Anjal Malayalam MN" 1327 151
|
||||
|
||||
"Anjal Malayalam MN" 1327 151
|
||||
|
||||
FZLanTingHei-M-GB18030 1327 151
|
||||
|
||||
"Hebrew OTS" 1327 151
|
||||
|
||||
"Hebrew OTS" 1327 151
|
||||
|
||||
"Samsung Sans Light" 1327 151
|
||||
|
||||
"Choco cooky" 1327 151
|
||||
|
||||
helve-neue-thin 1327 151
|
||||
|
||||
"PN MohantyOT Medium" 1327 151
|
||||
|
||||
"PN MohantyOT Medium" 1327 151
|
||||
|
||||
"Droid Serif" 1327 151
|
||||
|
||||
SamsungSinhalaRegular 1327 151
|
||||
|
||||
helvetica 1171 127
|
||||
|
||||
LG-FZKaTong-M19-V2.2 1171 127
|
||||
|
||||
"Noto Sans Devanagari UI Bold" 1327 151
|
||||
|
||||
"SST Light" 1327 151
|
||||
|
||||
DFPEmoji 1327 151
|
||||
|
||||
"weatherfontnew Regular" 1327 151
|
||||
|
||||
RobotoNum3R 1327 151
|
||||
|
||||
DINPro-medium 1327 151
|
||||
|
||||
"Samsung Sans Num55" 1327 151
|
||||
|
||||
"SST Heavy Italic" 1327 151
|
||||
|
||||
"LGlock4 Regular_0805" 1327 151
|
||||
|
||||
Georgia 1270 129
|
||||
|
||||
noto-sans-cjk 1327 151
|
||||
|
||||
"Telugu Sangam MN Bold" 1327 151
|
||||
|
||||
"MIUI EX Normal" 1327 151
|
||||
|
||||
"HYQiHei-75S Bold" 1327 151
|
||||
|
||||
"NotoSansMyanmarZawgyi Bold" 1327 151
|
||||
|
||||
yunospro-black 1327 151
|
||||
|
||||
helve-neue-normal 1327 151
|
||||
|
||||
Luminous_Serif 1327 151
|
||||
|
||||
"TM MohantyOT Normal" 1327 151
|
||||
|
||||
"SamsungSansNum-3Lv Light" 1327 151
|
||||
|
||||
"Samsung Sans Num45" 1327 151
|
||||
|
||||
"SmartGothic Medium" 1327 151
|
||||
|
||||
georgia 1270 129
|
||||
|
||||
casual-font-type 1327 151
|
||||
|
||||
"Samsung Sans Bold" 1327 151
|
||||
|
||||
small-capitals 1327 151
|
||||
|
||||
"MFinance PRC Bold" 1327 151
|
||||
|
||||
FZLanTingHei_GB18030 1327 151
|
||||
|
||||
SamsungArmenian 1327 151
|
||||
|
||||
"Roboto Bold" 1327 151
|
||||
|
||||
century-gothic-bold 1327 151
|
||||
|
||||
x-sst-heavy 1327 151
|
||||
|
||||
"SST Light Italic" 1327 151
|
||||
|
||||
TharLon 1327 151
|
||||
|
||||
x-sst-light 1327 151
|
||||
|
||||
"Dinbol Regular" 1327 151
|
||||
|
||||
SamsungBengaliRegular 1327 151
|
||||
|
||||
"KN MohantyOTSmall Medium" 1327 151
|
||||
|
||||
hypure 1327 151
|
||||
|
||||
SamsungTamilRegular 1327 151
|
||||
|
||||
"Malayalam Sangam MN" 1327 151
|
||||
|
||||
"Noto Sans Kannada UI" 1327 151
|
||||
|
||||
helve-neue 1327 151
|
||||
|
||||
helve-neue 1327 151
|
||||
|
||||
"Noto Sans Kannada Bold" 1327 151
|
||||
|
||||
Sanpya 1327 151
|
||||
|
||||
SamsungPunjabiRegular 1327 151
|
||||
|
||||
samsung-sans-num4Lv 1327 151
|
||||
|
||||
LG_Kannada 1327 151
|
||||
|
||||
"Samsung Sans Regular" 1327 151
|
||||
|
||||
Zawgyi-One 1327 151
|
||||
|
||||
"Droid Serif Bold Italic" 1327 151
|
||||
|
||||
FZKATJW 1327 151
|
||||
|
||||
"courier new" 1095 129
|
||||
|
||||
SamsungEmojiRegular 1327 151
|
||||
|
||||
"MIUI EX Bold" 1327 151
|
||||
|
||||
"Android Emoji" 1327 151
|
||||
|
||||
"Noto Naskh Arabic UI" 1327 151
|
||||
|
||||
"LCD Com" 1327 151
|
||||
|
||||
"Futura Medium BT" 1327 151
|
||||
|
||||
Vivo-extract 1327 151
|
||||
|
||||
"Bangla Sangam MN Bold" 1327 151
|
||||
|
||||
hans-sans-regular 1327 151
|
||||
|
||||
SNum-3R 1327 151
|
||||
|
||||
SNum-3T 1327 151
|
||||
|
||||
hans-sans 1327 151
|
||||
|
||||
"SST Ultra Light" 1327 151
|
||||
|
||||
"Roboto Regular" 1327 151
|
||||
|
||||
"Roboto Light" 1327 151
|
||||
|
||||
Hanuman 1327 151
|
||||
|
||||
newlggothic 1327 151
|
||||
|
||||
DFHeiAW5-A 1327 151
|
||||
|
||||
hans-sans-light 1327 151
|
||||
|
||||
"Plate Gothic" 1327 151
|
||||
|
||||
SNum-3L 1327 151
|
||||
|
||||
SNum-3L 1327 151
|
||||
|
||||
"Myanmar Sangam Zawgyi Bold" 1327 151
|
||||
|
||||
lg-sans-serif-light 1327 151
|
||||
|
||||
"MIUI EX Light" 1327 151
|
||||
|
||||
"Roboto Thin" 1327 151
|
||||
|
||||
"SoMA Bold" 1327 151
|
||||
|
||||
Padauk 1327 151
|
||||
|
||||
"Samsung Sans" 1327 151
|
||||
|
||||
Spacious_SmallCap 1327 151
|
||||
|
||||
sans-serif 1327 151
|
||||
|
||||
"DV MohantyOT Medium" 1327 151
|
||||
|
||||
Stable_Slap 1327 151
|
||||
|
||||
monaco 1327 151
|
||||
|
||||
Flyme-Light 1327 151
|
||||
|
||||
fzzys-dospy 1327 151
|
||||
|
||||
ScreenSans 1327 151
|
||||
|
||||
clock2016 1327 151
|
||||
|
||||
"Roboto Condensed Bold Italic" 1327 151
|
||||
|
||||
Arial 1171 127
|
||||
|
||||
"KN Mohanty Medium" 1327 151
|
||||
|
||||
"MotoyaLMaru W3 mono" 1327 151
|
||||
|
||||
"Handset Condensed" 1327 151
|
||||
|
||||
"Roboto Italic" 1327 151
|
||||
|
||||
"HTC Hand" 1327 151
|
||||
|
||||
"SST Ultra Light Italic" 1327 151
|
||||
|
||||
"SST Vietnamese Roman" 1327 151
|
||||
|
||||
"Noto Naskh Arabic UI Bold" 1327 151
|
||||
|
||||
chnfzxh-medium 1327 151
|
||||
|
||||
SNumCond-3T 1327 151
|
||||
|
||||
century-gothic-regular 1327 151
|
||||
|
||||
default_roboto-light 1327 151
|
||||
|
||||
"Noto Sans Myanmar" 1327 151
|
||||
|
||||
"Myanmar Sangam MN" 1327 151
|
||||
|
||||
"Apple Color Emoji" 1327 151
|
||||
|
||||
weatherfontReg 1327 151
|
||||
|
||||
SamsungMalayalamRegular 1327 151
|
||||
|
||||
arial 1171 127
|
||||
|
||||
"Droid Serif Bold" 1327 151
|
||||
|
||||
"CPo3 PRC Bold" 1327 151
|
||||
|
||||
"MI LANTING" 1327 151
|
||||
|
||||
SamsungKorean-Regular 1327 151
|
||||
|
||||
"test45 Regular" 1327 151
|
||||
|
||||
spirit_time 1327 151
|
||||
|
||||
"Devanagari Sangam MN" 1327 151
|
||||
|
||||
ScreenSerif 1327 151
|
||||
|
||||
Roboto 1327 151
|
||||
|
||||
cursive-font-type 1327 151
|
||||
|
||||
STHeiti_vivo 1327 151
|
||||
|
||||
chnfzxh 1327 151
|
||||
|
||||
chnfzxh 1327 151
|
||||
|
||||
"Roboto Condensed Regular" 1327 151
|
||||
|
||||
samsung-neo-num3R 1327 151
|
||||
|
||||
"GJ MohantyOT Medium" 1327 151
|
||||
|
||||
"Chulho Neue Lock" 1327 151
|
||||
|
||||
roboto-num3L 1327 151
|
||||
|
||||
helve-neue-ultraLightextended 1327 151
|
||||
|
||||
SamsungOriyaRegular 1327 151
|
||||
|
||||
"SamsungSansNum-4Lv Light" 1327 151
|
||||
|
||||
MYingHei_18030_C2-Bold 1327 151
|
||||
|
||||
DFPShaoNvW5-GB 1327 151
|
||||
|
||||
"Roboto Black" 1327 151
|
||||
|
||||
helve-neue-ultralight 1327 151
|
||||
|
||||
gm_xihei 1327 151
|
||||
|
||||
"LGlock4 Light_0805" 1327 151
|
||||
|
||||
"Gujarati Sangam MN" 1327 151
|
||||
|
||||
"Malayalam Sangam MN Bold" 1327 151
|
||||
|
||||
roboto-num3R 1327 151
|
||||
|
||||
STXihei_vivo 1327 151
|
||||
|
||||
FZZhunYuan_GB18030 1327 151
|
||||
|
||||
noto-sans-cjk-light 1327 151
|
||||
|
||||
coloros 1327 151
|
||||
|
||||
"Noto Sans Gurmukhi" 1327 151
|
||||
|
||||
"Noto Sans Symbols" 1327 151
|
||||
|
||||
"Roboto Light Italic" 1327 151
|
||||
|
||||
"Lohit Tamil" 1327 151
|
||||
|
||||
cursive 912 114
|
||||
|
||||
default_roboto 1327 151
|
||||
|
||||
"BhashitaComplexSans Bold" 1327 151
|
||||
|
||||
"LG_Number_Roboto Thin" 1327 151
|
||||
|
||||
monospaced-without-serifs 1327 151
|
||||
|
||||
monospaced-without-serifs 1327 151
|
||||
|
||||
samsung-sans-num3LV 1327 151
|
||||
|
||||
DINPro 1327 151
|
||||
|
||||
Jomolhari 1327 151
|
||||
|
||||
sans-serif-light 1327 151
|
||||
|
||||
helve-neue-black 1327 151
|
||||
|
||||
"Lohit Bengali" 1327 151
|
||||
|
||||
"Myanmar Sangam Zawgyi" 1327 151
|
||||
|
||||
"Droid Serif Italic" 1327 151
|
||||
|
||||
"Roboto Bold Italic" 1327 151
|
||||
|
||||
NanumGothic 1327 151
|
||||
|
||||
"Sony Mobile UD Gothic Regular" 1327 151
|
||||
|
||||
"Georgia Bold Italic" 1327 151
|
||||
|
||||
samsung-sans-num3Lv 1327 151
|
||||
|
||||
yunos-thin 1327 151
|
||||
|
||||
samsung-neo-num3T-cond 1327 151
|
||||
|
||||
"Noto Sans Myanmar UI Bold" 1327 151
|
||||
|
||||
lgserif 1327 151
|
||||
|
||||
FZYouHei-R-GB18030 1327 151
|
||||
|
||||
"Lohit Punjabi" 1327 151
|
||||
|
||||
baskerville 1327 151
|
||||
|
||||
samsung-sans-num4Tv 1327 151
|
||||
|
||||
samsung-sans-thin 1327 151
|
||||
|
||||
"LG Emoji" 1327 151
|
||||
|
||||
AnjaliNewLipi 1327 151
|
||||
|
||||
"SamsungSansNum-4T Thin" 1327 151
|
||||
|
||||
SamsungKorean-Bold 1327 151
|
||||
|
||||
miuiex-light 1327 151
|
||||
|
||||
"Noto Sans Kannada" 1327 151
|
||||
|
||||
"Roboto Normal Italic" 1327 151
|
||||
|
||||
"Georgia Italic" 1327 151
|
||||
|
||||
sans-serif-medium 1327 151
|
||||
|
||||
"Smart Zawgyi" 1327 151
|
||||
|
||||
"Roboto Condensed Italic" 1327 151
|
||||
|
||||
"Noto Sans Kannada UI Bold" 1327 151
|
||||
|
||||
"DFP Sc Sans Heue30_103" 1327 151
|
||||
|
||||
"LG_Number_Roboto Bold" 1327 151
|
||||
|
||||
"Padauk Book" 1327 151
|
||||
|
||||
x-sst-condensed 1327 151
|
||||
|
||||
Sunshine-Uchen 1327 151
|
||||
|
||||
"Roboto Black Italic" 1327 151
|
||||
|
||||
"Ringo Color Emoji" 1327 151
|
||||
|
||||
"Devanagari OTS" 1327 151
|
||||
|
||||
"Smart Zawgyi Pro" 1327 151
|
||||
|
||||
FZLanTingHei-M-GBK 1327 151
|
||||
|
||||
"AndroidClock-Large Regular" 1327 151
|
||||
|
||||
proportionally-spaced-without-serifs 1327 151
|
||||
|
||||
"Cutive Mono" 1327 151
|
||||
|
||||
times 1134 126
|
||||
|
||||
"LG Smart_H test Bold" 1327 151
|
||||
|
||||
DINPro-Light 1327 151
|
||||
|
||||
sans-serif-black 1327 151
|
||||
|
||||
"Lohit Devanagari" 1327 151
|
||||
|
||||
proportionally-spaced-with-serifs 1327 151
|
||||
|
||||
samsung-sans-num3L 1327 151
|
||||
|
||||
"MYoung PRC Medium" 1327 151
|
||||
|
||||
DFGothicPW5-BIG5HK-SONY 1327 151
|
||||
|
||||
hans-sans-medium 1327 151
|
||||
|
||||
"SST Heavy" 1327 151
|
||||
|
||||
"SST Heavy" 1327 151
|
||||
|
||||
"MyanmarUNew Regular" 1327 151
|
||||
|
||||
"Noto Naskh Arabic Bold" 1327 151
|
||||
|
||||
SamsungGujarathiRegular 1327 151
|
||||
|
||||
fantasy 1123 139
|
||||
|
||||
helve-neue-light 1327 151
|
||||
|
||||
"Helvetica Neue OTS Bold" 1327 151
|
||||
|
||||
noto-sans-cjk-bold 1327 151
|
||||
|
||||
samsung-sans-num3R 1327 151
|
||||
|
||||
"Lindsey Samsung" 1327 151
|
||||
|
||||
samsung-sans-num3T 1327 151
|
||||
|
||||
ScreenSerifMono 1327 151
|
||||
|
||||
"ETrump Myanmar_ZW" 1327 151
|
||||
|
||||
helve-neue-thinextended 1327 151
|
||||
|
||||
"Noto Naskh Arabic" 1327 151
|
||||
|
||||
LG_Gujarati 1327 151
|
||||
|
||||
Smart_Monospaced 1327 151
|
||||
|
||||
"Tamil Sangam MN" 1327 151
|
||||
|
||||
"LG Emoji NonAME" 1327 151
|
||||
|
||||
"Roboto Condensed Light Italic" 1327 151
|
||||
|
||||
gm_jingkai 1327 151
|
||||
|
||||
FZLanTingKanHei_GB18030 1327 151
|
||||
|
||||
lgtravel 1327 151
|
||||
|
||||
palatino 1327 151
|
||||
|
||||
"Georgia Bold" 1327 151
|
||||
|
||||
"Droid Sans" 1327 151
|
||||
|
||||
LG_Punjabi 1327 151
|
||||
|
||||
"SmartGothic Bold" 1327 151
|
||||
|
||||
"Samsung Sans Thin" 1327 151
|
||||
|
||||
"SST Condensed Bold" 1327 151
|
||||
|
||||
Comics_Narrow 1327 151
|
||||
|
||||
courier 1095 129
|
||||
|
||||
"Oriya Sangam MN" 1327 151
|
||||
|
||||
helve-neue-lightextended 1327 151
|
||||
|
||||
FZLanTingHei-R-GB18030 1327 151
|
||||
|
||||
"AR CrystalheiHKSCS DB" 1327 151
|
||||
|
||||
serif 912 114
|
||||
|
||||
RTWSYueRoudGoG0v1-Regular 1327 151
|
||||
|
||||
MiaoWu_prev 1327 151
|
||||
|
||||
FZY1K 1327 151
|
||||
|
||||
"LG_Number_Roboto Regular" 1327 151
|
||||
|
||||
AndroidClock 1327 151
|
||||
|
||||
"SoMA Regular" 1327 151
|
||||
|
||||
"HYQiHei-40S Lightx" 1327 151
|
||||
|
||||
lg-sans-serif 1327 151
|
||||
|
||||
"Dancing Script Bold" 1327 151
|
||||
|
||||
"Dancing Script Bold" 1327 151
|
||||
|
||||
sec-roboto-light 1327 151
|
||||
|
||||
ColorOSUI-Regular 1327 151
|
||||
|
||||
"test Regular" 1327 151
|
||||
|
||||
"Tamil Sangam MN Bold" 1327 151
|
||||
|
||||
FZYingBiXingShu-S16 1327 151
|
||||
|
||||
"RobotoNum3L Light" 1327 151
|
||||
|
||||
monospaced-with-serifs 1327 151
|
||||
|
||||
samsung-sans-num35 1327 151
|
||||
|
||||
"Cool jazz" 1327 151
|
||||
|
||||
SamsungNeoNum-3L 1327 151
|
||||
|
||||
STXingkai 1327 151
|
||||
|
||||
ScreenSansMono 1327 151
|
||||
|
||||
DFPWaWaW5-GB 1327 151
|
||||
|
||||
"SamsungSansNum-3L Light" 1327 151
|
||||
|
||||
"Bangla Sangam MN" 1327 151
|
||||
|
||||
"Gurmukhi Sangam MN" 1327 151
|
||||
|
||||
SECRobotoLight 1327 151
|
||||
|
||||
hyfonxrain 1327 151
|
||||
|
||||
MYingHeiGB18030C-Bold 1327 151
|
||||
|
||||
samsung-sans-light 1327 151
|
||||
|
||||
samsung-sans-light 1327 151
|
||||
|
||||
"Droid Sans Fallback" 1327 151
|
||||
|
||||
"Roboto Test1 Bold" 1327 151
|
||||
|
||||
"Noto Sans Myanmar Bold" 1327 151
|
||||
|
||||
sans-serif-condensed-custom 1327 151
|
||||
|
||||
SamsungNeoNum-3T 1327 151
|
||||
|
||||
"Samsung Sans Num35" 1327 151
|
||||
|
||||
monospace 912 114
|
||||
|
||||
"TL Mohanty Medium" 1327 151
|
||||
|
||||
helve-neue-medium 1327 151
|
||||
|
||||
LTHYSZK 1327 151
|
||||
|
||||
"Roboto Condensed custome Bold" 1327 151
|
||||
|
||||
Myanmar3 1327 151
|
||||
|
||||
"Droid Sans Devanagari" 1327 151
|
||||
|
||||
ShaoNv_prev 1327 151
|
||||
|
||||
samsung-neo-num3L 1327 151
|
||||
|
||||
FZLanTingHei-EL-GBK 1327 151
|
||||
|
||||
yunos 1327 151
|
||||
|
||||
samsung-neo-num3T 1327 151
|
||||
|
||||
"Times New Roman" 1134 126
|
||||
|
||||
helve-neue-bold 1327 151
|
||||
|
||||
noto-sans-cjk-regular 1327 151
|
||||
|
||||
"Noto Sans Gurmukhi UI Bold" 1327 151
|
||||
|
||||
DINPro-black 1327 151
|
||||
|
||||
FZLanTingHei-EL-GB18030 1327 151
|
||||
|
||||
"SST Vietnamese Medium" 1327 151
|
||||
|
||||
"Roboto Condensed Light" 1327 151
|
||||
|
||||
"SST Vietnamese Bold" 1327 151
|
||||
|
||||
"AR DJ-KK" 1327 151
|
||||
|
||||
"Droid Sans SEMC" 1327 151
|
||||
|
||||
"Noto Sans Myanmar UI" 1327 151
|
||||
|
||||
"Coming Soon" 1327 151
|
||||
|
||||
"MYuppy PRC Medium" 1327 151
|
||||
|
||||
Rosemary 1327 151
|
||||
|
||||
"Lohit Gujarati" 1327 151
|
||||
|
||||
"Roboto Condensed custom Bold" 1327 151
|
||||
|
||||
FZLanTingHeiS-R-GB 1327 151
|
||||
|
||||
"Helvetica Neue OTS" 1327 151
|
||||
|
||||
Kaiti_prev 1327 151
|
||||
|
||||
Roboto-BigClock 1327 151
|
||||
|
||||
FZYBKSJW 1327 151
|
||||
|
||||
"Handset Condensed Bold" 1327 151
|
||||
|
||||
SamsungGeorgian 1327 151
|
||||
|
||||
"Dancing Script" 1327 151
|
||||
|
||||
sans-serif-condensed 1327 151
|
||||
|
||||
hans-sans-thin 1327 151
|
||||
|
||||
"SamsungSansNum-4Tv Thin" 1327 151
|
||||
|
||||
"Lohit Odia" 1327 151
|
||||
|
||||
BhashitaComplexSans 1327 151
|
||||
|
||||
|
||||
|
||||
|
||||
//最后生成的可识别列表
|
||||
0: "Verdana"
|
||||
1: "Helvetica Neue LT Pro 35 Thin"
|
||||
2: "tahoma"
|
||||
3: "verdana"
|
||||
4: "times new roman"
|
||||
5: "Courier New"
|
||||
6: "Microsoft Himalaya"
|
||||
7: "helvetica"
|
||||
8: "LG-FZKaTong-M19-V2.2"
|
||||
9: "Georgia"
|
||||
10: "georgia"
|
||||
11: "courier new"
|
||||
12: "Arial"
|
||||
13: "arial"
|
||||
14: "cursive"
|
||||
15: "times"
|
||||
16: "fantasy"
|
||||
17: "courier"
|
||||
18: "serif"
|
||||
19: "monospace"
|
||||
20: "Times New Roman"
|
@ -17,7 +17,7 @@
|
||||
}
|
||||
}
|
||||
log += "\r\n"
|
||||
bofs.appendFileSync(`D:/My_Dir/env_xbb_lastest_cheerio/run/log.txt`, log)
|
||||
bofs.appendFileSync(`./env_xbb_lastest_cheerio/run/log.txt`, log)
|
||||
}
|
||||
//hook console,让他自动调用printlog
|
||||
console.log_ = console.log;
|
||||
|
@ -1,204 +0,0 @@
|
||||
bodavm.toolsFunc.HTMLParser = function HTMLParser(data) {
|
||||
let data_=data
|
||||
data=data.replace(/<!-[\s\S]*?-->/g,'').replace(/\/\/[\s\S]*?\n/g,'')
|
||||
// debugger
|
||||
let tempdata;
|
||||
if(data.length <1){
|
||||
tempdata=data_
|
||||
}
|
||||
// debugger
|
||||
// 最外层模拟的节点
|
||||
const nodeType = {
|
||||
TEXT: 'text',
|
||||
ELEMENT: 'element',
|
||||
};
|
||||
// 最外层增加一个模拟的根节点标签
|
||||
const frameflag = 'rootnode';
|
||||
// 计算一个完整标签的范围,eg. [0, 50]
|
||||
const createRange = (startPos, endPos) => {
|
||||
// 因为最外层模拟了 <rootnode>,所以需要将这部分长度减掉
|
||||
const frameFlagOffset = frameflag.length + 2;
|
||||
return [startPos - frameFlagOffset, endPos - frameFlagOffset]
|
||||
};
|
||||
|
||||
const root = {
|
||||
_tagName: '#document',
|
||||
_children: [],
|
||||
_idelements: {},
|
||||
_className: {},
|
||||
_tagelements: {},
|
||||
_innerHtml:[]
|
||||
};
|
||||
|
||||
// 设置 root 为父节点
|
||||
let currentParent = root;
|
||||
// 栈管理
|
||||
const stack = [root];
|
||||
let lastTextPos = -1;
|
||||
|
||||
// 找到数组的最后一项
|
||||
function arrBack(arr) {
|
||||
return arr[arr.length - 1];
|
||||
}
|
||||
|
||||
// ...开始遍历 /解析
|
||||
|
||||
|
||||
// 将模拟的根节点和需要解析的 html 拼接
|
||||
data = `<${frameflag}>${data}</${frameflag}>`;
|
||||
|
||||
const kMarkupPattern = /<(\/?)([a-zA-Z][-.:0-9_a-zA-Z]*)((?:\s+[^>]*?(?:(?:'[^']*')|(?:"[^"]*"))?)*)\s*(\/?)>/g;
|
||||
while ((match = kMarkupPattern.exec(data))) {
|
||||
/**
|
||||
* matchText: 匹配的字符 eg. <span id="xxx">
|
||||
* leadingSlash: 是否为闭合标签 eg. /
|
||||
* tagName: 标签名 eg. span
|
||||
* attributes: 属性 eg. id="xxx"
|
||||
* closingSlash: 是否为自闭合 eg. /
|
||||
*/
|
||||
let { 0: matchText, 1: leadingSlash, 2: tagName, 3: attributes, 4: closingSlash } = match;
|
||||
// 本次匹配到的字符串
|
||||
const matchLength = matchText.length;
|
||||
// 本次匹配的起始位置
|
||||
const tagStartPos = kMarkupPattern.lastIndex - matchLength;
|
||||
// 本次匹配的末尾位置
|
||||
const tagEndPos = kMarkupPattern.lastIndex;
|
||||
|
||||
if (lastTextPos > -1) {
|
||||
// 处理文本,eg. hello world
|
||||
// 上次匹配的末尾位置 + 本次匹配的字符长度 小于 本次匹配的末尾位置就说明中间有 text,这个稍微想下其实还是比较好理解的
|
||||
// 如果没有 text,lastTextPos + matchLength 都会等于 tagEndPos
|
||||
// 上次匹配的末尾位置到本次匹配的起始位置
|
||||
const text = data.substring(lastTextPos, tagStartPos);
|
||||
// if (text.indexOf('<!') == -1 || text.indexOf('->') == -1) {
|
||||
//过滤innerHTML中的特殊字符
|
||||
let text_filter = text.replace(/\n/g, '').replace(/\t/g, '')
|
||||
if (text_filter.length > 0) {
|
||||
currentParent._innerHtml.push({
|
||||
type: nodeType.TEXT,
|
||||
range: createRange(lastTextPos, tagStartPos),
|
||||
value: text_filter,
|
||||
});
|
||||
}
|
||||
|
||||
// }
|
||||
}else if(tempdata){
|
||||
currentParent._innerHtml.push({
|
||||
type: nodeType.TEXT,
|
||||
range: [0,0],
|
||||
value: tempdata,
|
||||
});
|
||||
tempdata=undefined
|
||||
}
|
||||
|
||||
|
||||
|
||||
// 记录上次匹配的位置
|
||||
lastTextPos = kMarkupPattern.lastIndex;
|
||||
|
||||
// 如果匹配到的标签是模拟标签,就跳过
|
||||
if (tagName === frameflag) continue;
|
||||
|
||||
// ...处理 nodeType 为 element 逻辑
|
||||
if (!leadingSlash) {
|
||||
const attrs = {};
|
||||
// 解析 id、class 属性,并且挂到 attrs 对象下
|
||||
const kAttributePattern = /(?:^|\s)(id|type|href|value|class|style|src|content|target|onClick|r|rel|name|http-equiv|charset)\s*=\s*((?:'[^']*')|(?:"[^"]*")|\S+)/gi;
|
||||
for (let attMatch; (attMatch = kAttributePattern.exec(attributes));) {
|
||||
const { 1: key, 2: val } = attMatch;
|
||||
// 属性值是否带引号
|
||||
const isQuoted = val[0] === `'` || val[0] === `"`;
|
||||
attrs[key.toLowerCase()] = isQuoted ? val.slice(1, val.length - 1) : val;
|
||||
|
||||
}
|
||||
|
||||
// debugger
|
||||
const currentNode = {
|
||||
_tagName: tagName,
|
||||
_attrs: attrs,
|
||||
_rawAttrs: attributes.slice(1),
|
||||
_type: nodeType.ELEMENT,
|
||||
// 这里的 range 不一定是正确的 range,需要匹配到闭标签以后更新
|
||||
_range: createRange(tagStartPos, tagEndPos),
|
||||
_children: [],
|
||||
_parentNode: currentParent,
|
||||
_innerHtml:[]
|
||||
};
|
||||
// if(currentNode._tagName=='script'){debugger}
|
||||
// console.log('标签',currentNode._tagName)
|
||||
currentNode.__proto__ = bodavm.toolsFunc.setProto(currentNode._tagName)
|
||||
// debugger
|
||||
// currentNode
|
||||
if (attrs['id']) {
|
||||
root._idelements[attrs['id']] = currentNode
|
||||
}
|
||||
|
||||
if (attrs['class']) {
|
||||
if (root['_className'][attrs['class']] == undefined) {
|
||||
root['_className'][attrs['class']] = []
|
||||
}
|
||||
// debugger
|
||||
root._className[attrs['class']].push(currentNode)
|
||||
|
||||
}
|
||||
let root_tagelement = root._tagelements[tagName]
|
||||
if (root_tagelement) {
|
||||
root._tagelements[tagName].push(currentNode)
|
||||
} else {
|
||||
root._tagelements[tagName] = []
|
||||
root._tagelements[tagName].push(currentNode)
|
||||
}
|
||||
// if (currentNode.tagName=='head'){debugger}
|
||||
// 将当前节点信息放入到 currentParent 的 children 中
|
||||
currentParent._children.push(currentNode);
|
||||
// 重置 currentParent 节点为当前节点
|
||||
currentParent = currentNode;
|
||||
// 将每个节点依次塞到栈中,然后在后面的闭标签中以栈的方式释放
|
||||
stack.push(currentParent);
|
||||
// debugger
|
||||
}
|
||||
|
||||
// 自闭合元素
|
||||
const kSelfClosingElements = {
|
||||
// area: true,
|
||||
// img: true,
|
||||
// meta:true,
|
||||
// frame:true,
|
||||
// embed:true,
|
||||
// keygen:true,
|
||||
// source:true,
|
||||
// base:true,
|
||||
// hr:true,
|
||||
// br:true,
|
||||
input:true,
|
||||
// link:true, area: true,
|
||||
img: true,
|
||||
meta: true,
|
||||
link: true,
|
||||
area: true,
|
||||
br:true,
|
||||
// '!DOCTYPE':true,
|
||||
// '!--':true
|
||||
// ...省略了部分标签
|
||||
};
|
||||
if (leadingSlash || closingSlash || kSelfClosingElements[tagName]) {
|
||||
// 开闭标签名是否匹配,比如有可能写成 <div></div1>,这种就需要异常处理
|
||||
if (currentParent._tagName === tagName) {
|
||||
// debugger
|
||||
// 更新 range,之前处理开标签算出的 range 是不包含闭标签的
|
||||
currentParent._range[1] = createRange(-1, Math.max(lastTextPos, tagEndPos))[1];
|
||||
// 将处理完的开闭标签踢出
|
||||
stack.pop();
|
||||
// 将 stack 的最后一个节点赋值给 currentParent
|
||||
currentParent = arrBack(stack);
|
||||
} else {
|
||||
// <div></div1>,异常直接从栈中踢出,不更新 range
|
||||
stack.pop();
|
||||
currentParent = arrBack(stack);
|
||||
}
|
||||
}
|
||||
}
|
||||
// 通过处理,将 stack 返回就是最终的结果
|
||||
// debugger
|
||||
return stack;
|
||||
}
|
@ -1,16 +0,0 @@
|
||||
{
|
||||
"targets":[
|
||||
{
|
||||
"target_name":"boda",
|
||||
"sources":['./c++_src/main.cc'],
|
||||
"include_dirs":['<!@(node -p "require(\'node-addon-api\').include")'],
|
||||
"dependencies":['<!(node -p "require(\'node-addon-api\').gyp")'],
|
||||
"cflags_cc":[
|
||||
"-std-c++17"
|
||||
],
|
||||
"cflags!":["-fno-exceptions"],
|
||||
"cflags_cc!":['-fno-exceptions'],
|
||||
"defines":['NAPI_DISABLE_CPP_EXCEPTIONS']
|
||||
}
|
||||
]
|
||||
}
|
@ -1,37 +0,0 @@
|
||||
/*
|
||||
|
||||
1.最新版npm
|
||||
windows 管理员运行 npm install --global windows-build-tools,
|
||||
如果卡在Successfully install Python2.7,就在c:\用户名\AppDate\Local\TEMP下新建
|
||||
一个文件,名称dd_client_.log 内容 Closing installer. Return code: 3010.
|
||||
|
||||
3.npm install --global node-gyp
|
||||
4.当前目录下放入bingding.gyp
|
||||
|
||||
5.初始化项目
|
||||
1.npm init
|
||||
2.npm i node-addon-api
|
||||
3.安装vscode c++拓展
|
||||
4.执行node-gyp configure 查看Dnode_root_dir,确认头文件 '-Dnode_root_dir=C:\\Users\\徐晓波\\AppData\\Local\\node-gyp\\Cache\\14.18.2',
|
||||
5.c_cpp_properties.json(vscode ctrl+shift+p ) includePath 中加入 C:\Users\徐晓波\AppData\Local\node-gyp\Cache\14.18.2\include\node
|
||||
|
||||
6.编译
|
||||
1.根目录放入bingding.gyp
|
||||
2.cmd执行node-gyp rebuild 编译
|
||||
|
||||
3.报错
|
||||
File "C:\Users\徐晓波\AppData\Roaming\npm\node_modules\node-gyp\gyp\pylib\gyp\input.py", line 983, in ExpandVariables
|
||||
replacement = result.stdout.decode("utf-8").rstrip()
|
||||
AttributeError: 'str' object has no attribute 'decode' while trying to load binding.gyp
|
||||
解决办法,进入C:\Users\徐晓波\AppData\Roaming\npm\node_modules\node-gyp\gyp\pylib\gyp\input.py", line 983
|
||||
修改该行代码为replacement = result.stdout.rstrip()
|
||||
|
||||
7.安装npm install bindings
|
||||
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,123 +0,0 @@
|
||||
# -*- coding = utf-8 -*-
|
||||
# @Time: 2023-02-03 22:59
|
||||
# @Author: xiaobo 徐晓波
|
||||
# @Site:
|
||||
# @File: test.py
|
||||
# @Software: PyCharm
|
||||
bbb=[
|
||||
'EventTarget',
|
||||
'WindowProperties',
|
||||
'Window',
|
||||
'Node',
|
||||
'Element',
|
||||
'HTMLElement',
|
||||
'HTMLCollection',
|
||||
'NetworkInformation',
|
||||
'CustomElementRegistry',
|
||||
'Event',
|
||||
'UIEvent',
|
||||
'MouseEvent',
|
||||
'Document',
|
||||
'HTMLDocument',
|
||||
'Location',
|
||||
'Storage',
|
||||
'CharacterData',
|
||||
'Text',
|
||||
'Database',
|
||||
'CloseEvent',
|
||||
'Notification',
|
||||
'IDBDatabase',
|
||||
'IDBRequest',
|
||||
'IDBOpenDBRequest',
|
||||
'IDBFactory',
|
||||
'History',
|
||||
'Screen',
|
||||
'CSSStyleDeclaration',
|
||||
'CanvasRenderingContext2D',
|
||||
'WebGLRenderingContext',
|
||||
'MediaQueryList',
|
||||
'CSSRuleList',
|
||||
'Attr',
|
||||
'Navigation',
|
||||
'MediaStream',
|
||||
'TrustedTypePolicyFactory',
|
||||
'Scheduler',
|
||||
'CookieStore',
|
||||
'CacheStorage',
|
||||
'OffscreenCanvasRenderingContext2D',
|
||||
'VisualViewport',
|
||||
'BeforeInstallPromptEvent',
|
||||
'BarProp',
|
||||
'BaseAudioContext',
|
||||
'BluetoothUUID',
|
||||
'StyleMedia',
|
||||
'Audio',
|
||||
'Crypto',
|
||||
'CDATASection',
|
||||
'Comment',
|
||||
'DocumentFragment',
|
||||
'DocumentType',
|
||||
'DOMParser',
|
||||
'External',
|
||||
'WebSocket',
|
||||
'SourceBuffer',
|
||||
'DOMStringList',
|
||||
'Headers',
|
||||
'IDBObjectStore',
|
||||
'IDBTransaction',
|
||||
'IDBVersionChangeEvent',
|
||||
'TextTrackList',
|
||||
'SpeechSynthesisUtterance',
|
||||
'MediaEncryptedEvent',
|
||||
'MutationObserver',
|
||||
'NamedNodeMap',
|
||||
'NodeList',
|
||||
'OfflineAudioContext',
|
||||
'Path2D',
|
||||
'Performance',
|
||||
'ScreenOrientation',
|
||||
'PerformanceEntry',
|
||||
'PerformancePaintTiming',
|
||||
'Permissions',
|
||||
'PermissionStatus',
|
||||
'Request',
|
||||
'SVGElement',
|
||||
'SVGGraphicsElement',
|
||||
'SVGPatternElement',
|
||||
'SVGGeometryElement',
|
||||
'SVGPathElement',
|
||||
'SVGSVGElement',
|
||||
'SVGSymbolElement',
|
||||
'SVGUseElement',
|
||||
'WebGLShader',
|
||||
'WebGLShaderPrecisionFormat',
|
||||
'RTCPeerConnection',
|
||||
'WebGLBuffer',
|
||||
'WebGLProgram',
|
||||
'CSS',
|
||||
'Navigator',
|
||||
'BatteryManager',
|
||||
'Plugin',
|
||||
'PluginArray',
|
||||
'MimeType',
|
||||
'MimeTypeArray',
|
||||
'XMLHttpRequestEventTarget',
|
||||
'XMLHttpRequest',
|
||||
'globalThis'
|
||||
]
|
||||
|
||||
import os
|
||||
lists=os.listdir(r'D:\My_Dir\环境框架_xbb_lastest\env')
|
||||
for i in lists:
|
||||
name=i.split('.')[0]
|
||||
if name not in bbb:
|
||||
print(name)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,81 +0,0 @@
|
||||
/**
|
||||
*
|
||||
* 安装: nodejs
|
||||
* 然后: npm install vm2 npm install canvas npm install jsdom
|
||||
* 提示: 建议每一个编写完事的js 建议用fd的js调试工具压缩一下,减少占用行数
|
||||
*
|
||||
* 使用vm2之前,先修改vm2本地文件
|
||||
*
|
||||
* 1、修改vm.js里的
|
||||
* // Create a new context for this vm.
|
||||
* //原本下面这句话 const _context = createContext(undefined, {
|
||||
* //被修改成了这句话 const _context = createContext(options, {
|
||||
* //外界在new VM的时候 把全局变量通过对象形式传递过来,全局的context就会继承这个全局变量!
|
||||
*
|
||||
*
|
||||
* 2、修改contextify.js里的 搜索Contextify.setGlobal =
|
||||
* (1)、try {
|
||||
global[prop] = value;//Contextify.value(value); //这里是为了在调试代码里不显示proxy 已被代理
|
||||
* (2)、去掉vm2特征global
|
||||
* //下面这段屏蔽了
|
||||
* Object.defineProperties(global, {
|
||||
* global: {value: global},
|
||||
* GLOBAL: {value: global},
|
||||
* root: {value: global},
|
||||
* isVM: {value: true}
|
||||
* });
|
||||
*
|
||||
*
|
||||
* 3、修改main.js里的
|
||||
* //如果想让vm2报错不是内部错误,修改890行
|
||||
* throw e;//this._internal.Decontextify.value(e); //原本是这句话throw this._internal.Decontextify.value(e); 改成了 throw e
|
||||
*
|
||||
* 关于vm2报错本地文件,但是找不到那个报错的调试文件解决方法:
|
||||
* const {VM,VMScript} = require("vm2");//这个是修改过的
|
||||
* const CodeGenerate = require("./node_tools/CodeGenerate.js");
|
||||
* //内存的概念,并非真正的内存,只是变量存储。
|
||||
* let Vm2Cfg = {memory:{prototypes:{},examples:{}},DefPrototype(prototypeName,constructor,basePrototype){}};
|
||||
* let savepath = `${__dirname}/vm_testScript/VM2_debug.js`; //提前把文件路径保存到变量里。
|
||||
* let code = CodeGenerate(path_,savepath); //把加载完事的文件code直接写到本地
|
||||
* let vm = new VM();
|
||||
* let catvm = Object.assign(Vm2Cfg,{vm:this});//内存配置导入
|
||||
* vm.setGlobal("catvm",catvm);//导入到全局里,这里的名字随便改,整体形成代码形式的话。就不要随意修改了。
|
||||
* vm.run(new VMScript(code,savepath)); //运行前 savepath 要保存到本地,那么调试报错时才能找到位置。
|
||||
*
|
||||
*
|
||||
* VScode 环境联调配置nodejs执行配置文件内容 launch.json
|
||||
* //运行js时添加nodejs配置文件 launch.json ,测试代码路径如下:
|
||||
* //C:\Users\AdministratorLr\Desktop\NewCode3_2022_10_15\.vscode\launch.json
|
||||
* //配置文件内容入下:
|
||||
*
|
||||
*{
|
||||
* "version": "0.2.0",
|
||||
* "configurations": [
|
||||
* {
|
||||
* "name": "v1 本地调试",
|
||||
* "type": "node",
|
||||
* "request": "launch",
|
||||
* "program": "${workspaceFolder}/index.js", //它只是跟在可执行文件后面的 一个参数了,要调试的js代码,不管你想执行哪个配置文件,这里配置即可
|
||||
* "runtimeExecutable": "D:\\nodejs\\node.exe" // 这里是 v16 版本的node路径,不管你安装几个版本的node都可以指定全局配置。这里配置完就可以随意切换了
|
||||
* },
|
||||
* {
|
||||
* "name": "v2 浏览器无环境联调",
|
||||
* "type": "node",
|
||||
* "request": "launch",
|
||||
* "program": "--inspect-brk", //它只是跟在可执行文件后面的 一个参数了
|
||||
* "args": ["${workspaceFolder}/index.js"],//它只是跟在可执行文件后面的 一个参数了
|
||||
* "runtimeExecutable": "D:\\nodejs\\node.exe" // 这里是 v16 版本的node路径,不管你安装几个版本的node都可以指定全局配置。这里配置完就可以随意切换了
|
||||
* },
|
||||
* {
|
||||
* "name": "v3 cmd参数详解", //演示所有参数的含义 , 控制台执行的结果是: D:\nodejs\node.exe args1 args2 args3 args4 args5 所以根据想要的功能自行设定和删减
|
||||
* "type": "node",
|
||||
* "request": "launch",
|
||||
* "program": "args3", //它只是跟在可执行文件后面的 一个参数了
|
||||
* "args": ["args4", "args5"],//它只是跟在可执行文件后面的 一个参数了
|
||||
* "runtimeArgs": ["args1", "args2"],//它只是跟在可执行文件后面的 一个参数了
|
||||
* "runtimeExecutable": "D:\\nodejs\\node.exe" // 这里是 v16 版本的node路径,不管你安装几个版本的node都可以指定全局配置。这里配置完就可以随意切换了
|
||||
* }
|
||||
* ]
|
||||
*}
|
||||
*
|
||||
**/
|
@ -1,146 +0,0 @@
|
||||
//全局对象配置
|
||||
var myloglist=[]
|
||||
var myloglistindex=0
|
||||
bodavm = {
|
||||
|
||||
"toolsFunc": {}, //功能函数相关,插件
|
||||
"envFunc": {},//环境相关
|
||||
"config": {}, //配置相关
|
||||
"memory":{},
|
||||
"toolsPlugin": {} //Plugin相关
|
||||
}
|
||||
bodavm.config.isdebug=false; //是否开启debugger
|
||||
|
||||
bodavm.config.proxy = false; //是否代理
|
||||
|
||||
bodavm.config.printLog=true; //是否打开日志
|
||||
bodavm.memory.isproxy= {}
|
||||
bodavm.memory.filterProxyProp=['toJSON','undefined','splice','String','fromCharCode','apply','prototype','__proto__','toString','Object','Array',"eval",'Symbol(Symbol.toStringTag)','Symbol.toStringTag','bodavm.memory.symbolData',"Symbol(Symbol.species)",'Symbol(Symbol.hasInstance)'] //需要过滤 的属性
|
||||
bodavm.memory.symbolData=Symbol("data") //用来保存当前对象上的原型属性
|
||||
bodavm.memory.globalInit={}
|
||||
//存储tag标签
|
||||
bodavm.memory.tag=[]
|
||||
// bodavm.memory.localStorage={};
|
||||
bodavm.memory.cookie1='' //用来存储555
|
||||
bodavm.memory.cookie2={} //用来存储"a=10"
|
||||
bodavm.memory.cookie=''; //拼接cookie1 和cookie2
|
||||
|
||||
bodavm.memory.asyncEvent={};
|
||||
bodavm.memory.globalInit.timeoutID=0;
|
||||
// "Verdana;Helvetica Neue LT Pro 35 Thin;tahoma;verdana;times new roman;Courier New;Microsoft Himalaya;helvetica;LG-FZKaTong-M19-V2.2;Georgia;georgia;courier new;Arial;arial;cursive;times;fantasy;courier;serif;monospace;Times New Roman"
|
||||
bodavm.memory.globalInit.fontList = ["SimHei", "SimSun", "NSimSun", "FangSong", "KaiTi",'Verdana','tahoma','helvetica','Georgia','georgia','Arial','arial','cursive','fantasy','courier','serif','monospace'];
|
||||
bodavm.memory.font={
|
||||
"font-family":'',
|
||||
"fontFamily":''
|
||||
}
|
||||
|
||||
|
||||
bodavm.memory.location={
|
||||
origin:"http://101.43.230.100",
|
||||
hash:"",
|
||||
pathname:"/",
|
||||
search:"",
|
||||
href:"http://101.43.230.100/",
|
||||
port:"",
|
||||
protocol:"http:",
|
||||
host:"101.43.230.100",
|
||||
ancestorOrigins:"{}",
|
||||
hostname:"101.43.230.100"
|
||||
};
|
||||
|
||||
bodavm.memory.document={
|
||||
URL:"http://101.43.230.100/",
|
||||
referrer:"",
|
||||
documentURI:"http://101.43.230.100/",
|
||||
compatMode:"CSS1Compat",
|
||||
dir:"",
|
||||
title:"QQ会员等级 - QQ等级 - 好莱坞等级 查询",
|
||||
designMode:"off",
|
||||
readyState:"complete",
|
||||
contentType:"text/html",
|
||||
inputEncoding:"UTF-8",
|
||||
domain:"101.43.230.100",
|
||||
characterSet:"UTF-8",
|
||||
charset:"UTF-8",
|
||||
hidden:"false",
|
||||
onmousemove:"null",
|
||||
onselectionchange:"null",
|
||||
|
||||
};
|
||||
|
||||
bodavm.memory.htmldivelement={
|
||||
align:"undefined",
|
||||
|
||||
};
|
||||
|
||||
bodavm.memory.history={
|
||||
scrollRestoration:"auto"
|
||||
};
|
||||
|
||||
bodavm.memory.screen={
|
||||
width:1440,
|
||||
height:960,
|
||||
availWidth:1440,
|
||||
availHeight:920,
|
||||
pixelDepth:24,
|
||||
colorDepth:24,
|
||||
availLeft:0,
|
||||
availTop:0,
|
||||
isExtended:undefined,
|
||||
orientation:{},
|
||||
onchange:undefined,
|
||||
};
|
||||
|
||||
bodavm.memory.navigator={
|
||||
language:"zh-CN",
|
||||
userAgent:"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36",
|
||||
appVersion:"5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36",
|
||||
vendor:"Google Inc.",
|
||||
appName:"Netscape",
|
||||
appCodeName:"Mozilla",
|
||||
cookieEnabled:true,
|
||||
languages:["zh-CN","zh"],
|
||||
productSub:"20030107",
|
||||
userAgentData:undefined,
|
||||
xr:undefined,
|
||||
platform:'Win32',
|
||||
webkitPersistentStorage:{},
|
||||
connection:{},
|
||||
javaEnabled:false
|
||||
};
|
||||
bodavm.memory.window={
|
||||
indexedDB:{},
|
||||
name:"",
|
||||
};
|
||||
|
||||
bodavm.memory.canvas={};
|
||||
bodavm.memory.canvas2D={
|
||||
direction: "ltr",
|
||||
fillStyle: "#000000",
|
||||
filter: "none",
|
||||
font: "10px sans-serif",
|
||||
fontKerning: "auto",
|
||||
fontStretch: "normal",
|
||||
fontVariantCaps: "normal",
|
||||
globalAlpha: 1,
|
||||
globalCompositeOperation: "source-over",
|
||||
imageSmoothingEnabled: true,
|
||||
imageSmoothingQuality: "low",
|
||||
letterSpacing: "0px",
|
||||
lineCap: "butt",
|
||||
lineDashOffset: 0,
|
||||
lineJoin: "miter",
|
||||
lineWidth: 1,
|
||||
miterLimit: 10,
|
||||
shadowBlur: 0,
|
||||
shadowColor: "rgba(0, 0, 0, 0)",
|
||||
shadowOffsetX: 0,
|
||||
shadowOffsetY: 0,
|
||||
strokeStyle: "#000000",
|
||||
textAlign: "start",
|
||||
textBaseline: "alphabetic",
|
||||
textRendering: "auto",
|
||||
wordSpacing: "0px",
|
||||
}
|
||||
// bodavm.memory.localStorage={}
|
||||
|
File diff suppressed because one or more lines are too long
@ -1,230 +0,0 @@
|
||||
// 代理器失效 1.没有使用代理对象 2.代理器脱钩 目标代码通过 this 绕过代理器
|
||||
// 解决办法
|
||||
window = this;
|
||||
window = new Proxy(window, this)
|
||||
// globalThis=new Proxy(globalThis,'globalThis')
|
||||
// window.mythis=function(){
|
||||
/// 网站扣下的代码
|
||||
// }
|
||||
// mythis()
|
||||
|
||||
//2自执行
|
||||
for (let name in global) {
|
||||
switch (name) {
|
||||
case "window":
|
||||
continue;
|
||||
case "global":
|
||||
continue;
|
||||
}
|
||||
window[name] = global[name];
|
||||
delete global[name];
|
||||
}
|
||||
|
||||
window = myProxy(window, "window");
|
||||
Object.setPrototypeOf(global, window);
|
||||
!function () { }()
|
||||
|
||||
|
||||
|
||||
//全局hook
|
||||
bobomyHookfilter={
|
||||
'location':true,
|
||||
'Function':true,
|
||||
'Object':true,
|
||||
'window':true,
|
||||
'Window':true,
|
||||
'document':true,
|
||||
'bobomyHook':true,
|
||||
"hookObjs":true,
|
||||
'objlist':true,
|
||||
'JSON':true,
|
||||
'bobomyHookfilter':true,
|
||||
'Math':true,
|
||||
'Intl':true,
|
||||
'Reflect':true,
|
||||
'console':true,
|
||||
'CSS':true,
|
||||
'Atomics':true,
|
||||
'top':true,
|
||||
|
||||
|
||||
}
|
||||
hookObjs = {
|
||||
|
||||
}
|
||||
objlist=[
|
||||
{
|
||||
'name':"window",
|
||||
'obj':window
|
||||
},
|
||||
{
|
||||
'name':"document",
|
||||
'obj':document
|
||||
},
|
||||
{
|
||||
'name':"screen",
|
||||
'obj':screen
|
||||
},
|
||||
{
|
||||
'name':"history",
|
||||
'obj':history
|
||||
},
|
||||
{
|
||||
'name':"localStorage",
|
||||
'obj':localStorage
|
||||
},
|
||||
{
|
||||
'name':'navigation',
|
||||
'obj':navigation
|
||||
},
|
||||
{
|
||||
'name':'webkitStorageInfo',
|
||||
'obj':webkitStorageInfo
|
||||
},
|
||||
{
|
||||
'name':'speechSynthesis',
|
||||
'obj':speechSynthesis
|
||||
|
||||
},
|
||||
{
|
||||
'name':'sessionStorage',
|
||||
'obj':sessionStorage
|
||||
|
||||
},
|
||||
{
|
||||
'name':'customElements',
|
||||
'obj':customElements
|
||||
},
|
||||
{
|
||||
'name':'clientInformation',
|
||||
'obj':clientInformation
|
||||
},
|
||||
{
|
||||
'name':'menubar',
|
||||
'obj':menubar
|
||||
},
|
||||
{
|
||||
'name':'toolbar',
|
||||
'obj':toolbar
|
||||
},
|
||||
{
|
||||
'name':'visualViewport',
|
||||
'obj':visualViewport
|
||||
},
|
||||
|
||||
{
|
||||
'name':'styleMedia',
|
||||
'obj':styleMedia
|
||||
},
|
||||
|
||||
{
|
||||
'name':'scheduler',
|
||||
'obj':scheduler
|
||||
},
|
||||
|
||||
{
|
||||
'name':'indexedDB',
|
||||
'obj':indexedDB
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
'name':'trustedTypes',
|
||||
'obj':trustedTypes
|
||||
},
|
||||
|
||||
{
|
||||
'name':'cookieStore',
|
||||
'obj':cookieStore
|
||||
},
|
||||
{
|
||||
'name':'external',
|
||||
'obj':external
|
||||
|
||||
}
|
||||
|
||||
|
||||
]
|
||||
for (let i = 0; i < objlist.length; i++) {
|
||||
let name = objlist[i]['name'];
|
||||
let obj= objlist[i]['obj']
|
||||
hookObjs[name] = {}
|
||||
bobomyHook(obj,name)
|
||||
}
|
||||
function bobomyHook(obj,name) {
|
||||
|
||||
let boboobjname = Object.getOwnPropertyNames(obj)
|
||||
for (let i =0; i<boboobjname.length;i++) {
|
||||
//i name
|
||||
if (bobomyHookfilter[boboobjname[i]]){continue}
|
||||
let bobodesc = Object.getOwnPropertyDescriptor(obj, boboobjname[i])
|
||||
// console.log(bobodesc)
|
||||
let boboconfigurable_ = bobodesc['configurable']
|
||||
let boboenumerable_ = bobodesc['enumerable']
|
||||
let bobovalue_ = bobodesc['value']
|
||||
let bobowritable_ = bobodesc['writable']
|
||||
let boboget_ = bobodesc['get']
|
||||
let boboset_ = bobodesc['set']
|
||||
// console.log(bobodesc)
|
||||
// get set 与value writable不能共存 configurable enumerable这两个是肯定有的
|
||||
try{
|
||||
if (boboget_ || boboset_) {
|
||||
hookObjs[name][boboobjname[i] + '_get'] = boboget_
|
||||
hookObjs[name][boboobjname[i] + '_set'] = boboset_
|
||||
const myvalue=boboobjname[i]
|
||||
Object.defineProperty(obj,myvalue,{
|
||||
configurable:boboconfigurable_,
|
||||
enumerable:boboenumerable_,
|
||||
get:boboget_?function (){
|
||||
let args=arguments
|
||||
let result=hookObjs[name][myvalue + '_get'].apply(this,arguments)
|
||||
console.log(`${name} get-> ${myvalue} arg->${JSON.stringify(args)} -> result -> ${result}`)
|
||||
return result
|
||||
}:undefined,
|
||||
set:boboset_?function(){
|
||||
let args=arguments
|
||||
let result=hookObjs[name][myvalue + '_set'].apply(this,arguments)
|
||||
console.log(`${name} set-> ${myvalue} -> arg->${JSON.stringify(args)} value -> ${result}`)
|
||||
return result
|
||||
}:undefined
|
||||
})
|
||||
|
||||
} else {
|
||||
hookObjs[name][boboobjname[i] + '_value']=bobovalue_
|
||||
if (typeof bobovalue_ =='object'){
|
||||
const myvalue=boboobjname[i]
|
||||
console.log(`${name} value-> ${myvalue} result ->${bobovalue_}`);
|
||||
Object.defineProperty(obj,boboobjname[i],{
|
||||
configurable:boboconfigurable_,
|
||||
enumerable:boboenumerable_,
|
||||
writable:bobowritable_,
|
||||
value:bobovalue_
|
||||
})
|
||||
|
||||
}else if (typeof bobovalue_ =='function'){
|
||||
const myvalue=boboobjname[i]
|
||||
Object.defineProperty(obj,boboobjname[i],{
|
||||
configurable:boboconfigurable_,
|
||||
enumerable:boboenumerable_,
|
||||
writable:bobowritable_,
|
||||
value:function (){
|
||||
let args=arguments
|
||||
let result=hookObjs[name][myvalue + '_value'].apply(this,arguments)
|
||||
console.log(`${name} value apply -> ${myvalue} arg->${JSON.stringify(args)} result ->${result}`);
|
||||
return result
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}catch{}
|
||||
|
||||
}
|
||||
|
||||
if (obj.__proto__ !=null){
|
||||
bobomyHook(obj.__proto__,name)
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
// window.atob('123')
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,46 +0,0 @@
|
||||
(function n(i, r, t, e, l, a, f, u) {
|
||||
var c, o, h, s, p, g, m, y, d, v, w, b, C, F, j, S, k, q, x, z, A, B, D, E, G, H, I, J, K, L, M, N, O, P, Q, R, T,
|
||||
U, V;
|
||||
if (this.constructor != n) {
|
||||
if (e || ((e = [this]).n = e[0], e.t = [], (o = {}).s = !1, o.v = !1, e.t.push(o), n.r = n.g = n), h = e[e.length - 1], -3 == t || -2 == t) {
|
||||
if (-2 == t) {
|
||||
for (a = 0, f = 0; i[r] > 127;) f += i[r++] - 128 << 7 * a++;
|
||||
f += i[r++] << 7 * a
|
||||
} else f = (r = (s = n(i, r, -2)).i) + (a = s.n) - 1, r += a;
|
||||
return {n: f, i: r}
|
||||
}
|
||||
if (l === n) {
|
||||
for (p = new n.g, g = [].slice.call(u), m = 0; m < a.length; m++) p[a[m]] = g[m];
|
||||
return p.arguments = u, (y = [].concat(e).concat(p)).n = f, y.t = [], n(i, r, t, y)
|
||||
}
|
||||
if (d = r || 0, c = t || i.length, v = i[d++], s = n(i, d, -2), d = s.i, s.n, w = 0, 6 == v || 10 == v ? w = 1 : 30 == v ? w = 2 : 29 == v && (w = 3), 6 == v || 10 == v || 30 == v || 29 == v) {
|
||||
for (o = e.t && e.t[e.t.length - 1], b = []; d < c;) {
|
||||
if (C = d++, s = n(i, d, -3), d = s.i, F = s.n, b.push(n(i, C, F, e)), 3 != w && e.a) return b[b.length - 1];
|
||||
if (2 == w && o && (o.v || o.s)) return b[b.length - 1]
|
||||
}
|
||||
if (2 != w) return b
|
||||
}
|
||||
if (25 == v) {
|
||||
if (j = n(i, d++, (s = n(i, d, -3), d = s.i, s.n), e), g = n(i, d++, (s = n(i, d, -3), d = s.i, s.n), e), n.bind) return new (n.bind.apply(j, [null].concat(g)));
|
||||
for (S = [], m = 0; m < g.length; m++) S[m] = "a[" + m + "]";
|
||||
return n.constructor("F,a", "return new F(" + S.join(",") + ")")(j, g)
|
||||
}
|
||||
if (80 != v) {
|
||||
if (125 == v) throw n(i, d++, (s = n(i, d, -3), d = s.i, s.n), e);
|
||||
if (18 == v || 113 == v) {
|
||||
for (I = i[d++], s = n(i, d, -2), d = s.i, J = s.n, K = [], m = 0; m < J; m++) s = n(i, d, -2), d = s.i, L = s.n, K.push(L);
|
||||
return M = String.fromCharCode.apply(null, K), 113 == v || e.m ? M : l ? [e[I], M] : e[I][M]
|
||||
}
|
||||
return 0 == v ? (e.m = !0, N = n(i, d++, (s = n(i, d, -3), d = s.i, s.n), e), e.m = !1, h[N] = e.u, n(i, d++, (s = n(i, d, -3), d = s.i, s.n), e)) : 67 == v ? (91 == i[d++] && (O = i[d++]), O) : 34 == v ? a != f : 89 == v ? n(i, d++, (s = n(i, d, -3), d = s.i, s.n), e) : 58 == v ? null : 57 == v ? n(i, d++, (s = n(i, d, -3), d = s.i, s.n), e, 0, n(i, d++, (s = n(i, d, -3), d = s.i, s.n), e), n(i, d++, (s = n(i, d, -3), d = s.i, s.n), e)) : 78 == v ? (P = n(i, d++, (s = n(i, d, -3), d = s.i, s.n), e), Q = n(i, d++, (s = n(i, d, -3), d = s.i, s.n), e), e.m = !P, R = n(i, d++, (s = n(i, d, -3), d = s.i, s.n), e), e.m = !1, l ? [Q, R] : Q[R]) : 88 == v ? n(i, d++, (s = n(i, d, -3), d = s.i, s.n), e) ? n(i, d++, (s = n(i, d, -3), d = s.i, s.n), e) : (s = n(i, ++d, -3), d = s.i, s.n, n(i, d++, (s = n(i, d, -3), d = s.i, s.n), e)) : 95 == v ? (T = n(i, d++, (s = n(i, d, -3), d = s.i, s.n), e, !0), U = n(i, d++, (s = n(i, d, -3), d = s.i, s.n), e), T instanceof n.constructor ? n.apply.call(T, e[0].n, U) : (V = T[0][T[1]], T[0] instanceof n.g ? n.apply.call(V, e.n, U) : n.apply.call(V, T[0], U))) : void 0
|
||||
}
|
||||
k = d++, s = n(i, d, -3), d = s.i, q = s.n, x = d++, s = n(i, d, -3), d = s.i, z = s.n, A = d++, s = n(i, d, -3), d = s.i, B = s.n;
|
||||
try {
|
||||
if (D = n(i, k, q, e), e.a) return D
|
||||
} catch (W) {
|
||||
if (e.u = W, E = n(i, x, z, e), e.a) return E
|
||||
} finally {
|
||||
if (G = e.a, e.a = !1, H = n(i, A, B, e), e.a) return H;
|
||||
e.a = G
|
||||
}
|
||||
}
|
||||
})([6, 198, 8, 10, 195, 8, 80, 192, 8, 30, 252, 7, 30, 249, 7, 88, 154, 1, 57, 127, 34, 0, 78, 111, 67, 2, 91, 0, 78, 97, 67, 2, 91, 0, 95, 84, 78, 42, 67, 2, 91, 0, 18, 8, 0, 6, 79, 98, 106, 101, 99, 116, 18, 26, 0, 24, 103, 101, 116, 79, 119, 110, 80, 114, 111, 112, 101, 114, 116, 121, 68, 101, 115, 99, 114, 105, 112, 116, 111, 114, 29, 38, 78, 28, 67, 2, 91, 0, 18, 10, 0, 8, 100, 111, 99, 117, 109, 101, 110, 116, 18, 10, 0, 8, 108, 111, 99, 97, 116, 105, 111, 110, 113, 6, 0, 4, 104, 114, 101, 102, 18, 5, 0, 3, 103, 101, 116, 18, 6, 0, 4, 110, 97, 109, 101, 113, 10, 0, 8, 103, 101, 116, 32, 104, 114, 101, 102, 30, 21, 30, 19, 125, 17, 25, 15, 18, 7, 0, 5, 69, 114, 114, 111, 114, 29, 4, 113, 2, 0, 0, 58, 0, 88, 154, 1, 57, 127, 34, 0, 78, 111, 67, 2, 91, 0, 78, 97, 67, 2, 91, 0, 95, 84, 78, 42, 67, 2, 91, 0, 18, 8, 0, 6, 79, 98, 106, 101, 99, 116, 18, 26, 0, 24, 103, 101, 116, 79, 119, 110, 80, 114, 111, 112, 101, 114, 116, 121, 68, 101, 115, 99, 114, 105, 112, 116, 111, 114, 29, 38, 78, 28, 67, 2, 91, 0, 18, 10, 0, 8, 100, 111, 99, 117, 109, 101, 110, 116, 18, 10, 0, 8, 108, 111, 99, 97, 116, 105, 111, 110, 113, 6, 0, 4, 104, 97, 115, 104, 18, 5, 0, 3, 103, 101, 116, 18, 6, 0, 4, 110, 97, 109, 101, 113, 10, 0, 8, 103, 101, 116, 32, 104, 97, 115, 104, 30, 21, 30, 19, 125, 17, 25, 15, 18, 7, 0, 5, 69, 114, 114, 111, 114, 29, 4, 113, 2, 0, 0, 58, 0, 88, 154, 1, 57, 127, 34, 0, 78, 111, 67, 2, 91, 0, 78, 97, 67, 2, 91, 0, 95, 84, 78, 42, 67, 2, 91, 0, 18, 8, 0, 6, 79, 98, 106, 101, 99, 116, 18, 26, 0, 24, 103, 101, 116, 79, 119, 110, 80, 114, 111, 112, 101, 114, 116, 121, 68, 101, 115, 99, 114, 105, 112, 116, 111, 114, 29, 38, 78, 28, 67, 2, 91, 0, 18, 10, 0, 8, 100, 111, 99, 117, 109, 101, 110, 116, 18, 10, 0, 8, 108, 111, 99, 97, 116, 105, 111, 110, 113, 6, 0, 4, 104, 111, 115, 116, 18, 5, 0, 3, 103, 101, 116, 18, 6, 0, 4, 110, 97, 109, 101, 113, 10, 0, 8, 103, 101, 116, 32, 104, 111, 115, 116, 30, 21, 30, 19, 125, 17, 25, 15, 18, 7, 0, 5, 69, 114, 114, 111, 114, 29, 4, 113, 2, 0, 0, 58, 0, 88, 163, 1, 57, 135, 1, 34, 0, 78, 115, 67, 2, 91, 0, 78, 101, 67, 2, 91, 0, 95, 88, 78, 42, 67, 2, 91, 0, 18, 8, 0, 6, 79, 98, 106, 101, 99, 116, 18, 26, 0, 24, 103, 101, 116, 79, 119, 110, 80, 114, 111, 112, 101, 114, 116, 121, 68, 101, 115, 99, 114, 105, 112, 116, 111, 114, 29, 42, 78, 28, 67, 2, 91, 0, 18, 10, 0, 8, 100, 111, 99, 117, 109, 101, 110, 116, 18, 10, 0, 8, 108, 111, 99, 97, 116, 105, 111, 110, 113, 10, 0, 8, 112, 114, 111, 116, 111, 99, 111, 108, 18, 5, 0, 3, 103, 101, 116, 18, 6, 0, 4, 110, 97, 109, 101, 113, 14, 0, 12, 103, 101, 116, 32, 112, 114, 111, 116, 111, 99, 111, 108, 30, 21, 30, 19, 125, 17, 25, 15, 18, 7, 0, 5, 69, 114, 114, 111, 114, 29, 4, 113, 2, 0, 0, 58, 0, 88, 159, 1, 57, 131, 1, 34, 0, 78, 113, 67, 2, 91, 0, 78, 99, 67, 2, 91, 0, 95, 86, 78, 42, 67, 2, 91, 0, 18, 8, 0, 6, 79, 98, 106, 101, 99, 116, 18, 26, 0, 24, 103, 101, 116, 79, 119, 110, 80, 114, 111, 112, 101, 114, 116, 121, 68, 101, 115, 99, 114, 105, 112, 116, 111, 114, 29, 40, 78, 28, 67, 2, 91, 0, 18, 10, 0, 8, 100, 111, 99, 117, 109, 101, 110, 116, 18, 10, 0, 8, 108, 111, 99, 97, 116, 105, 111, 110, 113, 8, 0, 6, 111, 114, 105, 103, 105, 110, 18, 5, 0, 3, 103, 101, 116, 18, 6, 0, 4, 110, 97, 109, 101, 113, 12, 0, 10, 103, 101, 116, 32, 111, 114, 105, 103, 105, 110, 30, 21, 30, 19, 125, 17, 25, 15, 18, 7, 0, 5, 69, 114, 114, 111, 114, 29, 4, 113, 2, 0, 0, 58, 0, 88, 163, 1, 57, 135, 1, 34, 0, 78, 115, 67, 2, 91, 0, 78, 101, 67, 2, 91, 0, 95, 88, 78, 42, 67, 2, 91, 0, 18, 8, 0, 6, 79, 98, 106, 101, 99, 116, 18, 26, 0, 24, 103, 101, 116, 79, 119, 110, 80, 114, 111, 112, 101, 114, 116, 121, 68, 101, 115, 99, 114, 105, 112, 116, 111, 114, 29, 42, 78, 28, 67, 2, 91, 0, 18, 10, 0, 8, 100, 111, 99, 117, 109, 101, 110, 116, 18, 10, 0, 8, 108, 111, 99, 97, 116, 105, 111, 110, 113, 10, 0, 8, 104, 111, 115, 116, 110, 97, 109, 101, 18, 5, 0, 3, 103, 101, 116, 18, 6, 0, 4, 110, 97, 109, 101, 113, 14, 0, 12, 103, 101, 116, 32, 104, 111, 115, 116, 110, 97, 109, 101, 30, 21, 30, 19, 125, 17, 25, 15, 18, 7, 0, 5, 69, 114, 114, 111, 114, 29, 4, 113, 2, 0, 0, 58, 0, 89, 50, 95, 48, 78, 22, 67, 2, 91, 0, 18, 9, 0, 7, 99, 111, 110, 115, 111, 108, 101, 18, 5, 0, 3, 108, 111, 103, 29, 22, 113, 20, 0, 6, 175, 231, 1, 131, 177, 1, 161, 208, 1, 140, 181, 2, 144, 196, 1, 159, 165, 1, 0, 61, 18, 3, 0, 1, 101, 30, 54, 30, 52, 89, 50, 95, 48, 78, 22, 67, 2, 91, 0, 18, 9, 0, 7, 99, 111, 110, 115, 111, 108, 101, 18, 5, 0, 3, 108, 111, 103, 29, 22, 113, 20, 0, 6, 175, 231, 1, 131, 177, 1, 161, 208, 1, 140, 181, 2, 177, 178, 1, 165, 154, 2, 58, 0]);
|
File diff suppressed because one or more lines are too long
@ -1,8 +0,0 @@
|
||||
console.log(top==window)
|
||||
console.log(top==parent)
|
||||
|
||||
console.log(top.self==window)
|
||||
console.log(top.self.window==window.top.self)
|
||||
console.log(self.window.top==top.window.self);
|
||||
console.log(self.window.top.self.top==top.window.self);
|
||||
console.log(self.window.top.self.top==top.window.self.window);
|
File diff suppressed because one or more lines are too long
@ -1,111 +0,0 @@
|
||||
//WindowProperties 删除构造方法
|
||||
delete WindowProperties.prototype.constructor;
|
||||
|
||||
|
||||
|
||||
//代理失效
|
||||
var window_=this; 底下用window_
|
||||
|
||||
//两个都需要补
|
||||
Object.getOwnPropertyDescriptors(Window)
|
||||
Object.getOwnPropertyDescriptors(Window.prototype)
|
||||
|
||||
//location检测
|
||||
|
||||
//代理检测
|
||||
// self=window;
|
||||
// top=window
|
||||
// window==self ; ///true
|
||||
// window =new Proxy(window,{});
|
||||
// window==self;//false
|
||||
|
||||
//需要连续赋值,可以过代理检测
|
||||
// top=self=window=new Proxy(window,{})
|
||||
|
||||
|
||||
|
||||
//解决重复代理
|
||||
bodavm.memory.symbolProxy=Symbol("proxy") //独一无二的属性,标记是否代理
|
||||
if (bodavm.memory.symbolProxy in obj){
|
||||
return obj
|
||||
}
|
||||
//解决重复代理
|
||||
Object.defineProperty(obj,bodavm.memory.symbolProxy,{
|
||||
configurable:false,
|
||||
enumerable:false,
|
||||
writable:false,
|
||||
value:true
|
||||
})
|
||||
|
||||
|
||||
|
||||
|
||||
//代理失效 ,代理的对象没有被代理上
|
||||
console.log(document.createElement===document.createElement)
|
||||
|
||||
|
||||
|
||||
|
||||
//实现Document.prototype.activeElement()调用报错
|
||||
if(Object.getOwnPropertyDescriptor(obj,"constructor")!==undefined){
|
||||
if (Object.getOwnPropertyDescriptor(self,"constructor") !==undefined){
|
||||
return bodavm.toolsFunc.throwError("TypeError","Illegal invocation")
|
||||
}
|
||||
}
|
||||
|
||||
//过滤bodavm.memory.symbolProxy与"eval"
|
||||
|
||||
|
||||
//node环境和vm2环境中的监测点过滤
|
||||
// 删除浏览器中不存在的对象
|
||||
delete global;
|
||||
delete GLOBAL;
|
||||
delete VMError;
|
||||
delete Buffer;
|
||||
delete WindowProperties
|
||||
delete process;
|
||||
delete root;
|
||||
|
||||
|
||||
//在原型对象上不能通过原型对象获取,不在自身上可以通过自身获取
|
||||
a=document.createElement("div")
|
||||
a.align=123
|
||||
Object.getOwnPropertyDescriptors(a,'align')
|
||||
|
||||
|
||||
|
||||
//鼠标轨迹
|
||||
|
||||
|
||||
//检测点
|
||||
function test(){}
|
||||
Object.getOwnPropertyDescriptor(window,'test')
|
||||
|
||||
|
||||
|
||||
//
|
||||
var r={}
|
||||
r.__proto__=document
|
||||
r.location
|
||||
|
||||
var b={}
|
||||
b=Screen.prototype
|
||||
b.width
|
||||
var b={}
|
||||
b.__proto__=Screen.prototype
|
||||
b.width
|
||||
|
||||
|
||||
//document.all
|
||||
|
||||
|
||||
|
||||
//window.length iframe
|
||||
|
||||
|
||||
|
||||
// JSON.stringify(console)
|
||||
|
||||
|
||||
|
||||
"FSSBBIl1UgzbN7N80T=4B.zKNh3jQsKMZLAyeqQs7QJwaZPeSafzY3KH2cdc0RyVUYgsIPrb_buCwzg59VBqHJbjQAXky9B_J5am_szA1nWrHhagAii3e0x52q2c0st02n4qjdiGKI_Q5W2b2xEaLujGn0notNXB0uevYFRYKwQ0R.naBqJsjWQK8SQD9HVg8kzNCXC0W1OLMLWFS4AGvo2i_BMtcTi.IyV2X5xsDcz9;"
|
File diff suppressed because one or more lines are too long
@ -1,36 +0,0 @@
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<title>浏览器事件补齐</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="testDiv" style="width: 100px;height: 100px;background-color: red">
|
||||
|
||||
</div>
|
||||
</body>
|
||||
<script>
|
||||
window.addEventListener("load", function (event) {
|
||||
debugger
|
||||
let span = document.createElement("span");
|
||||
if (event.isTrusted) {
|
||||
span.id = "loadTest";
|
||||
span.innerText = "load事件触发";
|
||||
document.body.append(span);
|
||||
};
|
||||
});
|
||||
|
||||
|
||||
document.getElementById("testDiv").addEventListener("click", function (event) {
|
||||
|
||||
debugger
|
||||
if (event.isTrusted) {
|
||||
event.target.innerText = "testDiv被点击";
|
||||
};
|
||||
});
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
</html>
|
@ -17,7 +17,7 @@ const env=require(`${config_path}/env.config`)
|
||||
|
||||
fs.writeFileSync(`${run_path}/log.txt`,"")
|
||||
|
||||
let bohtml_=fs.readFileSync('D:\\My_Dir\\env_xbb_lastest_jsdom\\run\\run.html').toString('utf-8')
|
||||
let bohtml_=fs.readFileSync('.\\env_xbb_lastest_jsdom\\run\\run.html').toString('utf-8')
|
||||
const dom = new JSDOM(bohtml_,
|
||||
{
|
||||
url: "http://www.fangdi.com.cn/",
|
||||
|
@ -17,7 +17,7 @@
|
||||
}
|
||||
}
|
||||
log += "\r\n"
|
||||
bofs.appendFileSync(`D:/My_Dir/env_xbb_lastest_jsdom/run/log.txt`, log)
|
||||
bofs.appendFileSync(`./env_xbb_lastest_jsdom/run/log.txt`, log)
|
||||
}
|
||||
//hook console,让他自动调用printlog
|
||||
console.log_ = console.log;
|
||||
|
@ -1,204 +0,0 @@
|
||||
bodavm.toolsFunc.HTMLParser = function HTMLParser(data) {
|
||||
let data_=data
|
||||
data=data.replace(/<!-[\s\S]*?-->/g,'').replace(/\/\/[\s\S]*?\n/g,'')
|
||||
// debugger
|
||||
let tempdata;
|
||||
if(data.length <1){
|
||||
tempdata=data_
|
||||
}
|
||||
// debugger
|
||||
// 最外层模拟的节点
|
||||
const nodeType = {
|
||||
TEXT: 'text',
|
||||
ELEMENT: 'element',
|
||||
};
|
||||
// 最外层增加一个模拟的根节点标签
|
||||
const frameflag = 'rootnode';
|
||||
// 计算一个完整标签的范围,eg. [0, 50]
|
||||
const createRange = (startPos, endPos) => {
|
||||
// 因为最外层模拟了 <rootnode>,所以需要将这部分长度减掉
|
||||
const frameFlagOffset = frameflag.length + 2;
|
||||
return [startPos - frameFlagOffset, endPos - frameFlagOffset]
|
||||
};
|
||||
|
||||
const root = {
|
||||
_tagName: '#document',
|
||||
_children: [],
|
||||
_idelements: {},
|
||||
_className: {},
|
||||
_tagelements: {},
|
||||
_innerHtml:[]
|
||||
};
|
||||
|
||||
// 设置 root 为父节点
|
||||
let currentParent = root;
|
||||
// 栈管理
|
||||
const stack = [root];
|
||||
let lastTextPos = -1;
|
||||
|
||||
// 找到数组的最后一项
|
||||
function arrBack(arr) {
|
||||
return arr[arr.length - 1];
|
||||
}
|
||||
|
||||
// ...开始遍历 /解析
|
||||
|
||||
|
||||
// 将模拟的根节点和需要解析的 html 拼接
|
||||
data = `<${frameflag}>${data}</${frameflag}>`;
|
||||
|
||||
const kMarkupPattern = /<(\/?)([a-zA-Z][-.:0-9_a-zA-Z]*)((?:\s+[^>]*?(?:(?:'[^']*')|(?:"[^"]*"))?)*)\s*(\/?)>/g;
|
||||
while ((match = kMarkupPattern.exec(data))) {
|
||||
/**
|
||||
* matchText: 匹配的字符 eg. <span id="xxx">
|
||||
* leadingSlash: 是否为闭合标签 eg. /
|
||||
* tagName: 标签名 eg. span
|
||||
* attributes: 属性 eg. id="xxx"
|
||||
* closingSlash: 是否为自闭合 eg. /
|
||||
*/
|
||||
let { 0: matchText, 1: leadingSlash, 2: tagName, 3: attributes, 4: closingSlash } = match;
|
||||
// 本次匹配到的字符串
|
||||
const matchLength = matchText.length;
|
||||
// 本次匹配的起始位置
|
||||
const tagStartPos = kMarkupPattern.lastIndex - matchLength;
|
||||
// 本次匹配的末尾位置
|
||||
const tagEndPos = kMarkupPattern.lastIndex;
|
||||
|
||||
if (lastTextPos > -1) {
|
||||
// 处理文本,eg. hello world
|
||||
// 上次匹配的末尾位置 + 本次匹配的字符长度 小于 本次匹配的末尾位置就说明中间有 text,这个稍微想下其实还是比较好理解的
|
||||
// 如果没有 text,lastTextPos + matchLength 都会等于 tagEndPos
|
||||
// 上次匹配的末尾位置到本次匹配的起始位置
|
||||
const text = data.substring(lastTextPos, tagStartPos);
|
||||
// if (text.indexOf('<!') == -1 || text.indexOf('->') == -1) {
|
||||
//过滤innerHTML中的特殊字符
|
||||
let text_filter = text.replace(/\n/g, '').replace(/\t/g, '')
|
||||
if (text_filter.length > 0) {
|
||||
currentParent._innerHtml.push({
|
||||
type: nodeType.TEXT,
|
||||
range: createRange(lastTextPos, tagStartPos),
|
||||
value: text_filter,
|
||||
});
|
||||
}
|
||||
|
||||
// }
|
||||
}else if(tempdata){
|
||||
currentParent._innerHtml.push({
|
||||
type: nodeType.TEXT,
|
||||
range: [0,0],
|
||||
value: tempdata,
|
||||
});
|
||||
tempdata=undefined
|
||||
}
|
||||
|
||||
|
||||
|
||||
// 记录上次匹配的位置
|
||||
lastTextPos = kMarkupPattern.lastIndex;
|
||||
|
||||
// 如果匹配到的标签是模拟标签,就跳过
|
||||
if (tagName === frameflag) continue;
|
||||
|
||||
// ...处理 nodeType 为 element 逻辑
|
||||
if (!leadingSlash) {
|
||||
const attrs = {};
|
||||
// 解析 id、class 属性,并且挂到 attrs 对象下
|
||||
const kAttributePattern = /(?:^|\s)(id|type|href|value|class|style|src|content|target|onClick|r|rel|name|http-equiv|charset)\s*=\s*((?:'[^']*')|(?:"[^"]*")|\S+)/gi;
|
||||
for (let attMatch; (attMatch = kAttributePattern.exec(attributes));) {
|
||||
const { 1: key, 2: val } = attMatch;
|
||||
// 属性值是否带引号
|
||||
const isQuoted = val[0] === `'` || val[0] === `"`;
|
||||
attrs[key.toLowerCase()] = isQuoted ? val.slice(1, val.length - 1) : val;
|
||||
|
||||
}
|
||||
|
||||
// debugger
|
||||
const currentNode = {
|
||||
_tagName: tagName,
|
||||
_attrs: attrs,
|
||||
_rawAttrs: attributes.slice(1),
|
||||
_type: nodeType.ELEMENT,
|
||||
// 这里的 range 不一定是正确的 range,需要匹配到闭标签以后更新
|
||||
_range: createRange(tagStartPos, tagEndPos),
|
||||
_children: [],
|
||||
_parentNode: currentParent,
|
||||
_innerHtml:[]
|
||||
};
|
||||
// if(currentNode._tagName=='script'){debugger}
|
||||
// console.log('标签',currentNode._tagName)
|
||||
currentNode.__proto__ = bodavm.toolsFunc.setProto(currentNode._tagName)
|
||||
// debugger
|
||||
// currentNode
|
||||
if (attrs['id']) {
|
||||
root._idelements[attrs['id']] = currentNode
|
||||
}
|
||||
|
||||
if (attrs['class']) {
|
||||
if (root['_className'][attrs['class']] == undefined) {
|
||||
root['_className'][attrs['class']] = []
|
||||
}
|
||||
// debugger
|
||||
root._className[attrs['class']].push(currentNode)
|
||||
|
||||
}
|
||||
let root_tagelement = root._tagelements[tagName]
|
||||
if (root_tagelement) {
|
||||
root._tagelements[tagName].push(currentNode)
|
||||
} else {
|
||||
root._tagelements[tagName] = []
|
||||
root._tagelements[tagName].push(currentNode)
|
||||
}
|
||||
// if (currentNode.tagName=='head'){debugger}
|
||||
// 将当前节点信息放入到 currentParent 的 children 中
|
||||
currentParent._children.push(currentNode);
|
||||
// 重置 currentParent 节点为当前节点
|
||||
currentParent = currentNode;
|
||||
// 将每个节点依次塞到栈中,然后在后面的闭标签中以栈的方式释放
|
||||
stack.push(currentParent);
|
||||
// debugger
|
||||
}
|
||||
|
||||
// 自闭合元素
|
||||
const kSelfClosingElements = {
|
||||
// area: true,
|
||||
// img: true,
|
||||
// meta:true,
|
||||
// frame:true,
|
||||
// embed:true,
|
||||
// keygen:true,
|
||||
// source:true,
|
||||
// base:true,
|
||||
// hr:true,
|
||||
// br:true,
|
||||
input:true,
|
||||
// link:true, area: true,
|
||||
img: true,
|
||||
meta: true,
|
||||
link: true,
|
||||
area: true,
|
||||
br:true,
|
||||
// '!DOCTYPE':true,
|
||||
// '!--':true
|
||||
// ...省略了部分标签
|
||||
};
|
||||
if (leadingSlash || closingSlash || kSelfClosingElements[tagName]) {
|
||||
// 开闭标签名是否匹配,比如有可能写成 <div></div1>,这种就需要异常处理
|
||||
if (currentParent._tagName === tagName) {
|
||||
// debugger
|
||||
// 更新 range,之前处理开标签算出的 range 是不包含闭标签的
|
||||
currentParent._range[1] = createRange(-1, Math.max(lastTextPos, tagEndPos))[1];
|
||||
// 将处理完的开闭标签踢出
|
||||
stack.pop();
|
||||
// 将 stack 的最后一个节点赋值给 currentParent
|
||||
currentParent = arrBack(stack);
|
||||
} else {
|
||||
// <div></div1>,异常直接从栈中踢出,不更新 range
|
||||
stack.pop();
|
||||
currentParent = arrBack(stack);
|
||||
}
|
||||
}
|
||||
}
|
||||
// 通过处理,将 stack 返回就是最终的结果
|
||||
// debugger
|
||||
return stack;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user