XMLhttpRequest for PDF 文件适用于同步,但不适用于异步

xmlhttprequest for pdf file works for sync but not async

本文关键字:适用于 不适用 异步 同步 PDF 文件 XMLhttpRequest for      更新时间:2023-09-26

我正在测试一些代码,通过捕获用户点击的链接从chrome扩展程序中抓取PDF。 同步 xmlhttprequest 适用于指向 html 文档和 pdf 的链接。 但是,异步似乎永远不会返回。 我做错了什么可怕的事情吗?

以下是我的内容的最小演示示例.js在失败的异步版本中:

var links = document.getElementsByTagName("a");
function getlink(link) {
    console.log("looking for link");
    var x = new XMLHttpRequest();
    x.open("GET", link, true);
    x.onload = function(e) {
        console.log("loaded");
        console.log(link);
        console.log(x.status);
    };
    x.onerror = function (e) {
        console.error(x.statusText);
    };
    x.send(null);
}
for (i = 0, len = links.length; i < len; i++) {
    var l = links[i]
    l.addEventListener("click", function() {
        console.log(this.href);
        getlink(this.href);
    }, false);
};

使用该代码,当单击指向 HTML 文档的链接时,它会按预期记录"查找链接"、"已加载"、"URL 和"200"。 当我重写此代码以同步获取时,这也是它记录的内容(通过将 open 方法的最后一个参数切换为 true,并将所有日志记录代码从unload移动到调用函数。

但是当我异步获取pdf时,它只是说"寻找链接",然后静音---没有错误,没有响应。它确实给了我一条消息:

资源解释为文档,但使用 MIME 类型应用程序/pdf 传输:"[URL 到 PDF]"。

但我不确定这是来自 javascript 链接捕获,还是普通的浏览器单击操作。

有人在这里有任何见解吗? 不幸的是,我想我必须做这个异步...

在同步模式下,在默认链接事件处理程序看到单击事件之前获取 PDF。

在异步模式下,浏览器首先处理单击事件并在当前选项卡中加载 PDF 文件,因此原始页面及其所有事件处理程序和回调都将被销毁。

方法一:使用后台(事件)页面脚本:

  • 定义消息侦听器:在后台页面中chrome.runtime.onMessage,以异步方式获取PDF
  • 在单击处理程序中,使用 chrome.runtime.postMessage 发送包含 PDF URL 的消息

方法 2:禁用默认点击行为:

    l.addEventListener("click", function(e) {
        e.preventDefault();
        //e.stopPropagation(); // may be needed if the page has a custom event handler
        //e.stopImmediatePropagation(); // same reason
        console.log(this.href);
        getlink(this.href);
    }, false);
    .........

也许在获取PDF后进行导航:

function getlink(link) {
    .........
    x.onload = function(e) {
        console.log("loaded");
        console.log(link);
        console.log(x.status);
        window.location.href = link;
    };
    .........