我正在测试一些代码,通过捕获用户点击的链接来从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链接捕获还是普通的浏览器点击操作。
有没有人在这里有任何见解?不幸的是,我想我必须这样做异步......
答案 0 :(得分:1)
在同步模式下,在默认链接事件处理程序看到click事件之前,将获取PDF。
在异步模式下,浏览器首先处理click事件并在当前选项卡中加载PDF文件,因此原始页面会被其所有事件处理程序和回调销毁。
方法1:使用background (event) page脚本:
chrome.runtime.onMessage
,以异步方式获取PDF chrome.runtime.postMessage
方法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;
};
.........