mirror of
https://github.com/lush2020/edgetunnel.git
synced 2026-03-21 17:12:33 +08:00
提高各种兼容性
This commit is contained in:
387
明文源码.js
387
明文源码.js
@@ -238,6 +238,9 @@ export default {
|
||||
} else if (new RegExp('/proxyip.', 'i').test(url.pathname)) {
|
||||
proxyIP = `proxyip.${url.pathname.toLowerCase().split("/proxyip.")[1]}`;
|
||||
enableSocks = false;
|
||||
} else if (new RegExp('/pyip=', 'i').test(url.pathname)) {
|
||||
proxyIP = url.pathname.toLowerCase().split('/pyip=')[1];
|
||||
enableSocks = false;
|
||||
}
|
||||
|
||||
return await 维列斯OverWSHandler(request);
|
||||
@@ -1227,7 +1230,8 @@ async function 生成配置信息(userID, hostName, sub, UA, RproxyIP, _url, env
|
||||
if (subs.length > 1) sub = subs[0];
|
||||
} else {
|
||||
if (env.KV){
|
||||
const 优选地址列表 = await env.KV.get('/ADD.txt');
|
||||
await 迁移地址列表(env);
|
||||
const 优选地址列表 = await env.KV.get('ADD.txt');
|
||||
if (优选地址列表) {
|
||||
const 优选地址数组 = await 整理(优选地址列表);
|
||||
const 分类地址 = {
|
||||
@@ -1378,7 +1382,23 @@ async function 生成配置信息(userID, hostName, sub, UA, RproxyIP, _url, env
|
||||
singbox订阅地址:<br>
|
||||
<a href="javascript:void(0)" onclick="copyToClipboard('https://${proxyhost}${hostName}/${uuid}?sb')" style="color:blue;text-decoration:underline;cursor:pointer;">https://${proxyhost}${hostName}/${uuid}?sb</a><br>
|
||||
<a href="javascript:void(0)" onclick="copyToClipboard('https://${proxyhost}${hostName}/${uuid}?singbox')" style="color:blue;text-decoration:underline;cursor:pointer;">https://${proxyhost}${hostName}/${uuid}?singbox</a><br>
|
||||
|
||||
<br>
|
||||
<strong><a href="javascript:void(0);" id="noticeToggle" onclick="toggleNotice()">实用订阅技巧∨</a></strong><br>
|
||||
<div id="noticeContent" class="notice-content" style="display: none;">
|
||||
<strong>1.</strong> 如您使用的是 PassWall、SSR+ 等路由插件,推荐使用 <strong>Base64订阅地址</strong> 进行订阅;<br>
|
||||
<br>
|
||||
<strong>2.</strong> 快速切换 <a href='${atob('aHR0cHM6Ly9naXRodWIuY29tL2NtbGl1L1dvcmtlclZsZXNzMnN1Yg==')}'>优选订阅生成器</a> 至:sub.google.com,您可将"?sub=sub.google.com"参数添加到链接末尾,例如:<br>
|
||||
https://${proxyhost}${hostName}/${uuid}<strong>?sub=sub.google.com</strong><br>
|
||||
<br>
|
||||
<strong>3.</strong> 快速更换 PROXYIP 至:proxyip.fxxk.dedyn.io:443,您可将"?proxyip=proxyip.fxxk.dedyn.io:443"参数添加到链接末尾,例如:<br>
|
||||
https://${proxyhost}${hostName}/${uuid}<strong>?proxyip=proxyip.fxxk.dedyn.io:443</strong><br>
|
||||
<br>
|
||||
<strong>4.</strong> 快速更换 SOCKS5 至:user:password@127.0.0.1:1080,您可将"?socks5=user:password@127.0.0.1:1080"参数添加到链接末尾,例如:<br>
|
||||
https://${proxyhost}${hostName}/${uuid}<strong>?socks5=user:password@127.0.0.1:1080</strong><br>
|
||||
<br>
|
||||
<strong>5.</strong> 如需指定多个参数则需要使用'&'做间隔,例如:<br>
|
||||
https://${proxyhost}${hostName}/${uuid}?sub=sub.google.com<strong>&</strong>proxyip=proxyip.fxxk.dedyn.io<br>
|
||||
</div>
|
||||
<script>
|
||||
function copyToClipboard(text) {
|
||||
navigator.clipboard.writeText(text).then(() => {
|
||||
@@ -1387,6 +1407,18 @@ async function 生成配置信息(userID, hostName, sub, UA, RproxyIP, _url, env
|
||||
console.error('复制失败:', err);
|
||||
});
|
||||
}
|
||||
|
||||
function toggleNotice() {
|
||||
const noticeContent = document.getElementById('noticeContent');
|
||||
const noticeToggle = document.getElementById('noticeToggle');
|
||||
if (noticeContent.style.display === 'none') {
|
||||
noticeContent.style.display = 'block';
|
||||
noticeToggle.textContent = '实用订阅技巧∧';
|
||||
} else {
|
||||
noticeContent.style.display = 'none';
|
||||
noticeToggle.textContent = '实用订阅技巧∨';
|
||||
}
|
||||
}
|
||||
</script>
|
||||
---------------------------------------------------------------<br>
|
||||
################################################################<br>
|
||||
@@ -1873,7 +1905,21 @@ function 生成动态UUID(密钥) {
|
||||
return Promise.all([当前UUIDPromise, 上一个UUIDPromise, 到期时间字符串]);
|
||||
}
|
||||
|
||||
async function KV(request, env, txt = '/ADD.txt') {
|
||||
async function 迁移地址列表(env, txt = 'ADD.txt') {
|
||||
const 旧数据 = await env.KV.get(`/${txt}`);
|
||||
const 新数据 = await env.KV.get(txt);
|
||||
|
||||
if (旧数据 && !新数据) {
|
||||
// 写入新位置
|
||||
await env.KV.put(txt, 旧数据);
|
||||
// 删除旧数据
|
||||
await env.KV.delete(`/${txt}`);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
async function KV(request, env, txt = 'ADD.txt') {
|
||||
try {
|
||||
// POST请求处理
|
||||
if (request.method === "POST") {
|
||||
@@ -1902,130 +1948,227 @@ async function KV(request, env, txt = '/ADD.txt') {
|
||||
}
|
||||
|
||||
const html = `
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>优选订阅列表</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<style>
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 15px; /* 调整padding */
|
||||
box-sizing: border-box;
|
||||
font-size: 13px; /* 设置全局字体大小 */
|
||||
}
|
||||
.editor-container {
|
||||
width: 100%;
|
||||
max-width: 100%;
|
||||
margin: 0 auto;
|
||||
}
|
||||
.editor {
|
||||
width: 100%;
|
||||
height: 520px; /* 调整高度 */
|
||||
margin: 15px 0; /* 调整margin */
|
||||
padding: 10px; /* 调整padding */
|
||||
box-sizing: border-box;
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 4px;
|
||||
font-size: 13px;
|
||||
line-height: 1.5;
|
||||
overflow-y: auto;
|
||||
resize: none;
|
||||
}
|
||||
.save-container {
|
||||
margin-top: 8px; /* 调整margin */
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px; /* 调整gap */
|
||||
}
|
||||
.save-btn, .back-btn {
|
||||
padding: 6px 15px; /* 调整padding */
|
||||
color: white;
|
||||
border: none;
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.save-btn {
|
||||
background: #4CAF50;
|
||||
}
|
||||
.save-btn:hover {
|
||||
background: #45a049;
|
||||
}
|
||||
.back-btn {
|
||||
background: #666;
|
||||
}
|
||||
.back-btn:hover {
|
||||
background: #555;
|
||||
}
|
||||
.save-status {
|
||||
color: #666;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
################################################################<br>
|
||||
${FileName} 优选订阅列表:<br>
|
||||
---------------------------------------------------------------<br>
|
||||
<div class="editor-container">
|
||||
${hasKV ? `
|
||||
<textarea class="editor"
|
||||
placeholder="${decodeURIComponent(atob('QUREJUU3JUE0JUJBJUU0JUJFJThCJUVGJUJDJTlBCnZpc2EuY24lMjMlRTQlQkMlOTglRTklODAlODklRTUlOUYlOUYlRTUlOTAlOEQKMTI3LjAuMC4xJTNBMTIzNCUyM0NGbmF0CiU1QjI2MDYlM0E0NzAwJTNBJTNBJTVEJTNBMjA1MyUyM0lQdjYKCiVFNiVCMyVBOCVFNiU4NCU4RiVFRiVCQyU5QQolRTYlQUYlOEYlRTglQTElOEMlRTQlQjglODAlRTQlQjglQUElRTUlOUMlQjAlRTUlOUQlODAlRUYlQkMlOEMlRTYlQTAlQkMlRTUlQkMlOEYlRTQlQjglQkElMjAlRTUlOUMlQjAlRTUlOUQlODAlM0ElRTclQUIlQUYlRTUlOEYlQTMlMjMlRTUlQTQlODclRTYlQjMlQTgKSVB2NiVFNSU5QyVCMCVFNSU5RCU4MCVFOSU5QyU4MCVFOCVBNiU4MSVFNyU5NCVBOCVFNCVCOCVBRCVFNiU4QiVBQyVFNSU4RiVCNyVFNiU4QiVBQyVFOCVCNSVCNyVFNiU5RCVBNSVFRiVCQyU4QyVFNSVBNiU4MiVFRiVCQyU5QSU1QjI2MDYlM0E0NzAwJTNBJTNBJTVEJTNBMjA1MwolRTclQUIlQUYlRTUlOEYlQTMlRTQlQjglOEQlRTUlODYlOTklRUYlQkMlOEMlRTklQkIlOTglRTglQUUlQTQlRTQlQjglQkElMjA0NDMlMjAlRTclQUIlQUYlRTUlOEYlQTMlRUYlQkMlOEMlRTUlQTYlODIlRUYlQkMlOUF2aXNhLmNuJTIzJUU0JUJDJTk4JUU5JTgwJTg5JUU1JTlGJTlGJUU1JTkwJThECgoKQUREQVBJJUU3JUE0JUJBJUU0JUJFJThCJUVGJUJDJTlBCmh0dHBzJTNBJTJGJTJGcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSUyRmNtbGl1JTJGV29ya2VyVmxlc3Myc3ViJTJGcmVmcyUyRmhlYWRzJTJGbWFpbiUyRmFkZHJlc3Nlc2FwaS50eHQKCiVFNiVCMyVBOCVFNiU4NCU4RiVFRiVCQyU5QUFEREFQSSVFNyU5QiVCNCVFNiU4RSVBNSVFNiVCNyVCQiVFNSU4QSVBMCVFNyU5QiVCNCVFOSU5MyVCRSVFNSU4RCVCMyVFNSU4RiVBRg=='))}"
|
||||
id="content">${content}</textarea>
|
||||
<div class="save-container">
|
||||
<button class="back-btn" onclick="goBack()">返回配置页</button>
|
||||
<button class="save-btn" onclick="saveContent()">保存</button>
|
||||
<span class="save-status" id="saveStatus"></span>
|
||||
</div>
|
||||
<br>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>优选订阅列表</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<style>
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 15px; /* 调整padding */
|
||||
box-sizing: border-box;
|
||||
font-size: 13px; /* 设置全局字体大小 */
|
||||
}
|
||||
.editor-container {
|
||||
width: 100%;
|
||||
max-width: 100%;
|
||||
margin: 0 auto;
|
||||
}
|
||||
.editor {
|
||||
width: 100%;
|
||||
height: 520px; /* 调整高度 */
|
||||
margin: 15px 0; /* 调整margin */
|
||||
padding: 10px; /* 调整padding */
|
||||
box-sizing: border-box;
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 4px;
|
||||
font-size: 13px;
|
||||
line-height: 1.5;
|
||||
overflow-y: auto;
|
||||
resize: none;
|
||||
}
|
||||
.save-container {
|
||||
margin-top: 8px; /* 调整margin */
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px; /* 调整gap */
|
||||
}
|
||||
.save-btn, .back-btn {
|
||||
padding: 6px 15px; /* 调整padding */
|
||||
color: white;
|
||||
border: none;
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.save-btn {
|
||||
background: #4CAF50;
|
||||
}
|
||||
.save-btn:hover {
|
||||
background: #45a049;
|
||||
}
|
||||
.back-btn {
|
||||
background: #666;
|
||||
}
|
||||
.back-btn:hover {
|
||||
background: #555;
|
||||
}
|
||||
.save-status {
|
||||
color: #666;
|
||||
}
|
||||
.notice-content {
|
||||
display: none;
|
||||
margin-top: 10px;
|
||||
font-size: 13px;
|
||||
color: #333;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
################################################################<br>
|
||||
${cmad}
|
||||
` : '<p>未绑定KV空间</p>'}
|
||||
</div>
|
||||
|
||||
<script>
|
||||
if (document.querySelector('.editor')) {
|
||||
let timer;
|
||||
const textarea = document.getElementById('content');
|
||||
const originalContent = textarea.value;
|
||||
|
||||
function goBack() {
|
||||
const currentUrl = window.location.href;
|
||||
const parentUrl = currentUrl.substring(0, currentUrl.lastIndexOf('/'));
|
||||
window.location.href = parentUrl;
|
||||
${FileName} 优选订阅列表:<br>
|
||||
---------------------------------------------------------------<br>
|
||||
<strong><a href="javascript:void(0);" id="noticeToggle" onclick="toggleNotice()">注意事项∨</a></strong><br>
|
||||
<div id="noticeContent" class="notice-content">
|
||||
${decodeURIComponent(atob('JTA5JTA5JTA5JTA5JTA5JTNDc3Ryb25nJTNFMS4lM0MlMkZzdHJvbmclM0UlMjBBRERBUEklMjAlRTUlQTYlODIlRTYlOUUlOUMlRTYlOTglQUYlRTUlOEYlOEQlRTQlQkIlQTNJUCVFRiVCQyU4QyVFNSU4RiVBRiVFNCVCRCU5QyVFNCVCOCVCQVBST1hZSVAlRTclOUElODQlRTglQUYlOUQlRUYlQkMlOEMlRTUlOEYlQUYlRTUlQjAlODYlMjIlM0Zwcm94eWlwJTNEdHJ1ZSUyMiVFNSU4RiU4MiVFNiU5NSVCMCVFNiVCNyVCQiVFNSU4QSVBMCVFNSU4OCVCMCVFOSU5MyVCRSVFNiU4RSVBNSVFNiU5QyVBQiVFNSVCMCVCRSVFRiVCQyU4QyVFNCVCRSU4QiVFNSVBNiU4MiVFRiVCQyU5QSUzQ2JyJTNFCiUwOSUwOSUwOSUwOSUwOSUyNm5ic3AlM0IlMjZuYnNwJTNCaHR0cHMlM0ElMkYlMkZyYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tJTJGY21saXUlMkZXb3JrZXJWbGVzczJzdWIlMkZtYWluJTJGYWRkcmVzc2VzYXBpLnR4dCUzQ3N0cm9uZyUzRSUzRnByb3h5aXAlM0R0cnVlJTNDJTJGc3Ryb25nJTNFJTNDYnIlM0UlM0NiciUzRQolMDklMDklMDklMDklMDklM0NzdHJvbmclM0UyLiUzQyUyRnN0cm9uZyUzRSUyMEFEREFQSSUyMCVFNSVBNiU4MiVFNiU5RSU5QyVFNiU5OCVBRiUyMCUzQ2ElMjBocmVmJTNEJTI3aHR0cHMlM0ElMkYlMkZnaXRodWIuY29tJTJGWElVMiUyRkNsb3VkZmxhcmVTcGVlZFRlc3QlMjclM0VDbG91ZGZsYXJlU3BlZWRUZXN0JTNDJTJGYSUzRSUyMCVFNyU5QSU4NCUyMGNzdiUyMCVFNyVCQiU5MyVFNiU5RSU5QyVFNiU5NiU4NyVFNCVCQiVCNiVFRiVCQyU4QyVFNCVCRSU4QiVFNSVBNiU4MiVFRiVCQyU5QSUzQ2JyJTNFCiUwOSUwOSUwOSUwOSUwOSUyNm5ic3AlM0IlMjZuYnNwJTNCaHR0cHMlM0ElMkYlMkZyYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tJTJGY21saXUlMkZXb3JrZXJWbGVzczJzdWIlMkZyZWZzJTJGaGVhZHMlMkZtYWluJTJGQ2xvdWRmbGFyZVNwZWVkVGVzdC5jc3YlM0NiciUzRSUzQ2JyJTNFCiUwOSUwOSUwOSUwOSUwOSUyNm5ic3AlM0IlMjZuYnNwJTNCLSUyMCVFNSVBNiU4MiVFOSU5QyU4MCVFNiU4QyU4NyVFNSVBRSU5QTIwNTMlRTclQUIlQUYlRTUlOEYlQTMlRTUlOEYlQUYlRTUlQjAlODYlMjIlM0Zwb3J0JTNEMjA1MyUyMiVFNSU4RiU4MiVFNiU5NSVCMCVFNiVCNyVCQiVFNSU4QSVBMCVFNSU4OCVCMCVFOSU5MyVCRSVFNiU4RSVBNSVFNiU5QyVBQiVFNSVCMCVCRSVFRiVCQyU4QyVFNCVCRSU4QiVFNSVBNiU4MiVFRiVCQyU5QSUzQ2JyJTNFCiUwOSUwOSUwOSUwOSUwOSUyNm5ic3AlM0IlMjZuYnNwJTNCaHR0cHMlM0ElMkYlMkZyYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tJTJGY21saXUlMkZXb3JrZXJWbGVzczJzdWIlMkZyZWZzJTJGaGVhZHMlMkZtYWluJTJGQ2xvdWRmbGFyZVNwZWVkVGVzdC5jc3YlM0NzdHJvbmclM0UlM0Zwb3J0JTNEMjA1MyUzQyUyRnN0cm9uZyUzRSUzQ2JyJTNFJTNDYnIlM0UKJTA5JTA5JTA5JTA5JTA5JTI2bmJzcCUzQiUyNm5ic3AlM0ItJTIwJUU1JUE2JTgyJUU5JTlDJTgwJUU2JThDJTg3JUU1JUFFJTlBJUU4JThBJTgyJUU3JTgyJUI5JUU1JUE0JTg3JUU2JUIzJUE4JUU1JThGJUFGJUU1JUIwJTg2JTIyJTNGaWQlM0RDRiVFNCVCQyU5OCVFOSU4MCU4OSUyMiVFNSU4RiU4MiVFNiU5NSVCMCVFNiVCNyVCQiVFNSU4QSVBMCVFNSU4OCVCMCVFOSU5MyVCRSVFNiU4RSVBNSVFNiU5QyVBQiVFNSVCMCVCRSVFRiVCQyU4QyVFNCVCRSU4QiVFNSVBNiU4MiVFRiVCQyU5QSUzQ2JyJTNFCiUwOSUwOSUwOSUwOSUwOSUyNm5ic3AlM0IlMjZuYnNwJTNCaHR0cHMlM0ElMkYlMkZyYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tJTJGY21saXUlMkZXb3JrZXJWbGVzczJzdWIlMkZyZWZzJTJGaGVhZHMlMkZtYWluJTJGQ2xvdWRmbGFyZVNwZWVkVGVzdC5jc3YlM0NzdHJvbmclM0UlM0ZpZCUzRENGJUU0JUJDJTk4JUU5JTgwJTg5JTNDJTJGc3Ryb25nJTNFJTNDYnIlM0UlM0NiciUzRQolMDklMDklMDklMDklMDklMjZuYnNwJTNCJTI2bmJzcCUzQi0lMjAlRTUlQTYlODIlRTklOUMlODAlRTYlOEMlODclRTUlQUUlOUElRTUlQTQlOUElRTQlQjglQUElRTUlOEYlODIlRTYlOTUlQjAlRTUlODglOTklRTklOUMlODAlRTglQTYlODElRTQlQkQlQkYlRTclOTQlQTglMjclMjYlMjclRTUlODElOUElRTklOTclQjQlRTklOUElOTQlRUYlQkMlOEMlRTQlQkUlOEIlRTUlQTYlODIlRUYlQkMlOUElM0NiciUzRQolMDklMDklMDklMDklMDklMjZuYnNwJTNCJTI2bmJzcCUzQmh0dHBzJTNBJTJGJTJGcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSUyRmNtbGl1JTJGV29ya2VyVmxlc3Myc3ViJTJGcmVmcyUyRmhlYWRzJTJGbWFpbiUyRkNsb3VkZmxhcmVTcGVlZFRlc3QuY3N2JTNGaWQlM0RDRiVFNCVCQyU5OCVFOSU4MCU4OSUzQ3N0cm9uZyUzRSUyNiUzQyUyRnN0cm9uZyUzRXBvcnQlM0QyMDUzJTNDYnIlM0U='))}
|
||||
</div>
|
||||
<div class="editor-container">
|
||||
${hasKV ? `
|
||||
<textarea class="editor"
|
||||
placeholder="${decodeURIComponent(atob('QUREJUU3JUE0JUJBJUU0JUJFJThCJUVGJUJDJTlBCnZpc2EuY24lMjMlRTQlQkMlOTglRTklODAlODklRTUlOUYlOUYlRTUlOTAlOEQKMTI3LjAuMC4xJTNBMTIzNCUyM0NGbmF0CiU1QjI2MDYlM0E0NzAwJTNBJTNBJTVEJTNBMjA1MyUyM0lQdjYKCiVFNiVCMyVBOCVFNiU4NCU4RiVFRiVCQyU5QQolRTYlQUYlOEYlRTglQTElOEMlRTQlQjglODAlRTQlQjglQUElRTUlOUMlQjAlRTUlOUQlODAlRUYlQkMlOEMlRTYlQTAlQkMlRTUlQkMlOEYlRTQlQjglQkElMjAlRTUlOUMlQjAlRTUlOUQlODAlM0ElRTclQUIlQUYlRTUlOEYlQTMlMjMlRTUlQTQlODclRTYlQjMlQTgKSVB2NiVFNSU5QyVCMCVFNSU5RCU4MCVFOSU5QyU4MCVFOCVBNiU4MSVFNyU5NCVBOCVFNCVCOCVBRCVFNiU4QiVBQyVFNSU4RiVCNyVFNiU4QiVBQyVFOCVCNSVCNyVFNiU5RCVBNSVFRiVCQyU4QyVFNSVBNiU4MiVFRiVCQyU5QSU1QjI2MDYlM0E0NzAwJTNBJTNBJTVEJTNBMjA1MwolRTclQUIlQUYlRTUlOEYlQTMlRTQlQjglOEQlRTUlODYlOTklRUYlQkMlOEMlRTklQkIlOTglRTglQUUlQTQlRTQlQjglQkElMjA0NDMlMjAlRTclQUIlQUYlRTUlOEYlQTMlRUYlQkMlOEMlRTUlQTYlODIlRUYlQkMlOUF2aXNhLmNuJTIzJUU0JUJDJTk4JUU5JTgwJTg5JUU1JTlGJTlGJUU1JTkwJThECgoKQUREQVBJJUU3JUE0JUJBJUU0JUJFJThCJUVGJUJDJTlBCmh0dHBzJTNBJTJGJTJGcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSUyRmNtbGl1JTJGV29ya2VyVmxlc3Myc3ViJTJGcmVmcyUyRmhlYWRzJTJGbWFpbiUyRmFkZHJlc3Nlc2FwaS50eHQKCiVFNiVCMyVBOCVFNiU4NCU4RiVFRiVCQyU5QUFEREFQSSVFNyU5QiVCNCVFNiU4RSVBNSVFNiVCNyVCQiVFNSU4QSVBMCVFNyU5QiVCNCVFOSU5MyVCRSVFNSU4RCVCMyVFNSU4RiVBRg=='))}"
|
||||
id="content">${content}</textarea>
|
||||
<div class="save-container">
|
||||
<button class="back-btn" onclick="goBack()">返回配置页</button>
|
||||
<button class="save-btn" onclick="saveContent(this)">保存</button>
|
||||
<span class="save-status" id="saveStatus"></span>
|
||||
</div>
|
||||
<br>
|
||||
################################################################<br>
|
||||
${cmad}
|
||||
` : '<p>未绑定KV空间</p>'}
|
||||
</div>
|
||||
|
||||
<script>
|
||||
if (document.querySelector('.editor')) {
|
||||
let timer;
|
||||
const textarea = document.getElementById('content');
|
||||
const originalContent = textarea.value;
|
||||
|
||||
function goBack() {
|
||||
const currentUrl = window.location.href;
|
||||
const parentUrl = currentUrl.substring(0, currentUrl.lastIndexOf('/'));
|
||||
window.location.href = parentUrl;
|
||||
}
|
||||
|
||||
function replaceFullwidthColon() {
|
||||
const text = textarea.value;
|
||||
textarea.value = text.replace(/:/g, ':');
|
||||
}
|
||||
|
||||
function saveContent(button) {
|
||||
try {
|
||||
const updateButtonText = (step) => {
|
||||
button.textContent = \`保存中: \${step}\`;
|
||||
};
|
||||
// 检测是否为iOS设备
|
||||
const isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent);
|
||||
|
||||
// 仅在非iOS设备上执行replaceFullwidthColon
|
||||
if (!isIOS) {
|
||||
replaceFullwidthColon();
|
||||
}
|
||||
updateButtonText('开始保存');
|
||||
button.disabled = true;
|
||||
// 获取textarea内容和原始内容
|
||||
const textarea = document.getElementById('content');
|
||||
if (!textarea) {
|
||||
throw new Error('找不到文本编辑区域');
|
||||
}
|
||||
updateButtonText('获取内容');
|
||||
let newContent;
|
||||
let originalContent;
|
||||
try {
|
||||
newContent = textarea.value || '';
|
||||
originalContent = textarea.defaultValue || '';
|
||||
} catch (e) {
|
||||
console.error('获取内容错误:', e);
|
||||
throw new Error('无法获取编辑内容');
|
||||
}
|
||||
updateButtonText('准备状态更新函数');
|
||||
const updateStatus = (message, isError = false) => {
|
||||
const statusElem = document.getElementById('saveStatus');
|
||||
if (statusElem) {
|
||||
statusElem.textContent = message;
|
||||
statusElem.style.color = isError ? 'red' : '#666';
|
||||
}
|
||||
};
|
||||
updateButtonText('准备按钮重置函数');
|
||||
const resetButton = () => {
|
||||
button.textContent = '保存';
|
||||
button.disabled = false;
|
||||
};
|
||||
if (newContent !== originalContent) {
|
||||
updateButtonText('发送保存请求');
|
||||
fetch(window.location.href, {
|
||||
method: 'POST',
|
||||
body: newContent,
|
||||
headers: {
|
||||
'Content-Type': 'text/plain;charset=UTF-8'
|
||||
},
|
||||
cache: 'no-cache'
|
||||
})
|
||||
.then(response => {
|
||||
updateButtonText('检查响应状态');
|
||||
if (!response.ok) {
|
||||
throw new Error(\`HTTP error! status: \${response.status}\`);
|
||||
}
|
||||
updateButtonText('更新保存状态');
|
||||
const now = new Date().toLocaleString();
|
||||
document.title = \`编辑已保存 \${now}\`;
|
||||
updateStatus(\`已保存 \${now}\`);
|
||||
})
|
||||
.catch(error => {
|
||||
updateButtonText('处理错误');
|
||||
console.error('Save error:', error);
|
||||
updateStatus(\`保存失败: \${error.message}\`, true);
|
||||
})
|
||||
.finally(() => {
|
||||
resetButton();
|
||||
});
|
||||
} else {
|
||||
updateButtonText('检查内容变化');
|
||||
updateStatus('内容未变化');
|
||||
resetButton();
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('保存过程出错:', error);
|
||||
button.textContent = '保存';
|
||||
button.disabled = false;
|
||||
const statusElem = document.getElementById('saveStatus');
|
||||
if (statusElem) {
|
||||
statusElem.textContent = \`错误: \${error.message}\`;
|
||||
statusElem.style.color = 'red';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
textarea.addEventListener('blur', saveContent);
|
||||
textarea.addEventListener('input', () => {
|
||||
clearTimeout(timer);
|
||||
timer = setTimeout(saveContent, 5000);
|
||||
});
|
||||
}
|
||||
|
||||
function replaceFullwidthColon() {
|
||||
const text = textarea.value;
|
||||
textarea.value = text.replace(/:/g, ':');
|
||||
}
|
||||
|
||||
function saveContent() {
|
||||
replaceFullwidthColon();
|
||||
const newContent = textarea.value;
|
||||
if (newContent !== originalContent) {
|
||||
fetch(window.location.href, {
|
||||
method: 'POST',
|
||||
body: newContent
|
||||
}).then(() => {
|
||||
const now = new Date().toLocaleString();
|
||||
document.title = \`编辑已保存 \${now}\`;
|
||||
document.getElementById('saveStatus').textContent = \`已保存 \${now}\`;
|
||||
}).catch(error => {
|
||||
document.getElementById('saveStatus').textContent = \`保存失败: \${error.message}\`;
|
||||
});
|
||||
|
||||
function toggleNotice() {
|
||||
const noticeContent = document.getElementById('noticeContent');
|
||||
const noticeToggle = document.getElementById('noticeToggle');
|
||||
if (noticeContent.style.display === 'none' || noticeContent.style.display === '') {
|
||||
noticeContent.style.display = 'block';
|
||||
noticeToggle.textContent = '注意事项∧';
|
||||
} else {
|
||||
noticeContent.style.display = 'none';
|
||||
noticeToggle.textContent = '注意事项∨';
|
||||
}
|
||||
}
|
||||
|
||||
textarea.addEventListener('blur', saveContent);
|
||||
textarea.addEventListener('input', () => {
|
||||
clearTimeout(timer);
|
||||
timer = setTimeout(saveContent, 5000);
|
||||
|
||||
// 初始化 noticeContent 的 display 属性
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
document.getElementById('noticeContent').style.display = 'none';
|
||||
});
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
`;
|
||||
|
||||
return new Response(html, {
|
||||
|
||||
Reference in New Issue
Block a user