我有一个脚本,该脚本将某个地址加载到子窗口中并对其进行处理。如果我无法访问已加载的文档,我想知道浏览器是由于网络或服务器关闭而加载了Chrome错误页面,还是因为没有为实际窗口禁用安全性和站点隔离而收到错误消息。在两种情况下,我都得到相同的DOMException{stack: 'Error: Blocked a frame with origin "..." from accessing a cross-origin frame.
。我考虑过使用navigator.onLine
和/或使用XHR作为可能的解决方案,但是我不确定是否可行。如果没有必要,我不想尝试几天。有没有人解决过这个问题?
结论:
我最终使用了带有异步功能的已接受答案的修改版本:
async function isAlive(url) {
try {
await fetch(url, {mode: 'no-cors'});
return true;
} catch(error){
return false;
}
}
(async function main(){
const addresses = [
'https://google.com',
'https://reallyf4kewebsite.com',
'/',
'https://google.com/foo/bar/baz'
];
const results = await Promise.all(addresses.map((address) => isAlive(address)));
addresses.forEach((address, index) => console.log(address, results[index]));
})();
答案 0 :(得分:2)
您可以通过对服务器执行不带请求的请求来知道服务器是否还活着。
但是您将无法获得更多的信息,即错误重定向(404、501等)将仍然有效。
这是因为,虽然此模式允许我们像没有CORS限制那样发送请求,但是您将获得的响应实际上是不透明的,除了“ URL映射到某个响应”之外没有其他信息。< / em>将可以通过我们的脚本访问。
function isAlive(url) {
return fetch(url, {mode: 'no-cors'})
.then(r => true)
.catch(r => false);
}
isAlive('https://google.com')
.then(r => console.log('google', r));
isAlive('https://reallyf4kewebsite.com')
.then(r => console.log('reallyf4kewebsite', r));
isAlive('/')
.then(r => console.log('stacksnippets', r));
isAlive('https://google.com/foo/bar/baz')
.then(r => console.log('404 redirect', r));