如果我运行window.open(..)
是否可以获得这个新窗口请求的响应代码?
我不想在单独的窗口中从单独的服务下载文件,但该服务可以响应 200、404 和 409。我需要在主窗口中正确处理此响应代码。
还有跨浏览器的解决方案吗?
最佳答案
简短回答,no 。响应代码不包含在 window
对象中。
使用 window.open
解决您的问题的唯一 JavaScript 解决方案是您的服务在文档正文中返回状态代码的副本。然后你可以用(ES6)解析它:
const foo = window.open('http://stackoverflow.com');
foo.addEventListener('load', () => {
console.log(foo.document.body.innerHTML);
// or
console.log(foo.document.body.innerText);
});
一个重要的警告是两个页面都需要托管在同一个域或you'll run into some cross-origin issues上。我猜这对你不起作用。
另一种解决方案是使用 XMLHttpRequest 创建 blob,将文件保存到临时存储,然后引导用户下载它。您可以按如下方式执行此操作 ( adapted from this SO answer ) (ES6):
const xhr = new XMLHttpRequest();
xhr.responseType = 'blob';
xhr.addEventListener('load', () => {
if (xhr.status === 200) {
window.location = window.URL.createObjectURL(xhr.response);
} else {
// error handling
}
});
xhr.send(postData);
这假设您有一个文件通常不会被 浏览器,如果您需要下载图像或视频等内容,请使用 the download attribute 如相关链接答案中所示。另外,取决于什么浏览器 如果你想支持,你可能需要一个polyfill来实现这个解决方案。 See CanIUse.另请注意该选项 还会将文件加载到内存中,因此要警惕大文件。
最后,最明显、最简单的解决方案是@charlietfl 在评论中提到的,那就是处理服务器端。根据您使用的语言,这相当简单。
关于javascript - 可以从父窗口访问响应代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53306218/