【问题标题】:Can response code be accessed from parent window?可以从父窗口访问响应代码吗?
【发布时间】:2019-04-17 18:35:20
【问题描述】:

如果我运行window.open(..) 是否可以获得这个新窗口请求的响应代码?

我不想在单独的窗口中从单独的服务下载文件,但该服务可以响应 200、404 和 409。我需要在主窗口中正确处理此响应代码。

另外有没有跨浏览器的解决方案?

【问题讨论】:

  • 您可能想使用服务器端代理来发出请求

标签: javascript window.open


【解决方案1】:

简答,nowindow 对象中不包含响应代码。

使用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.还要注意这个选项 还会将文件加载到内存中,因此请注意大文件。

最后,最明显和最简单的解决方案是 cmets 中提到的 @charlietfl,它正在处理这个服务器端。根据您使用的语言,这相当容易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 2013-06-05
    • 1970-01-01
    • 2012-04-05
    • 2018-12-18
    相关资源
    最近更新 更多