丢弃图片的 HTTP 请求

OS Browser "" null remove delete stop StopImage Stop Button Timeout
Windows IE6,7,8 √(e) √(e) II × × × × × 21s (e)
\/ FF4,5 II II II × II × × II 21s (e)
\/ Chrome12 × × × × II × × II 21s (e)
\/ Safari4,5 × × × × II × × II 21s (e)
\/ Opera9 × √(e) × × II × × II 47s (e)
\/ Opera11 II √(e) II II II × × II 47s (e)
Mac OS X Safari5 × × × × II × × II 1.2m (e)
\/ Chrome12 × × × × II × × II 1.2m (e)
\/ FF4,5 II II II × II × × II 1m'15s (e)
Ubuntu FF4,5 II II II × II × × 3m'9s (e)
\/ Chrom(e/ium)12 × × × × II × × 3.2m (e)
  • Windows XP, Server 2003, 7.
  • Mac OS X 10.6.7
  • Ubuntu 11.04

标题注解:

"":: img.src = "" null:: img.src = null revmove:: img.removeAttribute("src") delete:: delete img["src"] stop:: window.stop() StopImage:: document.execCommand("StopImage") Stop:: document.execCommand("Stop") Button:: Browser Stop Button.

图标注解:

√:: 能够 Abort 图片请求,并回调 (e)onerror/(a)onabort/(l)onload 函数。 II:: 能够 Abort 图片请求,但不触发任何事件进行回调。 ≈:: 部分版本支持。如 Stop/StopImage 在 .NET Framework 3.0 中取消了支持。 ×:: 不能 Abort 图片请求,或不支持该方法。

事件回调

var img = new Image();
img.onload = function(){out.innerHTML += "loaded.";};
img.onabort = function(){out.innerHTML += "aborted.";};
img.onerror = function(){out.innerHTML += "errored.";};
window.setTimeout(function(){
    out.innerHTML += "before.";
    // abort.
    img.src = null;
    out.innerHTML += "after." + img.complete;
}, 2000);

1
2
3
4
5
6
7
8
9
10
11
12

测试结果:

IE:: before.errored.after. Opera:: before.after.errored. FF:: before.after. Chrome:: before.after. Safari:: before.after.

TODO:丢弃 jsonp 请求?

为什么不是 script/link?

使用 document.createElement("script") 创建元素并设置 src 属性, appendChild 到 DOM 中会去请求指定资源,可以到底向日志服务器发送数据的要求。

但是使用这种方式有一下几点弊端:

  1. 创建脚本带来的危险性。
  2. 会向 DOM 中附加元素,影响 DOMLint 校验。
  3. 无法 abort,无论设置 script = null;, script.src="";, script.src=null;, script.removeAttribute("src");, document.body.removeChild(script); 都无法实现 abort.
  4. 引入资源不触发 onload/onerror/onabort 事件,除非使用 jsonp 的方式, 对元素本身无法得到回调。

See Also

Help
[count]gg 跳转到第 [count] 行,默认第 1 行。
[count]G 跳转到第 [count] 行,默认最后一行。
[count]j 向下跳转 [count] 行,默认跳转一行。
[count]k 向上跳转 [count] 行,默认跳转一行。
/ 开始搜索。按 <Esc> 退出。
gh 跳转到首页。
gb 跳转到博客首页。
gw 跳转到 Wiki 首页。
gt 跳转到我的 Twitter Profile 页。
gp 跳转到我的 Github Profile 页。
? 打开帮助。按 <Esc> 退出。