可以从父 window 访问响应代码吗?
Can response code be accessed from parent window?
如果我 运行 window.open(..)
是否可以获得这个新 window 请求的响应代码?
我不想在 window 中从单独的服务下载文件,但该服务可以响应 200、404 和 409。我需要在 main window 中正确处理此响应代码.
另外有没有跨浏览器的解决方案?
简答,no。 window
对象中不包含响应代码。
使用 window.open
解决您的问题的唯一 JavaScript 方法是您的服务 returns 文档正文中的状态代码副本。然后你可以用 (ES6):
解析它
const foo = window.open('http://whosebug.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);
这假定您有一个通常不会被
浏览器,如果您需要下载图片或视频之类的东西,请使用
下载
属性
如相关链接答案中所示。另外,取决于什么浏览器
你想支持,你可能需要这个解决方案的 polyfill。 See CanIUse.还要注意这个选项
也会加载文件到内存中,所以要小心大文件。
最后,最明显和最简单的解决方案是评论中提到的@charlietfl,它处理这个服务器端。根据您使用的语言,这很容易。
如果我 运行 window.open(..)
是否可以获得这个新 window 请求的响应代码?
我不想在 window 中从单独的服务下载文件,但该服务可以响应 200、404 和 409。我需要在 main window 中正确处理此响应代码.
另外有没有跨浏览器的解决方案?
简答,no。 window
对象中不包含响应代码。
使用 window.open
解决您的问题的唯一 JavaScript 方法是您的服务 returns 文档正文中的状态代码副本。然后你可以用 (ES6):
const foo = window.open('http://whosebug.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);
这假定您有一个通常不会被 浏览器,如果您需要下载图片或视频之类的东西,请使用 下载 属性 如相关链接答案中所示。另外,取决于什么浏览器 你想支持,你可能需要这个解决方案的 polyfill。 See CanIUse.还要注意这个选项 也会加载文件到内存中,所以要小心大文件。
最后,最明显和最简单的解决方案是评论中提到的@charlietfl,它处理这个服务器端。根据您使用的语言,这很容易。