目前正在开发一个项目,我们通过AJAX获得一堆图像。 我们做了很多这些,似乎IE11似乎失去了很多。
我们获取图片,调用“URL.createObjectURL”,获取有效的URL,但是在下一行,图像消失了。这在其他浏览器中运行良好,我假设我们在IE中遇到了一些限制。
是否有更好的方法来检测此URL是否有效而不是尝试加载它?
似乎有点多余:
代码:
var urlObj = window.URL || window.webkitURL;
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (this.readyState == 4) {
active--;
if (this.status == 200) {
var blobUrl = urlObj.createObjectURL(new Blob([this.response], {type : 'image/jpeg'}));
image.setSource(blobUrl);
}
}
}
xhr.open('GET', url);
xhr.responseType = 'arraybuffer';
xhr.send();
因此,如果你称之为A LOT(具有不同的URL) - 我们传递给setSource的blobUrl是一个看似合理的对象URL,但是当你尝试使用它时,就会出现错误。 IE已清理内存,或丢失图像或其他东西。请记住,我们不会更改页面,丢失会话或撤消blobUrl。
我能想到检查这是否已经发生的唯一方法(即blobURL不再指向任何东西),是在blobURL上发出另一个AJAX请求,然后检查它返回200等等.... 有没有更好的办法?我想象的不是。
我已经从一个更大的块中“雕刻”了这个代码块,所以如果有任何明显的错误,那就是原因。它的工作时间约为95%。如果我之后触发AJAX“检查”,并在修复问题的失败时再次加载图像。
奇怪的IE行为。其他人看过这个吗?
更多信息:我们没有使用pdf.js,但此处报告了同样的问题:https://connect.microsoft.com/IE/feedback/details/813485/resource-blob-not-found-when-using-url-createobjecturl-blob
答案 0 :(得分:0)
这是(或多或少)我们正在使用的支票:
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function(){
if (this.readyState == 4){
if (this.status == 200 || (this.response && this.response.type && this.response.type == "image/jpeg")) {
success(blobUrl);
}
else {
fail(blobUrl);
}
}
}
xhr.open('GET', blobUrl);
xhr.responseType = 'blob';
xhr.send();
必须使用那种奇怪的response.type检查,因为Firefox返回状态== 0。