某一天,我用 js 写了一段 jsonp 的代码。以前在学校也这么写,因为在学校没有测试IE所有的版本兼容性,一直觉得这段代码木有问题。
代码是这样子的:
简单来说就是将一个script标签添加进入dom,这样就可以伪造一次请求,因为同源策略可以用script/image之类标签回避掉。
1 | Util.prototype.loadScript = function (url, params, cb) { |
直到测试同事那天在测试的时候,发现IE7,IE6的时候,请求可以发送,但是 callback 函数没有执行。导致了一个按钮好像像点不动一样。
这种 bug 算得上是严重的 bug 了,经过排查,发现确实是代码不完善,没有考虑到:
在多数浏览器(包括Firefox和Chrome)下会触发onload和onerror, 但是在IE下只会触发 onreadystatechange,也就是说在IE8及IE8以下,onerror和onload都不能够使用。
所以要调用回调函数一定需要再写一个针对 onreadystatechange 时的操作。错误中成长。
1 | script.onreadystatechange = function() { |
完整的代码如下:
1 | Util.prototype.loadScript = function (url, params, cb) { |