to_nas.html 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>自动跳转</title>
  7. </head>
  8. <body>
  9. 跳转中......
  10. </body>
  11. <script>
  12. (function () {
  13. // 从url里面读取参数 type
  14. const urlParams = new URLSearchParams(window.location.search);
  15. const type = urlParams.get("type");
  16. // 如果type为空,则警告lert("请输入type参数")
  17. if (!type) {
  18. showStatus("请输入type参数");
  19. return;
  20. }
  21. let urlMap = {
  22. tri: ["http://192.168.3.36:9002/", "https://tri.tianyunperfect.cn/"],
  23. photo: ["http://192.168.3.36:8063/", "https://photo.n.tianyunperfect.cn/","https://photo.tianyunperfect.cn/photos"]
  24. };
  25. const urls = urlMap[type];
  26. function checkUrl(url) {
  27. return new Promise((resolve) => {
  28. const startTime = performance.now();
  29. const img = new Image();
  30. let isResolved = false;
  31. img.onload = function () {
  32. if (!isResolved) {
  33. isResolved = true;
  34. resolve({
  35. url: url,
  36. accessible: true,
  37. responseTime: performance.now() - startTime,
  38. });
  39. }
  40. };
  41. img.onerror = function () {
  42. if (!isResolved) {
  43. isResolved = true;
  44. resolve({
  45. url: url,
  46. accessible: true,
  47. responseTime: performance.now() - startTime,
  48. });
  49. }
  50. };
  51. setTimeout(() => {
  52. if (!isResolved) {
  53. isResolved = true;
  54. resolve({
  55. url: url,
  56. accessible: false,
  57. responseTime: 99999,
  58. });
  59. }
  60. }, 5000);
  61. const timestamp = new Date().getTime();
  62. img.src = url + `favicon.ico?t=${timestamp}`;
  63. });
  64. }
  65. function showStatus(message, isError = false) {
  66. let statusDiv = document.getElementById("url-checker-status");
  67. if (!statusDiv) {
  68. statusDiv = document.createElement("div");
  69. statusDiv.id = "url-checker-status";
  70. statusDiv.style.cssText = `
  71. position: fixed;
  72. top: 10px;
  73. right: 10px;
  74. padding: 10px;
  75. background: ${isError ? "rgba(255, 0, 0, 0.8)" : "rgba(0, 0, 0, 0.8)"
  76. };
  77. color: white;
  78. border-radius: 5px;
  79. z-index: 999999;
  80. font-family: Arial, sans-serif;
  81. font-size: 14px;
  82. max-width: 300px;
  83. word-break: break-word;
  84. `;
  85. document.body.appendChild(statusDiv);
  86. }
  87. statusDiv.textContent = message;
  88. return statusDiv;
  89. }
  90. async function checkAllUrls() {
  91. const statusDiv = showStatus("正在检测网络连接...");
  92. try {
  93. const results = await Promise.all(urls.map((url) => checkUrl(url)));
  94. const accessibleUrls = results.filter((result) => result.accessible);
  95. console.log("检测结果:", results);
  96. if (accessibleUrls.length === 0) {
  97. showStatus("所有地址均无法访问!", true);
  98. setTimeout(() => statusDiv.remove(), 3000);
  99. return;
  100. }
  101. const fastestUrl = accessibleUrls.reduce((prev, current) =>
  102. prev.responseTime < current.responseTime ? prev : current
  103. );
  104. showStatus(
  105. `正在跳转到最快地址: ${fastestUrl.url}\n响应时间: ${Math.round(
  106. fastestUrl.responseTime
  107. )}ms`
  108. );
  109. setTimeout(() => {
  110. window.location.href = fastestUrl.url;
  111. statusDiv.remove();
  112. }, 1500);
  113. } catch (error) {
  114. console.error("检测过程出错:", error);
  115. showStatus("检测过程出错,请稍后重试", true);
  116. setTimeout(() => statusDiv.remove(), 3000);
  117. }
  118. }
  119. checkAllUrls();
  120. })();
  121. </script>
  122. </html>