代码拉取完成,页面将自动刷新
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="theme-color" content="#2b75c4"/>
<meta name="color-scheme" content="light dark">
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline' data: file:; img-src 'self'; font-src *; connect-src 'self'; media-src 'none'; object-src 'none'; child-src 'self'; frame-src 'none'; form-action 'self'; upgrade-insecure-requests; block-all-mixed-content; base-uri 'none';"/>
<title>Useragent 生成</title>
<script>
const uaData = {
base:{},
apps:{},
flag:{},
count:{},
text:new Map(),
tagtext:{},
tagfind:new Map(),
index:"",
jslist:[],
touch:"ontouchend" in document,
stor:{
apps:{},
flag:{}
},
storKey:"userAgentData",
styleKey:"userAgentStyle",
dark:false,
osdark:window.matchMedia("(prefers-color-scheme: dark)"),
版本:{
描述:"5.1 Beta 8",
详细:21120910,
},
设置:{
基础默认:1,
数字记号:"#",
暗色主题:2,
}
};
</script>
<style>
/* BEGIN normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */
html {
line-height: 1.15;
-webkit-text-size-adjust: 100%;
}
body {
margin: 0;
}
main {
display: block;
}
h1 {
font-size: 2em;
margin: 0.67em 0;
}
hr {
box-sizing: content-box;
height: 0;
overflow: visible;
}
pre {
font-family: monospace, monospace;
font-size: 1em;
}
a {
background-color: transparent;
}
abbr[title] {
border-bottom: none;
text-decoration: underline;
text-decoration: underline dotted;
}
b,
strong {
font-weight: bolder;
}
code,
kbd,
samp {
font-family: monospace, monospace;
font-size: 1em;
}
small {
font-size: 80%;
}
sub,
sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
}
sup {
top: -0.5em;
}
img {
border-style: none;
}
button,
input,
optgroup,
select,
textarea {
font-family: inherit;
font-size: 100%;
line-height: 1.15;
margin: 0;
}
button,
input {
overflow: visible;
}
button,
select {
text-transform: none;
}
button,
[type="button"],
[type="reset"],
[type="submit"] {
-webkit-appearance: button;
}
button::-moz-focus-inner,
[type="button"]::-moz-focus-inner,
[type="reset"]::-moz-focus-inner,
[type="submit"]::-moz-focus-inner {
border-style: none;
padding: 0;
}
button:-moz-focusring,
[type="button"]:-moz-focusring,
[type="reset"]:-moz-focusring,
[type="submit"]:-moz-focusring {
outline: 1px dotted ButtonText;
}
fieldset {
padding: 0.35em 0.75em 0.625em;
}
legend {
box-sizing: border-box;
color: inherit;
display: table;
max-width: 100%;
padding: 0;
white-space: normal;
}
progress {
vertical-align: baseline;
}
textarea {
overflow: auto;
}
[type="checkbox"],
[type="radio"] {
box-sizing: border-box;
padding: 0;
}
[type="number"]::-webkit-inner-spin-button,
[type="number"]::-webkit-outer-spin-button {
height: auto;
}
[type="search"] {
-webkit-appearance: textfield;
outline-offset: -2px;
}
[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
::-webkit-file-upload-button {
-webkit-appearance: button;
font: inherit;
}
details {
display: block;
}
summary {
display: list-item;
}
template {
display: none;
}
[hidden] {
display: none;
}
/* END normalize.css */
</style>
<style id="myLight">
:root {
--theme-color-a: #2b75c4;
--theme-color-b: white;
--theme-color-c: white; /* 反色前景色 */
--theme-color-d: transparent; /* 选框 文本框 背景色 */
--theme-color-e: lightgray; /* 选框 边框颜色 */
--theme-color-f: white; /* 页面背景色 */
--theme-color-g: yellow; /* 链接聚焦颜色 */
--theme-color-h: #e6f4ff; /* 选框 聚焦 背景色 */
--theme-color-i: #3688d0; /* 按钮 聚焦 背景色 */
--theme-color-j: lightgray; /* 加载屏幕 空筛选 文字颜色 */
--theme-color-close: crimson;
--theme-color-close-text: white;
--theme-color-prev: blueviolet;
--theme-color-top: #2b75c4;
--theme-color-top-enable: dodgerblue;
--input-check-ready: lightgray;
--input-check-ok: green;
--input-check-err: orange;
--input-check-null: red;
--data-need-save: orange;
--tag-filtered: #00ad46;
--prvw-key: tomato;
--prvw-plat: darkviolet;
--prvw-from: green;
--shadow-big: 0 2px 2px 0 rgba(0,0,0,0.14), 0 2px 5px 2px rgba(0,0,0,0.12);
--shadow-small: 0px 1px 2px 1px lightgray;
--color-scheme: light;
}
</style>
<style id="myDark">
@media (prefers-color-scheme: dark) {
:root {
--theme-color-a: lightskyblue;
--theme-color-b: #2e3952;
--theme-color-c: #2b75c4;
--theme-color-d: #345077;
--theme-color-e: transparent;
--theme-color-f: #202327;
--theme-color-g: yellow;
--theme-color-h: #3e5f8e;
--theme-color-i: #6cc3f9;
--theme-color-j: #728195;
--theme-color-close: crimson;
--theme-color-close-text: white;
--theme-color-prev: blueviolet;
--theme-color-top: #2b75c4;
--theme-color-top-enable: dodgerblue;
--input-check-ready: #345077;
--input-check-ok: green;
--input-check-err: orange;
--input-check-null: red;
--data-need-save: darksalmon;
--tag-filtered: #99ddbb;
--prvw-key: yellow;
--prvw-plat: pink;
--prvw-from: lime;
--shadow-big: 0 0 5px 3px rgba(50,80,120,0.5);
--shadow-small: none;
--color-scheme: dark;
}
}
</style>
<style id="myImportant"></style>
<style id="myStyle">
/*
* Prefixed by https://autoprefixer.github.io
* PostCSS: v8.3.6,
* Autoprefixer: v10.3.1
* Browsers: last 3 years and not edge <= 78
*/
@-webkit-keyframes toast {
0% { opacity: 0; }
20% { opacity: 1; }
80% { opacity: 1; }
100% { opacity: 0%; }
}
@keyframes toast {
0% { opacity: 0; }
20% { opacity: 1; }
80% { opacity: 1; }
100% { opacity: 0; }
}
:focus {
outline: none;
}
body {
font-size: 16px;
font-family: -apple-system,Tahoma,sans;
background-color: var(--theme-color-f);
color-scheme: var(--color-scheme);
}
textarea {
background-color: var(--theme-color-d);
color: var(--theme-color-a);
caret-color: var(--theme-color-a);
font-family: monospace;
border: 1px solid var(--theme-color-e);
padding: 5px;
display: block;
}
#setlayer textarea {
background-color: var(--theme-color-b);
height: 100px;
border: none;
font-size: 14px;
}
textarea:focus {
border-color: var(--theme-color-a);
}
body > div {
margin: 0 .5em;
}
.none,
.sel_none,
.tag_none {
display: none !important;
}
p {
margin: 0;
}
a {
text-decoration: none;
color: var(--theme-color-c);
font-family: monospace;
margin: 0 1px;
font-size: .7em;
width: .5em;
height: 1.1em;
line-height: 1.1em;
font-weight: 600;
}
a:focus, p:focus {
color: var(--theme-color-g);
}
noscript {
color: var(--theme-color-j);
text-align: center;
z-index: 10;
font-size: 4em;
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
background-color: var(--theme-color-b);
margin: 0;
}
#base,#mode,#app {
overflow: hidden;
display: flex;
}
#option {
margin-bottom: 4px;
border: 1px solid var(--theme-color-a);
}
#app {
margin-bottom: 8px;
background: var(--theme-color-b);
border: 1px solid var(--theme-color-a);
}
.win {
font-size: 1em;
position: absolute;
top: 0;
left: 0;
background: var(--theme-color-b);
margin: 0;
padding-bottom: 2px;
box-shadow: var(--shadow-big);
}
#classBox,.classBox {
padding: 3px;
border-radius: 10px;
}
#classBox .flag,
.classBox .flag {
padding: 2px 4px;
margin: 2px;
box-shadow: var(--shadow-small);
opacity: 0.5;
transition: opacity .5s;
}
#app .flag {
margin: 1.5px 0 1.5px 5px;
box-shadow: var(--shadow-small);
line-height: 1.25em;
}
#classBox input,
.classBox input {
display: none;
}
#classBox input:checked + .flag,
.classBox input:checked + .flag {
opacity: 1;
}
.setHead {
background: var(--theme-color-a);
color: var(--theme-color-c);
font-size: 12px;
font-weight: bold;
display: flex;
justify-content: center;
align-items: center;
width: 6em;
flex-shrink: 0;
}
#ajump {
display: flex;
flex-flow: column;
justify-content: space-between;
width: 7px;
margin: 0;
padding: 3px;
background: var(--theme-color-a);
}
#baseopt,#modeopt {
line-height: 22px;
width: 100%;
background: var(--theme-color-b);
color: var(--theme-color-a);
font-size: 13px;
}
#baseopt {
display: grid;
grid-template-columns: repeat(4, -webkit-max-content);
grid-template-columns: repeat(4, max-content);
grid-template-rows: repeat(2, -webkit-max-content);
grid-template-rows: repeat(2, max-content);
column-gap: 5px;
grid-column-gap: 5px;
}
#modeopt {
display: flex;
justify-content: space-between;
}
#modeopt > div {
display: flex;
}
#modeopt > div:first-child {
display: grid;
grid-template-columns: repeat(2, -webkit-max-content);
grid-template-columns: repeat(2, max-content);
column-gap: 5px;
grid-column-gap: 5px;
align-content: center;
}
#modeopt button {
width: auto;
}
#option label,
#classBox label,
.classBox label,
#tclsbox {
display: inline-flex;
}
#app label {
margin: 1px .25em 2px .5em;
display: flex;
color: var(--theme-color-a);
align-items: center;
}
.CaseHead {
font-size: 13px;
font-weight: bold;
background: var(--theme-color-a);
color: var(--theme-color-c);
padding: 2px 0 2px 5px;
}
#app_container.fixed .CaseHead {
position: -webkit-sticky;
position: sticky;
top: 0;
}
.sideBar {
width: 15px;
padding: 3px;
font-weight: bold;
background: var(--theme-color-a);
color: var(--theme-color-c);
}
div.sideBar > div {
text-align: center;
font-size: .5em;
height: 1.6em;
line-height: 1.6em;
}
div.sideBar > div:last-of-type {
position: absolute;
background: var(--theme-color-a);
width: 1.5em;
height: 1.5em;
line-height: 1.5em;
text-align: center;
transform: translate3d(-1.5em, 0, 0);
font-size:2em;
opacity:0;
transition: opacity .3s ease, top .1s linear;
border-radius:100%;
}
#app_container {
overflow-y: auto;
height: calc(1.5em * 14.5);
width: 100%;
}
.btnGrp {
text-align: center;
display: flex;
justify-content: space-between;
margin: 3px 4px;
}
.savebtn .btnGrp,
#modeopt .btnGrp {
margin: 0;
padding: 0;
}
#action {
margin: 3px .5em;
}
.orig-box {
display: none;
}
label:focus .new-style {
background-color: var(--theme-color-h);
}
.new-style {
background-color: var(--theme-color-d);
border: 1px solid var(--theme-color-e);
border-radius: 100%;
width: 16px;
height: 16px;
line-height: 16px;
}
.new-radio.new-style {
margin: 4px;
display: flex;
width: 13px;
height: 13px;
line-height: 13px;
}
.orig-box:checked + .new-style.new-radio:after {
transform: scale(.8);
}
.new-check.new-style {
margin: 3px 3px 0 auto;
border-radius: 0;
display: inline-block;
}
.orig-box:checked + .new-style {
background-color: var(--theme-color-a);
border-color: var(--theme-color-a);
}
.orig-box:checked + .new-style:after {
background-color: var(--theme-color-c);
border-radius: 100%;
content: '';
height: 9px;
width: 9px;
display: flex;
margin: auto;
align-self: center;
}
.orig-box:checked + .new-check.new-style::after {
border-color: var(--theme-color-c);
width: 5px;
height: 9px;
border-style: solid;
border-width: 0 3px 3px 0;
border-radius: 0;
transform: rotate(45deg);
background-color: transparent;
}
input[type=checkbox] {
float: right;
}
input[type=text] {
border: none;
border-bottom: 1px solid var(--input-check-ready);
background-color: transparent;
color: var(--theme-color-a);
caret-color: var(--theme-color-a);
font-family: monospace;
display: block;
font-size: .75em;
line-height: 1em;
}
input[type=text]:focus {
border-color: var(--theme-color-a);
}
::-webkit-input-placeholder {
color: var(--theme-color-a);
opacity: .5;
}
::-moz-selection {
background-color: var(--theme-color-a);
color: var(--theme-color-c);
}
::selection {
background-color: var(--theme-color-a);
color: var(--theme-color-c);
}
button {
background-color:var(--theme-color-a);
border: none;
border-radius: 0;
color: var(--theme-color-c);
width: 100%;
font-size: .75em;
font-weight: bold;
line-height: 0;
padding: 1.1em .5em;
margin: 0;
}
button:focus {
background-color: var(--theme-color-i);
}
#searchbox {
position: relative;
margin: 2px .5em;
}
#search {
width: 100%;
padding: 2px 0;
border: 1px solid transparent;
}
#version {
font-size: .5em;
color: var(--theme-color-a);
text-align: right;
margin: 5px 1em;
}
#nulltext {
font-size: 2em;
color: var(--theme-color-j);
margin: auto;
width: 9em;
text-align: center;
line-height: calc(1.5em * 7.25);
}
#nullprvw {
font-size: 2em;
line-height: 4em;
color: var(--theme-color-j);
margin: auto;
text-align: center;
}
.flag {
font-size: .75em;
padding: 1px 5px;
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
}
#addtype {
text-align: center;
margin: 5px auto;
font-size: .9em;
}
.atab > *,
#addsave > *,
#setlayer > *,
#classBox,
#useragent,
#issues {
margin: 3px 4px;
}
.classPart > *,
#swopt > * {
margin: 4px 0;
}
.atab > label,
#addsave > label,
.classPart > label {
display: flex;
}
#addtype > label,
.atab > div > label {
display: inline-flex;
vertical-align: middle;
color: var(--theme-color-a);
}
#addtype > label strong,
#baseopt label strong,
#modeopt label strong {
font-size: 12px;
line-height: 12px;
padding: 5.5px .5em;
width: 100%;
text-align: center;
height: -webkit-max-content;
height: -moz-max-content;
height: max-content;
}
#addtype > label:focus strong,
#baseopt label:focus strong,
#modeopt label:focus strong {
background: var(--theme-color-h);
}
#addtype > label input:checked + strong,
#baseopt label input:checked + strong,
#modeopt label input:checked + strong {
color: var(--theme-color-c);
background: var(--theme-color-a);
}
.atab > div > label {
line-height: 1.5em;
font-size: 0.9em;
}
.atab > label strong,
#addsave label strong,
.classPart > label strong,
.atab div p,
#addsave div p {
width: 20%;
min-width: 5em;
margin: .25em;
font-size: .9em;
color: var(--theme-color-a);
}
.classPart > label strong {
margin: 0 .45em 0 calc(.25em - 3px);
}
.atab > label input,
.classPart > label input {
width: 80%;
}
.atab div p,
#addsave div p {
display: inline-block;
font-weight: bold;
}
#addui {
width: -webkit-min-content;
width: -moz-min-content;
width: min-content;
}
#openNew {
padding: 0 5px !important;
font-size: 16px;
}
.msel {
color: var(--theme-color-c);
background: var(--theme-color-a);
font-weight: bold;
width: 80%;
font-size: .9em;
-webkit-appearance: menulist;
-moz-appearance: menulist;
appearance: menulist;
border: none;
}
#toast {
position: absolute;
left: 0;
right: 0;
bottom: 10%;
width: -webkit-max-content;
width: -moz-max-content;
width: max-content;
margin: 0 auto;
display: none;
border-radius: 20px;
padding: .5em 1em;
font-size: .75em;
font-weight: bold;
background-color: var(--theme-color-a);
color: var(--theme-color-c);
box-shadow: 0 0 5px var(--theme-color-c);
text-align: center;
z-index: 10;
}
.titlebar {
width: 100%;
display: flex;
background: var(--theme-color-a);
color: var(--theme-color-c);
font-size: .75em;
font-weight: bold;
}
.title {
padding: 0 .5em;
line-height: 25px;
width: 100%;
background-color: transparent;
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
}
.win .titbtn {
background-color: var(--theme-color-close);
color: var(--theme-color-close-text);
font-size: 1em;
border-radius: 0;
border: 0;
margin: 0;
width: 5em;
box-shadow: none;
transition: background-color .5s;
}
.win .prev {
background-color: var(--theme-color-prev);
}
.win .topbutton {
background-color: var(--theme-color-top);
}
#load {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
z-index: 9;
background-color: white;
background-color: var(--theme-color-b);
opacity: 100%;
margin: 0;
transition: opacity 1s;
}
#loadstr,#browstr {
max-width: 80%;
margin: 0 auto;
margin-top: 1em;
font-size: 1.5em;
font-weight: bold;
text-align: center;
color: lightgray;
color: var(--theme-color-j);
}
#browstr {
margin-top: .5em;
font-size: 1.25em;
width: 15em;
}
#tclsbox {
float: right;
margin: 2px 0;
font-weight: bold;
line-height: 1.5em;
}
#ttexd {
display: flex;
}
#ttexl {
line-height: normal;
font-size: .9em;
width: 20%;
min-width: 5em;
margin: 2px .25em;
}
#ttexl strong {
font-size: 1em;
color: var(--theme-color-a);
}
#ttext {
padding: 0;
border: none;
width: 80%;
height: 100%;
font-size: 12px;
box-shadow: none;
color: var(--theme-color-a);
font-family: monospace;
}
#tkds {
width: 80%;
font-size: 13.3333px;
min-width: 14em;
background: var(--theme-color-b);
border: none;
border-bottom: 1px solid var(--input-check-ready);
padding: 2px 6px 2px 3px;
}
#tkds:focus-within {
border-color: var(--theme-color-a);
}
#tkds > span {
display: block;
overflow: hidden;
height: 100%;
}
input[type=color] {
padding: 0;
border: none;
}
#stordata {
width: -webkit-fill-available;
width: -moz-available;
height:80px;
margin:0 4px;
}
#issues {
background-color: var(--theme-color-a);
color: var(--theme-color-c);
overflow-y: auto;
max-height: 8em;
}
hr {
border: 1px solid var(--theme-color-c);
margin: 0 .75em;
}
.issue {
margin: 2px .5em;
padding: 5px;
font-size: .85em;
font-weight: bold;
}
#issueHead {
border: none;
padding: 2px 5px;
font-size: .75em;
font-weight: normal;
}
.invilab {
display: block;
width: 0;
height: 0;
font-size: 0;
}
fieldset {
border: 2px solid var(--theme-color-j);
width: 92%;
border-radius: 5px;
padding: 5px;
transition: border-color .5s;
}
fieldset legend, #swopt legend, #swopt p {
color: var(--theme-color-j);
font-size: 12px;
font-weight: bold;
transition: color .5s;
}
fieldset:focus-within,
#swopt.inst fieldset {
border: 2px solid var(--theme-color-a);
}
fieldset:focus-within legend,
#swopt.inst legend,
#swopt.inst p {
color: var(--theme-color-a);
}
#addprvw {
height: -webkit-max-content;
height: -moz-max-content;
height: max-content;
padding: 5px;
font-size: .9em;
font-family: monospace;
color: var(--theme-color-a);
background: var(--theme-color-h);
word-break: break-all;
line-height: 1.5em;
}
.basecont {
color: var(--theme-color-a);
}
.keycont,.qapappl {
color: var(--prvw-key);
}
.qapplat {
color: var(--prvw-plat);
}
.qapfrom {
color: var(--prvw-from);
}
#prvui {
padding-bottom: 0;
}
.topwin {
z-index: 9 !important;
}
.circle {
width: 1.25em;
height: 1.25em;
background: var(--theme-color-a);
border-radius: 100%;
padding: 0 !important;
}
#btnDark {
margin: .25em .5em;
}
#mask {
background: var(--theme-color-b);
transform: translate(30%,-100%);
}
#btnDark.dark #mask {
transform: translate(25%,-15%);
}
#outside {
position: absolute;
left: -110%;
top: -110%;
}
#dragger {
position: absolute;
top: 0;
left: 0;
width: -webkit-max-content;
width: -moz-max-content;
width: max-content;
padding: .25em;
border-radius: .25em;
color: var(--theme-color-c);
background: var(--theme-color-a);
}
@media only screen and (max-width: 330px) {
#modeopt button {
padding: 3px;
}
#addui {
top:10px;
left:0;
}
}
@media only screen and (min-width: 331px) and (max-width: 640px) {
#modeopt button {
padding: 3px 4px;
}
}
@media only screen and (max-width: 640px) {
textarea {
height: 146px;
width: 94%;
}
#baseopt {
padding: 5px;
}
#modeopt div {
padding: 0 5px;
}
#ua {
width: 80%;
top: 30%;
left: 8.5%;
}
#class {
width: 65%;
}
#prvui {
width: 80%;
top: 40%;
left: 8.5%;
}
#addui, #class {
top:10px;
left:10px;
}
fieldset {
min-width: 16.5em;
}
.atab > label input,
.classPart > label input {
min-width: 12rem;
}
.msel {
min-width: 13.5em;
padding: 0 5px;
}
}
@media only screen and (min-width: 640px) {
body {
width: 500px;
margin: 2px auto;
}
#baseopt {
padding: 5px .5em;
line-height: 19px;
}
#modeopt div {
padding: 0 .5em;
}
textarea {
height: 10em;
width: 97%;
}
#ua {
width: 40em;
top: 6em;
left: 35%;
}
#class {
width: 24em;
top: 5px;
left: 45%;
}
#addui {
left: 40%;
top: 1em;
}
#prvui {
left: 35%;
top: 18em;
width: 24em;
}
fieldset {
min-width: 21.75em;
}
.atab > label input,
.classPart > label input {
min-width: 13rem;
}
.msel {
min-width: 19.5em;
padding: 0 2px 2px;
}
}
</style>
</head>
<body>
<div id='outside'>
<span id='dragger'></span>
</div>
<p id="version"></p>
<div id="option">
<div id="base">
<div class="setHead"><p>基础 UA</p></div>
<div id="baseopt"></div>
</div>
<div id="mode">
<div class="setHead"><p>生成模式</p></div>
<div id="modeopt">
<div>
<label for="gen" tabindex="0">
<input id="gen" type="radio" name="mode" value="gen" class="orig-box" checked="checked"/><strong>生成</strong>
</label>
<label for="add" tabindex="0">
<input id="add" type="radio" name="mode" value="add" class="orig-box"/><strong>追加</strong>
</label>
</div>
<div class="btnGrp">
<div id='btnDark' class="circle">
<div id='mask' class="circle"></div>
</div>
<button type="button" id="openClass">标签筛选</button>
<button type="button" id="openUA">UA 窗口</button>
</div>
</div>
</div>
</div>
<div id="searchbox">
<label for="search" class="invilab">在此输入搜索 APP ...</label>
<input id="search" name="search" type="text" placeholder="在此输入搜索 APP ..."/>
</div>
<div id="app">
<form id="app_container">
<p id="nulltext" class="none">什么都没找到 T_T</p>
</form>
<p id="ajump" class="none"></p>
</div>
<div id="action" class="btnGrp">
<button type="button" id="btnHelp">帮助</button>
<button type="button" id="btnCSel">清空选择</button>
<button type="button" id="openNew">+</button>
<button type="button" id="btnSlst">列出已选</button>
<button type="button" id="btnGen">生成 UA</button>
</div>
<div id="ua" class="none win">
<div class="titlebar">
<div class="title">UA 窗口</div>
<button type="button" class="titbtn topbutton">置顶</button>
<button type="button" class="titbtn close">关闭</button>
</div>
<label for="useragent" class="invilab">UA 编辑框</label>
<textarea id="useragent" placeholder="你想要的在这儿 ^_^"></textarea>
<div id="issues"></div>
<div id="action2" class="btnGrp">
<button type="button" id="btnClUA">清空</button>
<button type="button" id="btnCpUA">复制</button>
</div>
</div>
<div id="class" class="none win">
<div class="titlebar">
<div class="title">标签筛选</div>
<button type="button" class="titbtn topbutton">置顶</button>
<button type="button" class="titbtn close">关闭</button>
</div>
<div id="classBox"></div>
<div id="action3" class="btnGrp">
<button type="button" id="btnTgAl">恢复</button>
<button type="button" id="btnTgRv">反选</button>
</div>
</div>
<div id="prvui" class="none win">
<div class="titlebar">
<div class="title">编辑预览</div>
<button type="button" class="titbtn topbutton">置顶</button>
<button type="button" class="titbtn close">关闭</button>
</div>
<p id="nullprvw">空 *w*</p>
<div id="addprvw" class="none"></div>
</div>
<div id="addui" class="none win">
<div class="titlebar">
<div class="title">添加项目</div>
<button type="button" class="titbtn prev">预览</button>
<button type="button" class="titbtn topbutton">置顶</button>
<button type="button" class="titbtn close">关闭</button>
</div>
<div id="addtype">
<label tabindex="0">
<input id="Raapp" type="radio" name="atype" value="aapp" class="orig-box" checked="checked"/><strong>APP</strong>
</label>
<label tabindex="0">
<input id="Rqapp" type="radio" name="atype" value="qapp" class="orig-box"/><strong>快应用</strong>
</label>
<label tabindex="0">
<input id="Ratag" type="radio" name="atype" value="atag" class="orig-box"/><strong>标签</strong>
</label>
<label tabindex="0">
<input id="Rasty" type="radio" name="atype" value="asty" class="orig-box"/><strong>设置</strong>
</label>
</div>
<div id="addlayer">
<div id="addtable">
<form id="aappt" class="atab">
<label id="akeyl"><strong>标识</strong>
<input id="akey" type="text" name="aapp" class="key" placeholder="首字母对应名称拼音首字母"/>
</label>
<label id="asell" class="none"><strong>标识</strong>
<select id="asel" class="msel">
<option selected hidden disabled value="">请选择要修改的项目...</option>
</select>
</label>
<label><strong>名称</strong>
<input id="atext" type="text" name="aapp" placeholder="显示名称,最好是 APP 名称"/>
</label>
<div id="apre">
<p>前置</p>
<label tabindex="0">
<input id="apret" type="radio" name="apre" value="true" class="orig-box"/>
<span class="new-style new-radio"></span>是
</label>
<label tabindex="0">
<input id="apref" type="radio" name="apre" value="false" class="orig-box" checked="checked"/>
<span class="new-style new-radio"></span>否
</label>
<label tabindex="0">
<input id="apreb" type="radio" name="apre" value="both" class="orig-box"/>
<span class="new-style new-radio"></span>前后都有
</label>
</div>
<div id="afol">
<p>无缝</p>
<label tabindex="0">
<input id="afolt" type="radio" name="afol" value="true" class="orig-box"/>
<span class="new-style new-radio"></span>是
</label>
<label tabindex="0">
<input id="afolf" type="radio" name="afol" value="false" class="orig-box" checked="checked"/>
<span class="new-style new-radio"></span>否
</label>
</div>
<label class="acont1"><strong>关键字</strong>
<input id="acont1" type="text" name="acont1"/>
</label>
<label class="acont2 none"><strong>前置关键字</strong>
<input id="acont2a" type="text" name="acont2"/>
</label>
<label class="acont2 none"><strong>后置关键字</strong>
<input id="acont2b" type="text" name="acont2"/>
</label>
<div id="acls">
<div id="aclsbox" class="classBox"></div>
<div id="aclsboxt" class="classPart">
<label id="aclsboxl" class="none"><strong>自定义标签</strong>
<input id="athirdt" type="text" name="athird"/>
</label>
</div>
</div>
</form>
<form id="qappt" class="atab none">
<label id="qkeyl"><strong>标识</strong>
<input id="qkey" type="text" name="qapp" class="key" placeholder="首字母对应名称拼音首字母"/>
</label>
<label id="qsell" class="none"><strong>标识</strong>
<select id="qsel" class="msel">
<option selected hidden disabled value="">请选择要修改的项目...</option>
</select>
</label>
<label><strong>名称</strong>
<input id="qtext" type="text" name="qapp" placeholder="显示名称,最好是快应用名称"/>
</label>
<label><strong>平台</strong>
<input id="qcont1" type="text" name="qcont"/>
</label>
<label><strong>来自</strong>
<input id="qcont2" type="text" name="qcont"/>
</label>
<label><strong>应用</strong>
<input id="qcont3" type="text" name="qcont"/>
</label>
<div id="qcls">
<div id="qclsbox" class="classBox"></div>
<div id="qclsboxt" class="classPart">
<label id="qclsboxl" class="none"><strong>自定义标签</strong>
<input id="qthirdt" type="text" name="qthird"/>
</label>
</div>
</div>
</form>
<form id="atagt" class="atab none">
<label id="tkeyl"><strong>标识</strong>
<input id="tkey" type="text" name="atag" class="key" placeholder="数字和英文字母"/>
</label>
<label id="tsell" class="none"><strong>标识</strong>
<select id="tsel" class="msel">
<option selected hidden disabled value="">请选择要修改的项目...</option>
</select>
</label>
<div id="ttexd">
<label for="ttext" id="ttexl"><strong>名称</strong></label>
<div id="tkds">
<div id="tclsbox" class="flag"></div>
<span>
<input id="ttext" type="text" name="atag" placeholder="标签名"/>
</span>
</div>
</div>
<label><strong>背景</strong>
<input id="tbgc" type="color" name="atag" value="#000000"/>
</label>
<label><strong>文字</strong>
<input id="tfgc" type="color" name="atag" value="#ffffff"/>
</label>
</form>
</div>
<div id="addbtn" class="btnGrp">
<button type="button" id="aok">加入</button>
<button type="button" id="aclear">清空表单</button>
<button type="button" id="anew">管理</button>
<button type="button" id="adel">删除</button>
</div>
<div id="addsave">
<label for="stordata" class="invilab">复制到这里就可以导入啦</label>
<textarea id="stordata" placeholder="复制到这里就可以导入啦"></textarea>
<div class="savebtn">
<div class="btnGrp">
<button type="button" id="ssave">保存数据</button>
<button type="button" id="scopy">复制内容</button>
<button type="button" id="sdele">清空内容</button>
</div>
<div class="btnGrp">
<button type="button" id="simp">导入数据</button>
<button type="button" id="sexp">导出数据</button>
<button type="button" id="sclr">清空存储</button>
</div>
</div>
</div>
</div>
<div id="setlayer" class="none">
<fieldset>
<legend>亮色主题</legend>
<label for="stylight" class="invilab">亮色主题</label>
<textarea id="stylight" placeholder="亮色主题 CSS"></textarea>
</fieldset>
<fieldset>
<legend>暗色主题</legend>
<label for="stydark" class="invilab">暗色主题</label>
<textarea id="stydark" placeholder="暗色主题 CSS"></textarea>
</fieldset>
<div class="savebtn btnGrp">
<button type="button" id="stysave">保存主题</button>
<button type="button" id="styclr">清空主题</button>
</div>
<div id="swopt" class="none">
<fieldset>
<legend>离线缓存</legend>
<p>服务状态:<span id="swstat"></span></p>
<p>缓存文件:<span id="swlen"></span>个</p>
</fieldset>
<div class="savebtn btnGrp">
<button type="button" id="swclr">删除缓存</button>
<button type="button" id="swreg">安装服务</button>
</div>
</div>
</div>
</div>
<div id="toast"></div>
<div id="load">
<p id="loadstr">正在加载...</p>
<p id="browstr">
这个页面至少需要:<br/>
Chrome 60<br/>
Edge 79<br/>
Firefox 52<br/>
Safari 11<br/>
Opera 47<br/>
不支持 Internet Explorer !<br/><br/>
当前浏览器的 UA:<br/>
<code>
<script>document.write(navigator.userAgent)</script>
</code>
</p>
</div>
<noscript><strong>亲,打开 JavaScript 才能工作哟!</strong></noscript>
<script>
const uaCode = (() => {
let lab,cas,lah,ntx,loc,pos=[0,0];
function $(all,sel) {
return (all) ? document.querySelectorAll(sel) : document.querySelector(sel);
}
function $_(name) {
const list = $(true,`input[name="${name}"]:checked`);
return list.length === 1 && list[0].type === "radio" ? list[0] : list;
}
function _(ele,del,nclass = "none") {
return (del) ?
ele.classList.remove(nclass) :
ele.classList.add(nclass);
}
function __(prop) {
return getComputedStyle(document.all[0]).getPropertyValue('--' + prop);
}
function getUpperHead(word) {
const temp = word.slice(0,1).toUpperCase();
return /^[A-Z]$/u.test(temp) ? temp : uaData.设置.数字记号;
}
function scanAll() {
for (let ele of lah) {
if (window.getComputedStyle(ele).display!=="none") {
return true;
}
};
}
function scanForHead() {
let found;
cas.forEach( ele => {
found = false;
for (let la of lab) {
if (getUpperHead(la.id) === ele.innerHTML && getComputedStyle(la).display !== "none") {
found = true;
break;
}
};
_(ele,found);
});
}
function tagConv(clas,fro,to) {
if (clas.slice(0,1)==="_") {
return (to) ? clas.slice(1) : "third" ;
} else if (fro===to) {
return clas;
} else {
return (fro) ? uaData.tagfind.get(clas) : uaData.flag[clas][0];
}
}
function toast(text,time = 3) {
if (window.mbrowser && window.mbrowser.showToast) {
window.mbrowser.showToast(text);
} else if (window.via && window.via.toast) {
window.via.toast(text);
} else if (window._obj) {
window._obj.toast(text);
} else if (window.H5EXT) {
window.H5EXT.cmd(99,text);
} else if (window.meta) {
window.meta.toast(text,time,null);
} else if (window.mx_browser_obj && window.mx_browser_obj.showtip) {
window.mx_browser_obj.showtip(text);
} else if (window.JSInterface && window.JSInterface.syslog) {
window.JSInterface.syslog(text);
} else if (window.plugin) {
window.plugin.makeToast(text);
} else if (window.mdhtml) {
window.mdhtml.mdts(text);
} else {
$(false,"#toast").innerHTML = text;
$(false,"#toast").style.cssText = `display: block;animation: toast ${time}s ease;-webkit-animation: toast ${time}s ease;`;
}
}
function spaceChecked(e) {
switch (e.code) {
case "Space":
case "Enter":
e.target.control.click();
break;
default:
return;
}
}
function insertUA(e) {
const win = $(false,"#ua"),
value = e.dataTransfer.getData('text'),
appo = uaData.apps[value];
let result = ['',''], baseUA = $(false,"textarea").value,
space = (baseUA.slice(-1)==' ');
e.preventDefault();
if (typeof appo.content === "object") {
if (appo.content.qBasic) {
appo.content = `${appo.content.qBasic} ${appo.content.qString} (${JSON.stringify({
packageName: appo.content.qFrom,
type: "url",
extra: {
scene: "recommend"
}
})})`;
}
}
if (appo.prefix) {
if (appo.followed) {
result[0] = appo.content;
} else {
result[0] = `${appo.content} `;
}
} else if (appo.content instanceof Array) {
if (appo.followed) {
result[0] = appo.content[0] ;
result[1] = appo.content[1];
} else {
result[0] = `${appo.content[0]} `;
result[1] = `${appo.content[1]} `;
}
} else {
if (appo.followed) {
result[1] = appo.content;
} else {
result[1] = `${appo.content} `;
}
}
if (appo.followed && !appo.prefix && space) baseUA = baseUA.slice(0,-1);
$(false,"textarea").value = result[0] + baseUA + result[1];
issuesCheck();
winActiv(win);
}
function genUA() {
const baseUA = $_("mode").value === "add" ?
$(false,"textarea").value :
uaData.base[$_("base").value].content,
midSpace = /.+\s.+/u, win = $(false,"#ua");
let prefixUA = "",
preFollowUA = "",
suffixUA = " ",
sufFollowUA = "";
$_("app").forEach( app => {
const appo = uaData.apps[app.value];
if (typeof appo.content === "object") {
if (appo.content.qBasic) {
appo.content = `${appo.content.qBasic} ${appo.content.qString} (${JSON.stringify({
packageName: appo.content.qFrom,
type: "url",
extra: {
scene: "recommend"
}
})})`;
}
}
if (appo.prefix) {
if (appo.followed) {
preFollowUA = midSpace.test(appo.content) ?
appo.content + preFollowUA :
preFollowUA + appo.content ;
} else {
prefixUA = `${appo.content} ${prefixUA}`;
}
} else if (appo.content instanceof Array) {
if (appo.followed) {
preFollowUA = midSpace.test(appo.content[0]) ?
appo.content[0] + preFollowUA :
preFollowUA + appo.content[0] ;
sufFollowUA = midSpace.test(appo.content[1]) ?
sufFollowUA + appo.content[1] :
appo.content[1] + sufFollowUA ;
} else {
prefixUA = `${appo.content[0]} ${prefixUA}`;
suffixUA += `${appo.content[1]} `;
}
} else {
if (appo.followed) {
sufFollowUA = midSpace.test(appo.content) ?
sufFollowUA + appo.content :
appo.content + sufFollowUA ;
} else {
suffixUA += `${appo.content} `;
}
}
});
$(false,"textarea").value = prefixUA + preFollowUA + baseUA + sufFollowUA + suffixUA;
issuesCheck();
_(win,true);
winActiv(win);
}
function makeIssue(issue,head) {
let p = document.createElement('p');
p.className = "issue";
p.id = (head) ? 'issueHead' : '';
p.innerHTML = issue;
return p;
}
function issuesCheck() {
const ua = $(false,"textarea").value, ibox = $(false,'#issues'),
issue = [
[ // #1 百度 页面 确认框
( ua.includes('baiduboxapp/') && (
(/\(.*Android.*\)/.test(ua) &&
/Android[^\)]*\)+?/.exec(ua)[0].includes(' ') &&
!/Android[^\s]+;?[^\s]+[\w]+.*\)+?/u.test(ua)) ||
(!/ (lite|info|pro|mission) baiduboxapp/.test(ua) &&
/baiduboxapp\/\d*/.test(ua)))),
'此 UA 可能会导致 百度部分页面 加载时弹出 确认/取消 对话框'
],[ // #1+ 百度 APP
ua.includes('baiduboxapp/'),
'任何使用百度 APP 的 UA,<br>都有可能出现以下情况: <br>\n\
1. 新闻 / 资讯里的 百家号 文章 无法打开<br>\n\
2. " Ta 在百度 " 里的动态无法打开<br>\n\
3. 搜索结果中,笔记 频道内容为空<br>\n\
4. 搜索结果可能会变得非常少'
],[ // #2 城通 下载按钮 失效
ua.includes('baidu'),
'此 UA 可能会导致大部分 城通网盘 下载按钮 失效'
],[ // #3 iPhone 下载 APP 跳到 AppStore
( ua.includes('iPhone') && ua.includes('AppleWebKit') ),
'此 UA 可能会导致 百度搜索 下载 APP 跳转到苹果的 AppStore'
],[ // #4 腾讯视频 页面 确认框
( ua.includes('Android') && ua.includes('qqnews') ),
'此 UA 可能会导致 腾讯视频播放页面 加载时弹出 确认/取消 对话框'
],[ // #5 蓝奏云 mtt: 确认框
( /\(.*Android.*\)/.test(ua) && ua.includes('MQQBrowser/') && ( ver = /MQQBrowser\/\d*/.exec(ua)[0].replace('MQQBrowser/',''), ver >= 5 )),
'此 UA 可能会导致 蓝奏云部分页面 加载广告时弹出 确认/取消 对话框'
],[ // #6 淘宝 windvine 确认框
( ua.includes('Android') && /WindVane\/\d+\.\d+\.\d+/.test(ua) && ( ver = /WindVane\/\d+/.exec(ua)[0].replace('WindVane/',''), ver >= 1 )),
'此 UA 可能会导致 淘宝部分页面 加载时弹出 确认/取消 对话框'
],[ // #7 知乎电脑版
( ua.includes('Android') && !ua.includes('Mobile') ),
'此 UA 可能会导致 知乎 显示电脑版页面'
]
];
let count = 0, hasHead = false;
$(false,'#issues').innerHTML = '';
issue.forEach( i => {
if (i[0]) {
count++;
if (!hasHead) {
ibox.appendChild(makeIssue('',true));
hasHead = true;
}
ibox.appendChild(document.createElement('hr'));
ibox.appendChild(makeIssue(i[1],false));
};
});
if (count>0) {
$(false,'#issueHead').innerHTML = `检测到 ${count} 个问题 :`
};
}
function makeFlagDiv(clas,box,chinese) {
const flag = document.createElement("strong");
flag.className = "flag";
flag.innerHTML = tagConv(clas,chinese,true);
clas = tagConv(clas,chinese,false);
if (!box) { _(flag,false,`T${clas}`); }
flag.style.cssText = `background-color:${uaData.flag[clas][1]};color:${uaData.flag[clas][2]}`;
return flag;
}
function makeHeadandLink(first) {
const head = document.createElement("div");
Object.assign(head,{
id: `i${first}`,
innerHTML: first,
className: "CaseHead"
});
if(!uaData.touch) {
const jump = document.createElement("a");
Object.assign(jump,{
href: `#i${first}`,
innerHTML: first
});
$(false,"#ajump").appendChild(jump);
} else {
uaData.index += first;
}
return head;
}
function pushTagText(cls,app) {
if (!uaData.tagtext[cls]) { uaData.tagtext[cls] = []; }
uaData.tagtext[cls].push(app);
}
function parseClassinItem(lab,app) {
let count = 0;
if (uaData.apps[app].class.length===0) {
pushTagText("no_tag",app);
lab.className = "no_tag";
return 1;
} else {
uaData.apps[app].class.forEach( cls => {
if (cls.slice(0,1)==="_" || uaData.tagfind.has(cls)) {
count += 1;
lab.appendChild(makeFlagDiv(cls,false,true));
cls = tagConv(cls,true,false);
pushTagText(cls,app);
_(lab,false,cls);
} else {
toast(`项目 "${app}" 被指定了不存在的标签 "${cls}" ...`);
uaData.stor.apps[app].class.splice(
uaData.stor.apps[app].class.findIndex( v => v === cls ),1
);
loc.setItem(uaData.storKey,JSON.stringify(uaData.stor));
window.location.reload();
}
});
return count;
}
}
function newBox(type) {
const box = document.createElement("span");
box.className = `new-style new-${type}`;
return box;
}
function makeItem() {
let ofirst = "Z",cont = $(false,"#app_container");
Object.keys(uaData.apps).sort().forEach( app => {
uaData.text.set(app, uaData.apps[app].text);
const lab = document.createElement("label"),
box = document.createElement("input"),
text = document.createElement("span"),
first = getUpperHead(app);
Object.assign(lab, {
id: app,
tabIndex: 0,
draggable: true
});
text.innerHTML = uaData.apps[app].text;
lab.appendChild(text);
uaData.count[app] = parseClassinItem(lab,app);
Object.assign(box, {
type: "checkbox",
name: "app",
value: app,
className: "orig-box",
tabIndex: -1
});
lab.appendChild(box);
lab.appendChild(newBox("check"));
if (first!==ofirst) {
cont.appendChild(makeHeadandLink(first));
ofirst = first;
}
cont.appendChild(lab);
});
if (uaData.touch) {
uaData.indexSidebar1 = new IndexSidebar({
mounted: document.querySelector('#app')
});
} else {
_($(false,'#ajump'),true);
_(cont,!1,'fixed');
};
}
function makeFlaginBox() {
Object.keys(uaData.flag).forEach( flag => {
const lab = document.createElement("label"),
box = document.createElement("input");
lab.id = `L${flag}`;
lab.tabIndex = 0;
Object.assign(box, {
type: "checkbox",
name: "flag",
id: `B${flag}`,
value: flag,
checked: true
});
box.addEventListener('change', e => tagClick(e.target.parentNode.id));
lab.appendChild(box);
lab.appendChild(makeFlagDiv(flag,true,false));
$(false,"#classBox").appendChild(lab);
});
}
function makeBaseRadio() {
Object.keys(uaData.base).forEach( (base,i) => {
const lab = document.createElement("label"),
box = document.createElement("input"),
bob = document.createElement("strong");
lab.for = base;
lab.tabIndex = 0;
Object.assign(box, {
type: "radio",
name: "base",
id: base,
value: base,
className: "orig-box",
tabIndex: -1,
checked: (uaData.设置.基础默认==i+1)
});
bob.innerHTML = uaData.base[base].text;
lab.appendChild(box);
lab.appendChild(bob);
$(false,"#baseopt").appendChild(lab);
});
}
function winActiv(awin) {
let wing = $(true,".win");
wing.forEach( win => {
if (win.style.zIndex>awin.style.zIndex) {
win.style.zIndex--;
}
});
awin.style.zIndex = wing.length + 1;
}
function dndWin() {
let wing = $(true,".win"), unlock = () => document.onmousemove = null;
wing.forEach( (win,i) => win.style.zIndex = i + 2 );
if (uaData.touch) {
wing.forEach( win => {
win.addEventListener('touchstart', e => {
if (e.target.nodeName!=="TEXTAREA" &&
e.target.type!=="text" &&
!$(false,'#issues').contains(e.target)) {
pos = [
(e.touches[0].clientX - win.offsetLeft),
(e.touches[0].clientY - win.offsetTop)
];
}
winActiv(win);
},{ passive: true });
win.addEventListener('touchmove', e => {
if (e.target.nodeName!=="TEXTAREA" &&
e.target.type!=="text" &&
!$(false,'#issues').contains(e.target)) {
win.style.left = (e.touches[0].clientX - pos[0]) + 'px';
win.style.top = (e.touches[0].clientY - pos[1]) + 'px';
}
win.style.position = (
parseInt(getComputedStyle(win)['right']) < 0 ||
parseInt(getComputedStyle(win)['left']) < 0 ||
parseInt(getComputedStyle(win)['bottom']) < 0) ?
'fixed' : 'absolute' ;
},{ passive: true });
});
} else {
wing.forEach( win => {
win.addEventListener('mousedown', e => {
pos = [
(e.clientX - win.offsetLeft),
(e.clientY - win.offsetTop)
];
winActiv(win);
if(e.target.nodeName!=="TEXTAREA" &&
e.target.type!=="text" &&
e.target.nodeName!=="SELECT" &&
e.target.className!=="flag") {
document.onmousemove = e => {
win.style.left = (e.clientX - pos[0]) + 'px';
win.style.top = (e.clientY - pos[1]) + 'px';
};
};
document.removeEventListener('mouseup', unlock);
document.addEventListener('mouseup', unlock);
});
});
}
}
function openWin(id) {
let win = $(false,id);
win.classList.toggle('none');
if (!win.classList.contains('none')) winActiv(win);
}
function topwin(e) {
let btn = e.target, win = btn.parentNode.parentNode;
win.classList.toggle('topwin');
btn.style.backgroundColor = (win.classList.contains('topwin')) ?
__('theme-color-top-enable') : __('theme-color-top');
}
function filterExec(item,nclass) {
let found;
lab.forEach( ele => {
found = false;
for (let val of item) {
if (val===ele.id) {
found = true;
break;
}
}
_(ele,found,nclass);
});
scanForHead();
_(ntx,!scanAll());
}
function filterResume(nclass) {
lah.forEach( ele => _(ele,true,nclass));
scanForHead();
_(ntx,!scanAll());
}
function fltAppUA(e) {
let word = e.target.value;
if (word==="") {
filterResume("none");
} else {
const item = [];
for (let [k,v] of uaData.text) {
v.toLowerCase().includes(word.toLowerCase()) && item.push(k);
}
filterExec(item,"none");
}
}
function fltAppUASelected(e) {
let btn = e.target;
if (btn.innerHTML==="列出已选") {
const item = [];
$_("app").forEach( ele => item.push(ele.value));
filterExec(item,"sel_none");
btn.innerHTML = "列出全部";
} else {
filterResume("sel_none");
btn.innerHTML = "列出已选";
}
}
function fltAppUATag(clas,selected) {
$(true,`.T${clas}`).forEach( tag => _(tag,selected) );
if (uaData.tagtext[clas]) {
uaData.tagtext[clas].forEach( id => {
(selected) ? uaData.count[id]++ : uaData.count[id]--;
});
}
const item = Object.keys(uaData.count).filter(obj => uaData.count[obj]!==0);
filterExec(item,"tag_none");
}
function tagClick(id) {
const box = $(false,`#${id} input`),
flag = $(false,`#${id} .flag`);
fltAppUATag(id.slice(1),box.checked);
$(false,'#openClass').style.backgroundColor = ($(true,'#classBox input:not(:checked)').length===0) ? '' : __('tag-filtered');
}
/* "添加" 窗口表单 相关 */
function aform_tType(type) {
return (type.slice(1)==="app") ? type.slice(0,1) : "t";
}
function aform_switchModify() {
const type = aform_tType($_("atype").value),
sel = $(false,`#${type}sell`),
key = $(false,`#${type}keyl`),
btn = $(false,'#anew'),
ok = $(false,'#aok'),
mod = (btn.innerHTML==="管理");
_(key,!mod);
_(sel,mod);
btn.innerHTML = (mod) ? "添加" : "管理";
ok.innerHTML = (mod) ? "确定" : "加入";
aform_Clear();
}
function aform_switchCard() {
const val = $_("atype").value,set = (val==="asty");
_($(false,'#setlayer'),set);
_($(false,'#addlayer'),!set);
if (!set) {
$(true,".atab").forEach( tab => {
if (tab.id===`${val}t`) {
_(tab,true);
$(false,'#anew').innerHTML = "添加";
aform_switchModify();
} else {
_(tab,false);
}
});
}
}
function aform_switchBoth() {
const val = ($_("apre").value==="both");
$(true,".acont2").forEach( input => _(input,val) );
_($(false,".acont1"),!val);
}
function aform_makeFlaginBox() {
$(true,".classBox").forEach( sbox => {
Object.keys(uaData.flag).forEach( flag => {
if (flag!=="qapp" && flag!=="no_tag") {
const lab = document.createElement("label"),
box = document.createElement("input");
lab.id = `${getUpperHead(sbox.id)}${flag}`;
lab.tabIndex = 0;
Object.assign(box, {
type: "checkbox",
name: "sflag",
id: `${sbox.id.slice(0,1)}${flag}`,
value: flag,
checked: false
});
if (flag==="third") {
box.addEventListener('change', e =>
_($(false,`#${sbox.id}l`),box.checked)
);
}
lab.appendChild(box);
lab.appendChild(makeFlagDiv(flag,true,false));
sbox.appendChild(lab);
}
});
});
}
function aform_updateFlagPreview() {
const box = $(false,'#tclsbox'),
txt = $(false,'#ttext').value;
box.innerHTML = txt;
_(box,txt!=="");
box.style.cssText =
`background-color:${$(false,'#tbgc').value};color:${$(false,'#tfgc').value}`;
}
function aform_Clear() {
$(true,'#addtable input[type="text"], #tkds').forEach( i => {
i.style.removeProperty('border-color');
});
_($(false,`#aclsboxl`),false);
_($(false,`#qclsboxl`),false);
$(true,'#addtable form').forEach( f => f.reset() );
aform_updateFlagPreview();
aform_switchBoth();
}
function aform_Check(type) {
let a = true;
$(true,`#${type}t input[type="text"]`).forEach( i => {
i.style.removeProperty('border-color');
if (getComputedStyle(i).display!=="none" &&
getComputedStyle(i.parentNode).display!=="none" &&
i.value==="") {
if (i.id==="ttext") {
$(false,'#tkds').style.borderColor = __('input-check-null');
} else {
i.style.borderColor = __('input-check-null');
}
a = false;
}
});
return (a && $(false,'#anew').innerHTML==="管理") ? aform_KeyCheck(true) : a ;
}
function aform_KeyCheck(show) {
const type = aform_tType($_('atype').value), test = /^\w+$/u;
let inp = $(false,`#${type}key`), key = inp.value, bor = inp,
src = (type==="t") ? 'flag' : 'apps';
if (type==='t' && key.slice(0,1)==="_") {
bor.style.borderColor = __('input-check-err');
if(show){ toast('"_" 开头用于自定义标签'); }
return false;
}
if (key in uaData[src]||key in uaData.stor[src]) {
bor.style.borderColor = __('input-check-err');
if(show){ toast('标识重复'); }
return false;
}
if (key==="") {
bor.style.removeProperty('border-color');
return false;
} else if (!test.test(key)) {
bor.style.borderColor = __('input-check-err');
if(show){ toast('输入错误'); }
return false;
} else {
bor.style.borderColor = __('input-check-ok');
return true;
}
}
function aform_Add() {
const atyp = $_("atype").value;
let key,cont,obj,typr;
if (!aform_Check(atyp)) { return; }
typr = aform_tType(atyp);
key = ($(false,'#anew').innerHTML==="管理") ?
$(false,`#${typr}key`).value :
$(false,`#${typr}sel`).value ;
if (key==="" && $(false,'#anew').innerHTML==="添加") {
toast("请选择需要修改的项目");
return;
}
switch (typr) {
case "a":
cont = ($_("apre").value!=="both") ?
$(false,"#acont1").value : [
$(false,"#acont2a").value,
$(false,"#acont2b").value ];
break;
case "q":
cont = {
qBasic: $(false,"#qcont1").value,
qFrom: $(false,"#qcont2").value,
qString: $(false,"#qcont3").value,
};
break;
}
if (atyp==="atag") {
obj = [
$(false,'#ttext').value,
$(false,'#tbgc').value,
$(false,'#tfgc').value
]
Object.assign(uaData.stor.flag, { [`${key}`]: obj });
} else {
obj = {
text: $(false,`#${typr}text`).value,
prefix: (atyp==="qapp"||$_("apre").value==="both") ? false :
($_("apre").value==='true'),
followed: (atyp==="qapp") ? false : ($_("afol").value==='true'),
content: (atyp==="qapp") ? {
平台:cont.qBasic,
来自:cont.qFrom,
应用:cont.qString
} : cont,
class: []
}
$_("sflag").forEach( inp => {
if(inp.id.slice(1)==="third") {
obj.class.push("_" + $(false,`#${typr}thirdt`).value);
} else {
obj.class.push(tagConv(inp.id.slice(1),false,true));
}
});
if (atyp==="qapp") {
obj.class.push("快应用");
}
Object.assign(uaData.stor.apps, {
[`${key}`]: {
名称: obj.text,
前置: (obj.prefix) ? "是" : "不是",
无缝: (obj.followed) ? "是" : "不是",
标签: obj.class,
内容: obj.content
}
});
}
if ($(false,'#anew').innerHTML==="管理") {
$(false,`#${typr}sel`).insertBefore(
new Option((atyp==="atag") ?
`${obj[0]} (${key})` : `${obj.text} (${key})`,
key), $(false,`#${typr}sel`)[1]
);
aform_Clear();
} else {
$(false,`#${typr}sel option[value="${key}"]`).innerHTML = (atyp==="atag") ?
`${obj[0]} (${key})` :`${obj.text} (${key})`;
aform_Clear();
}
$(false,'#ssave').style.backgroundColor = __('data-need-save');
if ($(false,'#aok').innerHTML==="加入") {
toast('加入成功');
} else {
toast('修改成功');
}
}
function aform_Modify() {
const type = aform_tType($_("atype").value),
item = $(false,`#${type}sel`).value;
let obj,cobj,cont,chk;
function tagParse(tags) {
let ccls = [];
tags.forEach( ct => {
ccls.push((ct.slice(0,1)==="_") ? ct : uaData.tagfind.get(ct));
});
return ccls;
}
switch (type) {
case "t" :
obj = (uaData.stor.flag[item]) ? uaData.stor.flag[item] : uaData.flag[item];
break;
default:
if (uaData.stor.apps[item]) {
cobj = uaData.stor.apps[item];
if (typeof cobj["内容"] === "object") {
if (cobj["内容"] instanceof Array) {
cont = [cobj["内容"][0],cobj["内容"][1]];
} else {
cont = {
qBasic: cobj["内容"]["平台"],
qFrom: cobj["内容"]["来自"],
qString: cobj["内容"]["应用"]
}
}
} else {
cont = cobj["内容"];
}
obj = {
text: cobj["名称"],
prefix: (cobj["前置"]==="是") ? true : false,
followed: (cobj["无缝"]==="是") ? true : false,
class: tagParse(cobj["标签"]),
content: cont
}
} else {
obj = JSON.parse(JSON.stringify(uaData.apps[item]));
obj.class = tagParse(obj.class);
}
break;
}
function clsSet(obj,type) {
$(true,`#${type}clsbox input`).forEach( c => { c.checked = false; });
_($(false,`#${type}clsboxl`),false);
obj.class.forEach( cls => {
if (cls!=="qapp") {
if (cls.slice(0,1)==="_") {
$(false,`#${type.toUpperCase()}third input`).checked = true;
_($(false,`#${type}clsboxl`),true);
$(false,`#${type}thirdt`).value = cls.slice(1);
} else {
$(false,`#${type.toUpperCase()}${cls} input`).checked = true;
}
}
});
}
switch (type) {
case "a" :
$(false,"#atext").value = obj.text;
if (obj.content instanceof Array) {
$(false,"#apreb").checked = true;
aform_switchBoth();
$(false,"#acont2a").value = obj.content[0];
$(false,"#acont2b").value = obj.content[1];
} else {
chk = (obj.prefix) ? $(false,"#apret") : $(false,"#apref");
chk.checked = true;
aform_switchBoth();
$(false,"#acont1").value = obj.content;
}
chk = (obj.followed) ? $(false,"#afolt") : $(false,"#afolf");
chk.checked = true;
clsSet(obj,type);
break;
case "q" :
$(false,"#qtext").value = obj.text;
$(false,"#qcont1").value = obj.content.qBasic;
$(false,"#qcont2").value = obj.content.qFrom;
$(false,"#qcont3").value = obj.content.qString;
clsSet(obj,type);
break;
case "t" :
$(false,"#ttext").value = obj[0];
$(false,"#tbgc").value = obj[1];
$(false,"#tfgc").value = obj[2];
aform_updateFlagPreview();
break;
}
}
function aform_Delete() {
let type = aform_tType($_("atype").value),
sel = $(false,`#${type}sel`),
val = sel.value,
opt = $(false,`#${type}sel option[value="${val}"]`),
item = (type==='t') ? uaData.stor.flag[val] : uaData.stor.apps[val];
if ($(false,'#anew').innerHTML==="添加") {
if (val) {
if (item) {
switch (type) {
case "t" :
delete uaData.stor.flag[val];
break;
default:
delete uaData.stor.apps[val];
break;
}
sel.removeChild(opt);
aform_Clear();
$(false,'#ssave').style.backgroundColor = __('data-need-save');
toast('删除成功');
} else {
toast('不能删除自带项目');
}
} else {
toast('没有选择项目');
}
} else {
toast('只能在管理模式下删除项目');
}
}
/* localStorage 相关 */
function lsb_initOption() {
let sel,opt;
if (Object.keys(uaData.stor).length!==0) {
if (uaData.stor.apps) {
Object.keys(uaData.stor.apps).forEach( app => {
opt = new Option(`${uaData.stor.apps[app].名称} (${app})`,app);
sel = (uaData.stor.apps[app].内容.来自) ?
$(false,'#qsel') : $(false,'#asel');
if (sel.length===1) {
sel.appendChild(opt);
} else {
sel.insertBefore(opt,sel[1]);
}
});
}
if (uaData.stor.flag) {
Object.keys(uaData.stor.flag).forEach( tag => {
opt = new Option(`${uaData.stor.flag[tag][0]} (${tag})`,tag);
sel = $(false,'#tsel');
if (sel.length===1) {
sel.appendChild(opt);
} else {
sel.insertBefore(opt,sel[1]);
}
});
}
}
Object.keys(uaData.apps).sort().forEach( app => {
if (!uaData.stor.apps[app]) {
sel = (uaData.apps[app].content.qFrom) ?
$(false,'#qsel') : $(false,'#asel');
sel.appendChild(new Option(`* ${uaData.apps[app].text} (${app})`,app));
}
});
Object.keys(uaData.flag).sort().forEach( tag => {
if (!uaData.stor.flag[tag]) {
$(false,'#tsel').appendChild(
new Option(`* ${uaData.flag[tag][0]} (${tag})`,tag));
}
});
}
function lsb_save() {
if (Object.keys(uaData.stor.apps).length!==0 ||
Object.keys(uaData.stor.flag).length!==0) {
loc.setItem(uaData.storKey,JSON.stringify(uaData.stor));
} else {
window.localStorage.removeItem(uaData.storKey);
}
$(false,'#ssave').style.backgroundColor = '';
toast('保存成功,下次刷新生效');
}
function lsb_export() {
if (loc.hasOwnProperty(uaData.storKey)) {
$(false,"#stordata").value = loc.getItem(uaData.storKey);
} else {
toast('没有自定义数据');
}
}
function lsb_import() {
if ($(false,"#stordata").value!=="") {
try {
const data = JSON.parse($(false,"#stordata").value);
if (loc.hasOwnProperty(uaData.storKey)) {
let odata = JSON.parse(loc.getItem(uaData.storKey));
Object.keys(data).forEach( k => {
if (odata[k]) {
Object.assign(odata[k],data[k]);
} else {
odata[k] = data[k];
}
});
loc.setItem(uaData.storKey,JSON.stringify(odata));
} else {
loc.setItem(uaData.storKey,JSON.stringify(data));
}
$(false,"#stordata").value = "";
toast('导入成功');
} catch(e) {
if (e instanceof SyntaxError) {
toast('导入失败:格式不正确');
} else {
toast(`导入失败:${e}`);
}
}
} else {
toast('没有输入数据');
}
}
function lss_save() {
let obj = {}, thm = {
light: [
Object.values($(false,'#myLight').sheet.cssRules)[0].cssText,
$(false,'#stylight').value
],
dark: [
Object.values($(false,'#myDark').sheet.cssRules)[0].cssRules[0].cssText,
$(false,'#stydark').value
]
}
Object.keys(thm).forEach( th => {
if (thm[th][1]!=='' && thm[th][0]!==thm[th][1]) {
Object.assign(obj, { [th]: (th==='dark') ? `@media (prefers-color-scheme: dark) {\n${thm[th][1]}\n}` : thm[th][1] });
}
})
if (obj!=={}) {
loc.setItem(uaData.styleKey,JSON.stringify(obj));
toast('保存成功,下次刷新生效');
} else {
toast('内容没修改,不用保存');
}
}
function swOpr() {
let opt = uaCode.$(false,'#swopt'),
stat = uaCode.$(false,'#swstat'),
btn = uaCode.$(false,'#swreg'),
swer = navigator.serviceWorker;
swer.getRegistrations().then( regs => {
if (regs.length>=1) {
regs[0].unregister();
opt.classList.remove('inst');
stat.innerHTML = '未安装';
btn.innerHTML = '安装服务';
} else {
swer.register('svcWorker.js').then( reg => {
if (reg.installing) {
stat.innerHTML = '正在安装,刷新后生效';
} else if (reg.waiting) {
stat.innerHTML = '等待安装';
} else if (reg.active) {
stat.innerHTML = '已安装';
}
});
opt.classList.add('inst');
btn.innerHTML = '卸载服务';
}
});
}
function cacheScan() {
caches.keys().then( vers => { $(false,"#swlen").innerHTML = vers.length });
}
function previewUpdate() {
let view = $(false,"#addprvw"), show,
type = aform_tType($_("atype").value),
spanGen = function(text,cls){
let span = document.createElement('span');
(cls) && (_(span,!1,cls));
span.innerText = text;
return span;
};
(view.childElementCount!==0) && (view.innerHTML='');
if (type==='a') {
let pre, base, suf;
if ($_("apre").value==='both') {
pre = $(false,"#acont2a").value;
suf = $(false,"#acont2b").value;
} else {
($_("apre").value==='true') ?
pre = $(false,"#acont1").value :
suf = $(false,"#acont1").value;
}
pre = ($_("afol").value!=='true' && pre) ? pre + ' ' : pre;
suf = ($_("afol").value!=='true' && suf) ? ' ' + suf : suf;
if ($(false,"#atbs").checked) {
base = uaData.base.tbs.content;
} else if ($(false,"#ashort").checked) {
base = uaData.base.short.content;
} else if ($(false,"#apc").checked || $(false,"#aspider").checked) {
base = '';
} else {
base = uaData.base.std.content;
}
(pre) && view.appendChild(spanGen(pre,'keycont'));
view.appendChild(spanGen(base,'basecont'));
(suf) && view.appendChild(spanGen(suf,'keycont'));
} else {
view.appendChild(spanGen($(false,"#qcont1").value+' ','qapplat'));
view.appendChild(spanGen($(false,"#qcont3").value+' ','qapappl'));
view.innerHTML += '({"packageName":"';
view.appendChild(spanGen($(false,"#qcont2").value,'qapfrom'));
view.innerHTML += '","type":"url","extra":{"scene":"recommend"}})';
}
if((aform_tType($_("atype").value)==='a' &&
$_("apre").value==='both' &&
$(false,"#acont2a").value==='' &&
$(false,"#acont2b").value==='') || (
aform_tType($_("atype").value)==='a' &&
$_("apre").value!=='both' &&
$(false,"#acont1").value==='') || (
aform_tType($_("atype").value)==='q' &&
$(false,"#qcont1").value==='' &&
$(false,"#qcont2").value==='' &&
$(false,"#qcont3").value==='') ||
aform_tType($_("atype").value)==='t') {
show = false;
} else {
show = true;
}
_(view,show);
_($(false,"#nullprvw"),!show);
}
function injSty(ad,dark) {
if (ad.nodeName==='STYLE') {
ad.innerHTML = dark;
} else if (ad.nodeName==='LINK' && ad.rel==="stylesheet") {
ad.href = (dark=='') ? '#' : 'data:text/css;base64,' + btoa(dark);
}
}
function updBtnDark() {
_($(!1,'#btnDark'),!uaData.dark,'dark');
}
function addEvent() {
function ee(el,ev,fn) { el.addEventListener(ev,fn); }
$(true,'[type="radio"],[type="checkbox"]').forEach( e => {
ee(e.parentNode,'keydown', spaceChecked);
ee(e.parentNode,'dragstart', e => {
e.dataTransfer.setData('text',e.target.id);
let dragger = document.querySelector('#dragger');
dragger.innerHTML = e.target.querySelector('span').innerHTML;
// FIXME: Firefox 有偏移问题
if (e.dataTransfer.mozCursor) {
e.dataTransfer.setDragImage(dragger, -50, -100);
} else {
e.dataTransfer.setDragImage(dragger, 0, 0);
}
});
});
ee($(false,'#openClass'),'click',openWin.bind(this,'#class'));
ee($(false,'#openUA'),'click',openWin.bind(this,'#ua'));
ee($(false,'#search'),'input', fltAppUA.bind(this));
ee($(false,'#btnHelp'),'click',()=>{window.location.href='https://gitee.com/lemon399/user-agent-share-page/blob/master/README.md'});
ee($(false,'#btnCSel'),'click',()=>{$(!1,'#app_container').reset()});
ee($(false,'#openNew'),'click',openWin.bind(this,'#addui'));
ee($(false,'#btnSlst'),'click',fltAppUASelected.bind(this));
ee($(false,'#btnGen'),'click',genUA);
$(true,'.close').forEach( c => ee(c,'click',e => {
e.target.parentNode.parentNode.classList.add('none');
if (e.target.parentNode.parentNode.id=='addui' &&
getComputedStyle($(!1,'#prvui')).display=='block') {
$(!1,'#prvui').classList.add('none');
};
}));
$(true,'.topbutton').forEach( c => ee(c,'click',topwin.bind(this)));
ee($(false,'.prev'),'click',openWin.bind(this,'#prvui'));
ee($(false,'#useragent'),'input',issuesCheck);
ee($(false,'#btnClUA'),'click',()=>{$(false,'#useragent').value = '';issuesCheck();});
ee($(false,'#btnCpUA'),'click',()=>{$(false,'#useragent').select();document.execCommand('copy');});
ee($(false,'#btnTgAl'),'click',()=>{$(true,'#classBox input:not(:checked)').forEach( b => { b.checked = true; tagClick(b.parentNode.id);});});
ee($(false,'#btnTgRv'),'click',()=>{$(true,'#classBox input').forEach( b => { b.checked = (!b.checked); tagClick(b.parentNode.id);});});
$(true,'#addtype input').forEach( e => ee(e,'change', aform_switchCard));
$(true,'#addtype input').forEach( e => ee(e,'change', previewUpdate));
$(true,'.key').forEach( e => ee(e,'input',aform_KeyCheck.bind(this,false)));
$(true,'.msel').forEach( e => ee(e,'change',aform_Modify));
$(true,'#aappt .msel,#qappt .msel').forEach( e => ee(e,'change',previewUpdate));
$(true,'#apre input').forEach( e => ee(e,'change', aform_switchBoth));
ee($(false,'#ttext'),'input', aform_updateFlagPreview);
$(true,'#tbgc,#tfgc').forEach( e => ee(e,'change', aform_updateFlagPreview));
ee($(false,'#aok'),'click',aform_Add);
ee($(false,'#aclear'),'click',aform_Clear);
ee($(false,'#anew'),'click',aform_switchModify);
ee($(false,'#adel'),'click',aform_Delete);
ee($(false,'#ssave'),'click',lsb_save);
ee($(false,'#scopy'),'click',()=>{$(false,'#stordata').select();document.execCommand('copy');});
ee($(false,'#sdele'),'click',()=>{$(false,'#stordata').value = '';});
ee($(false,'#simp'),'click',lsb_import);
ee($(false,'#sexp'),'click',lsb_export);
ee($(false,'#sclr'),'click',()=>{window.localStorage.removeItem(uaData.storKey);toast('清空啦')});
ee($(false,'#stysave'),'click',lss_save);
ee($(false,'#styclr'),'click',()=>{window.localStorage.removeItem(uaData.styleKey);toast('清空啦,刷新后恢复默认主题')});
ee($(false,'#swreg'),'click',swOpr);
ee($(false,'#swclr'),'click',()=>{ caches.keys().then( vers => vers.map( i => caches.delete(i) )); cacheScan()});
$(true,'#acont1,#acont2a,#acont2b,#qcont1,#qcont2,#qcont3').forEach( e => ee(e,'input',previewUpdate));
$(true,'#apre input,#afol input').forEach( e => ee(e,'change', previewUpdate));
$(true,'#atbs,#ashort,#apc,#aspider').forEach( e => ee(e,'change',previewUpdate));
ee($(false,'#toast'),'animationend',e=>{e.target.style.display = "none";});
ee($(false,'#toast'),'webkitAnimationEnd',e=>{e.target.style.display = "none";});
ee($(false,"#app_container"),'keydown',e=>{if (e.code==="Space") e.preventDefault();});
ee($(false,"textarea"),'drop',insertUA.bind(this));
}
function init(){
let finish = function(){_($(false,"#load"),false)};
if (uaData.设置.基础默认 > Object.keys(uaData.base).length) uaData.设置.基础默认 = 1;
$(false,'#loadstr').innerHTML = '正在构建 ...';
lsb_initOption();
makeItem();
makeFlaginBox();
aform_makeFlaginBox();
makeBaseRadio();
addEvent();
dndWin();
$(false,'#loadstr').innerHTML = '正在初始化 ...';
$(false,"#Raapp").checked = true;
$(false,"#stordata").value = '';
aform_Clear();
$(false,"#search").value = '';
$(false,"#version").innerHTML = `版本:${uaData.版本.描述}_${uaData.版本.详细} 总数:${Object.keys(uaData.apps).length}`;
if (window.location.host.match('gitee.io')) {
$(false,"#version").innerHTML += ' <i>由 Gitee 提供代码和网页托管服务</i>';
}
$(false,'#loadstr').innerHTML = '加载完成';
$(false,"#load").style.opacity = '0%';
setTimeout(finish,1000);
lab = $(true,"#app_container label"),
cas = $(true,"#app_container .CaseHead"),
lah = $(true,"#app_container > label,.CaseHead"),
ntx = $(false,"#nulltext");
loc = window.localStorage;
};
return {
init: init,
$: $,
toast: toast,
injSty: injSty,
dark: updBtnDark
}
})();
</script>
<script>
window.onerror = function(e,a,l) {
alert(`错误: ${e}\n地址: ${a}\n行数: ${l}`);
}
function 加入(box,obj) {
switch (box) {
case "标签":
Object.assign(uaData.flag,obj);
Object.keys(obj).forEach( key => uaData.tagfind.set(obj[key][0], key) );
break;
case "APP":
Object.keys(obj).forEach( key => {
let cont;
if (typeof obj[key]["内容"] === "object") {
if (obj[key]["内容"] instanceof Array) {
cont = [obj[key]["内容"][0],obj[key]["内容"][1]];
} else {
cont = {
qBasic: obj[key]["内容"]["平台"],
qFrom: obj[key]["内容"]["来自"],
qString: obj[key]["内容"]["应用"]
}
}
} else {
cont = obj[key]["内容"];
}
Object.assign(uaData.apps,{
[key]: {
text: obj[key]["名称"],
prefix: (obj[key]["前置"]==="是") ? true : false,
followed: (obj[key]["无缝"]==="是") ? true : false,
class: obj[key]["标签"],
content: cont
}
});
});
break;
case "基础":
Object.keys(obj).forEach( key => {
if (key!=="默认项") {
Object.assign(uaData.base,{
[key]: {
text: obj[key]["名称"],
content: obj[key]["内容"]
}
});
}
});
break;
case "数据":
obj.forEach( js => uaData.jslist.push(js) );
break;
}
}
(()=>{
let para = new URLSearchParams(location.search), flo;
if (parseInt(para.get('base'))>0)
uaData.设置.基础默认 = parseInt(para.get('base'));
if (parseInt(para.get('dark'))>=0 && parseInt(para.get('dark'))<=2)
uaData.设置.暗色主题 = parseInt(para.get('dark'));
if (para.get('flag')) {
flo = para.get('flag').replace(/[A-Z]+/,'').slice(0,1);
if (flo) uaData.设置.数字记号 = flo;
}
})();
(()=>{
const stor = window.localStorage;
let myl = document.getElementById('myLight'),
syl = document.getElementById('stylight'),
myd = document.getElementById('myDark'),
syd = document.getElementById('stydark');
syl.value = '';
syd.value = '';
if(stor.hasOwnProperty(uaData.styleKey)) {
try {
let data = JSON.parse(stor.getItem(uaData.styleKey));
if (data.light) {
myl.innerHTML = data.light;
syl.value = data.light;
} else {
syl.value = Object.values(myl.sheet.cssRules)[0].cssText;
}
if (data.dark) {
myd.innerHTML = data.dark;
syd.value = data.dark;
} else {
syd.value = Object.values(myd.sheet.cssRules)[0].cssRules[0].cssText;
}
} catch(e) {
alert(`存储数据异常,将会被清空...\n 内容:${stor.getItem(uaData.styleKey)}`);
stor.removeItem(uaData.styleKey);
}
} else {
syl.value = Object.values(myl.sheet.cssRules)[0].cssText;
syd.value = Object.values(myd.sheet.cssRules)[0].cssRules[0].cssText;
}
})();
(()=>{
let dark = Object.values(uaCode.$(!1,'#myDark').sheet.cssRules)[0].cssRules[0].cssText,
light = Object.values(uaCode.$(!1,'#myLight').sheet.cssRules)[0].cssText,
force = (uaData.设置.暗色主题===0) ? light : dark,
btnDark = uaCode.$(!1,'#btnDark'),
impSty = uaCode.$(!1,'#myImportant'),
night = [
"via_inject_css_night",
"metaNight",
"yjbrowser_night_mode_style",
"yjbrowser_night_mode_style2",
"360browser_night_mode_style",
"360browser_night_mode_style2",
"mixiaba_css_id",
"x_style_element_id",
"x_link_element_id",
"alook_theme",
"miui_mini_night_mode",
"preucbrowser_sheet_theme",
"bnightThme",
"sq_root_css"
], observer = new MutationObserver( (mus,obs) => {
for (let mu of mus) {
if (mu.addedNodes.length>0) {
mu.addedNodes.forEach( ad => {
if (night.includes(ad.id)) {
uaCode.injSty(ad,force);
uaData.dark = true;
uaCode.dark();
}
})
}
if (mu.removedNodes.length>0) {
mu.removedNodes.forEach( ad => {
if (night.includes(ad.id)) {
if (uaData.设置.暗色主题===2) {
impSty.innerHTML = '';
}
uaData.dark = uaData.osdark.matches;
uaCode.dark();
}
})
}
}
}), opt = { childList: true, subtree: false };
function patchStyle(css) {
night.forEach( id => {
let ad = document.getElementById(id);
if (ad) {
uaCode.injSty(ad,css);
uaCode.dark();
}
});
}
btnDark.onclick = () => {
impSty.innerHTML = (uaData.dark) ? light : dark;
patchStyle((uaData.dark) ? light : dark);
uaData.dark = !uaData.dark;
uaCode.dark();
}
uaData.osdark.onchange = e => {
if (uaData.设置.暗色主题===2) {
impSty.innerHTML = '';
}
uaData.dark = e.matches;
uaCode.dark();
}
if (uaData.设置.暗色主题<2) {
patchStyle(force);
impSty.innerHTML = force;
}
switch (uaData.设置.暗色主题) {
case 0:
uaData.dark = false;
break;
case 1:
uaData.dark = true;
break;
default:
uaData.dark = uaData.osdark.matches;
}
uaCode.dark();
observer.observe(document.documentElement,opt);
observer.observe(document.head,opt);
})();
</script>
<script src="数据列表.js"></script>
<script>
uaData.load = new Promise( (resolve,reject) => {
uaCode.$(false,'#loadstr').innerHTML = (uaData.jslist.length===0) ?
'数据列表加载失败 !' : '正在加载基本数据 ...';
uaData.jslist.forEach( js => {
let script=document.createElement('script');
script.async = false;
script.src = js;
script.onerror = e => {
uaCode.$(false,'#loadstr').innerHTML = '数据加载失败 !';
uaCode.toast(js + " 加载失败");
window.stop();
};
script.onload = e => {
uaData.jslist.splice(uaData.jslist.findIndex( v => v === js ),1);
if (uaData.jslist.length===0) { resolve(); }
}
document.querySelector("head").appendChild(script);
});
}).then( () => {
const stor = window.localStorage;
uaCode.$(false,'#loadstr').innerHTML = '正在加载自定义数据 ...';
if (stor.hasOwnProperty(uaData.storKey)) {
try {
let data = JSON.parse(stor.getItem(uaData.storKey));
if (data.apps) {
Object.assign(uaData.stor.apps,data.apps);
加入("APP",data.apps);
}
if (data.flag) {
Object.assign(uaData.stor.flag,data.flag);
加入("标签",data.flag);
}
} catch(e) {
alert(`存储数据异常,将会被清空...\n 内容:${stor.getItem(uaData.storKey)}`);
stor.removeItem(uaData.storKey);
}
}
}
).then(uaCode.init);
(()=>{
if ('serviceWorker' in navigator && window.location.href.slice(0,5)==="https") {
let opt = uaCode.$(false,'#swopt'),
stat = uaCode.$(false,'#swstat'),
btn = uaCode.$(false,'#swreg');
opt.classList.remove('none');
navigator.serviceWorker.getRegistrations().then( regs => {
if (regs.length===1) {
caches.keys().then( vers => {
vers.filter( ver => ver.slice(0,2)==='D_' || ver.slice(0,2)==='I_' ).map( i => {
if (parseInt(i.slice(2)) !== uaData.版本.详细) {
uaCode.toast('更新离线缓存...');
caches.delete(i);
}
})
});
if (regs[0].installing) {
stat.innerHTML = '正在安装';
} else if (regs[0].waiting) {
stat.innerHTML = '等待安装';
} else if (regs[0].active) {
stat.innerHTML = '已安装';
}
opt.classList.add('inst');
btn.innerHTML = '卸载服务';
} else {
opt.classList.remove('inst');
stat.innerHTML = '未安装';
btn.innerHTML = '安装服务';
}
caches.keys().then( vers => { uaCode.$(false,"#swlen").innerHTML = vers.length });
})
}
})();
</script>
</body>
</html>
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。