Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

XHR对象请求data或blob资源的行为

  data和blob都属于本地资源,他们并不在服务器上,可是他们却是一个URL。而XHR对象可以接收URL,这就意味着XHR对象可能对这些本地资源发起访问。但XHR要对这样的操作做出怎样的处理呢?实际上在规范中已有部分定义,而且浏览器上也存在兼容差异。
  对于data URL,规范中定义了可以使用GET方法来正常请求,其它方法将返回501的HTTP代码。 但对于blob URL,我就没有找到相关的定义了。下面是实际测试的代码
<script>
var blob=URL.createObjectURL(
  new Blob(['blob数据'],{"type":"text/plain"})
),data="data:text/plain,data数据"

test("GET",blob);
test("GET",data);
test("POST",blob); //这个测试在IE11上会导致浏览器进程死掉
test("POST",data);

function test(method,url){
  try{
    var xhr=new XMLHttpRequest;
    xhr.open(method,url,false);
    xhr.send();
    throw method+":"+xhr.responseText;
  }catch(e){
    console.log(e.name||e);
  };
};
</script>

  在Chrome上只有blob的GET请求可以正常工作,对于data URL会被跨域安全策略阻止,这显然是不正确的。IE由于会在对blob URL发起请求时卡死,所以这里就不对IE的行为截图了。但是我在IE11上的测试结果和Chrome上基本是相同的,除了那个卡死进程的BUG之外。总之,这些浏览器都没支持好,包括Firefox对data URL在POST方法上的行为也过度实现了,它对data URL甚至支持了POST方法。
  为什么我会想到这么奇怪的问题呢?其实我原本想尝试使用data URL来做base64的解码的,顺道就测试了blob。但是看到这个兼容结果想必是无法直接通过XHR对象来解码了。嘛,总之希望浏览器们早点兼容好。另外对于IE不负责任地卡死浏览器行为表示深切哀悼。
网名:
54.224.247.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^