javascript - pdf 文件的 xmlhttprequest 适用于同步,但不适用于异步

标签 javascript ajax http asynchronous google-chrome-extension

我正在测试一些代码,通过捕获用户点击的链接从 Chrome 扩展中抓取 PDF。同步 xm​​lhttprequest 适用于 html 文档和 pdf 的链接。然而,异步似乎永远不会返回。我是不是做错了什么?

这是失败的异步版本中我的 content.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 中移出) code> 到调用函数。

但是当我异步获取 pdf 时,它只是说“正在寻找链接”,然后就是沉默——没有错误,没有响应。它确实给了我一条消息:

Resource interpreted as Document but transferred with MIME type application/pdf: "[URL TO PDF]".

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

有人对此有任何见解吗?不幸的是,我想我必须异步执行此操作...

最佳答案

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

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

方法 1:使用 background (event) page脚本:

  • 在后台页面定义一个消息监听器:chrome.runtime.onMessage,它将异步获取 PDF
  • 在点击处理程序中使用 chrome.runtime.postMessage 发送包含 PDF 网址的消息

方法 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;
    };
    .........

关于javascript - pdf 文件的 xmlhttprequest 适用于同步,但不适用于异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38336051/

相关文章:

javascript - jQuery 'on' 事件在 'load' 事件后不起作用

javascript - jQuery ajax 不返回整个对象

laravel - 如何修复 Laravel request/routes/urls - 它认为 url 是 http,而实际上是 https

http - POST 数据是否应该在超时条件下重试?

javascript - 为什么nodejs中http的CreateServer中调用了两次回调

javascript - jQuery 从具有相同类的不同 div 的元素中获取文本值

javascript - Node.js 类型错误 : path must be a string or Buffer

javascript - 正则表达式匹配年份,但不匹配javascript中的其他数字

javascript - 创建一个 JS 服务器,用于归档一周前的数据

javascript - 使用ajax和json laravel在警报框中显示消息