域名检测跳转.js 3.5 KB

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