Files
web_huangguo2_h5/app/static/js/common/compat.js
T
谢宇宁andClaude Opus 5.5 0fbdba5ccf Initial commit
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 11:47:47 +07:00

144 lines
4.5 KiB
JavaScript

/**
* 播放页 / 全站轻量兼容:Chrome / Safari / 夸克 / QQ(X5) / UC / 百度等
* - 标记 UA,便于定向样式
* - 动态视口高度 --app-vh
* - Element.matches / closest / Promise.finally 兜底(旧版 QQ / 夸克)
*/
(function () {
var root = document.documentElement;
var ua = (navigator && navigator.userAgent) || "";
var isIOS = /iP(hone|od|ad)/.test(ua);
var isAndroid = /Android/i.test(ua);
var isQuark = /Quark/i.test(ua);
var isQQ = /QQ\//i.test(ua) || /MQQBrowser/i.test(ua);
var isUC = /UCBrowser|UCWEB/i.test(ua);
var isWeChat = /MicroMessenger/i.test(ua);
var isBaidu = /baidubrowser|bdbrowser|BaiduHD/i.test(ua);
var isHuawei = /HuaweiBrowser|HONORBrowser|HBPC/i.test(ua);
var isMiui = /MiuiBrowser/i.test(ua);
var isSogou = /SogouMobileBrowser|SogouMSE/i.test(ua);
var isSafari =
/Safari/i.test(ua) &&
!/Chrome|CriOS|Chromium|Edg|Quark|MQQBrowser|UCBrowser|MicroMessenger|baidubrowser|MiuiBrowser|HuaweiBrowser|Sogou/i.test(
ua
);
// 易劫持 video 的国产浏览器:强制走页面内 DPlayer + hls.js
var forceCustomPlayer =
isQuark ||
isQQ ||
isUC ||
isWeChat ||
isBaidu ||
isHuawei ||
isMiui ||
isSogou ||
/VivoBrowser|HeyTapBrowser|OPPOBrowser|HeyTap|QihooBrowser|360Browser|360SE|360EE/i.test(
ua
);
root.classList.add("compat-ready");
if (isIOS) root.classList.add("is-ios");
if (isAndroid) root.classList.add("is-android");
if (isQuark) root.classList.add("is-quark");
if (isQQ) root.classList.add("is-qq");
if (isUC) root.classList.add("is-uc");
if (isWeChat) root.classList.add("is-wechat");
if (isBaidu) root.classList.add("is-baidu");
if (isHuawei) root.classList.add("is-huawei");
if (isMiui) root.classList.add("is-miui");
if (isSogou) root.classList.add("is-sogou");
if (isSafari) root.classList.add("is-safari");
if (forceCustomPlayer) root.classList.add("is-cn-browser");
window.BrowserCompat = {
isIOS: isIOS,
isAndroid: isAndroid,
isQuark: isQuark,
isQQ: isQQ,
isUC: isUC,
isWeChat: isWeChat,
isBaidu: isBaidu,
isHuawei: isHuawei,
isMiui: isMiui,
isSogou: isSogou,
isSafari: isSafari,
forceCustomPlayer: forceCustomPlayer,
needsX5Inline: isQQ || isWeChat || isUC || isQuark,
};
/** 点击目标可能是 Text 节点(夸克/QQ 常见),统一取 Element 再 closest */
window.domClosest = function (from, selector) {
var el = from;
if (!el) return null;
if (el.nodeType !== 1) el = el.parentElement || el.parentNode;
if (!el || el.nodeType !== 1 || typeof el.closest !== "function") return null;
return el.closest(selector);
};
if (!Element.prototype.matches) {
Element.prototype.matches =
Element.prototype.msMatchesSelector ||
Element.prototype.webkitMatchesSelector ||
function (selector) {
var list = (this.document || this.ownerDocument).querySelectorAll(selector);
var i = list.length;
while (--i >= 0 && list.item(i) !== this) {}
return i > -1;
};
}
if (!Element.prototype.closest) {
Element.prototype.closest = function (selector) {
var el = this;
while (el && el.nodeType === 1) {
if (el.matches(selector)) return el;
el = el.parentElement || el.parentNode;
}
return null;
};
}
if (typeof Promise !== "undefined" && !Promise.prototype.finally) {
Promise.prototype.finally = function (onFinally) {
var P = this.constructor;
return this.then(
function (value) {
return P.resolve(typeof onFinally === "function" ? onFinally() : onFinally).then(
function () {
return value;
}
);
},
function (reason) {
return P.resolve(typeof onFinally === "function" ? onFinally() : onFinally).then(
function () {
throw reason;
}
);
}
);
};
}
function setAppVh() {
var h = window.innerHeight || 0;
if (window.visualViewport && window.visualViewport.height) {
h = window.visualViewport.height;
}
if (h > 0) {
root.style.setProperty("--app-vh", h + "px");
}
}
setAppVh();
window.addEventListener("resize", setAppVh, { passive: true });
window.addEventListener("orientationchange", function () {
setTimeout(setAppVh, 120);
});
if (window.visualViewport) {
window.visualViewport.addEventListener("resize", setAppVh, { passive: true });
}
})();