xmlhttprequest for pdf file适用于同步但不适用于异步

时间:2016-07-12 18:05:48

标签: javascript ajax http asynchronous google-chrome-extension

我正在测试一些代码,通过捕获用户点击的链接来从Chrome扩展程序中抓取PDF。同步xmlhttprequest适用于指向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文档的链接时,它会按预期记录&#34;查找链接&#34;,&#34;已加载,&#34;网址和&#34; 200&#34;。当我重写此代码以同步获取时(通过将open方法的最后一个参数切换为true,并将所有日志记录代码移出unload),这也是它记录的内容到调用函数。

但是当我异步获取pdf时,它只是说&#34;寻找链接&#34;然后沉默---没有错误,没有回应。它确实给了我一个信息:

  

资源被解释为文档但使用MIME类型application / pdf传输:&#34; [URL to PDF]&#34;。

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

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

1 个答案:

答案 0 :(得分:1)

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

在异步模式下,浏览器首先处理click事件并在当前选项卡中加载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;
    };
    .........