XMLhttpRequest for PDF 文件适用于同步,但不适用于异步
xmlhttprequest for pdf file works for sync but not async
我正在测试一些代码,通过捕获用户点击的链接从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;
};
.........
相关文章:
- HTML5 Canvas toDataURL(“image/png”)适用于一些绘画,而有些则不然,不确定原因
- JavaScript不显示剩余字符,但适用于其他页面
- 我如何完善这个Javascript代码,使其只适用于来自图像的链接(而不是来自文本的链接)
- 为什么这只适用于身体部分而不是头部
- 为什么不't此正则表达式适用于重复出现的对
- document.getElementById 对内部 html 的调用适用于 $_POST 和 $_GET 变量,但不
- JavaScript 位置适用于本地主机而不是服务器
- Rally App SDK 2.0:Rallymultiobjectpicker,适用于不显示displayField的
- jQuery事件在Mozilla上不起作用,并且适用于其他浏览器
- Angular.js - 控制器不为索引执行,适用于其余模板
- D3 .on 更改适用于文本而不是图表
- Zillow 数据 - json_encode不起作用 - 适用于常规变量
- 弹出模式仅适用于表格中的第一个元素,第二次单击后不会再次打开
- Phonegap Android项目适用于模拟器,而不是实际的手机
- ajax jonp 不应该适用于 请求的上不存在“访问控制-允许源”标头
- AngularJS:ng-单击不起作用,适用于<按钮>
- Javascript不会在移动设备上加载.适用于桌面
- 为什么我的代码适用于高度:100px,而不是高度:100%
- 拖放区.js + Laravel-多文件上传不起作用(仅适用于一个文件)
- 哪些限制适用于不透明响应