2011-04-11 68 views
5

我插入script标签到像这样的DOM(认为JSONP):什么HTTP头/响应触发脚本标记上的“onerror”处理程序?

var s = document.createElement('script'); 
s.src = "http://abc.com/js/j.js"; 
s.onerror = function() { 
    alert("Error loading script tag!"); 
}; 
document.getElementsByTagName('head')[0].appendChild(s); 

现在,我知道从abc.com一个404为响应上面的脚本会触发事件...什么其他头/响应会导致script标记发生错误?我可以想象它会因浏览器而有所不同,但如果任何人有任何列表,这将是非常有用的。

谢谢!

+1

当我创建并指一个PHP文件中我已经将响应代码设置为404,“onerror”不会触发,而引用一个不存在的文件会抛出“onerror”。 – pimvdb 2011-04-11 18:17:10

+0

更新:可能是因为'Content-length'仍然在我的PHP文件中发送,但似乎无法删除它。 – pimvdb 2011-04-11 18:35:11

回答

7

4xx和5xx应该会导致错误 - 至少它们被定义为错误代码。

刚刚在Fx 3.5中测试过 - 这是正确的说法。

这里的,如果你想测试其他浏览器的测试代码(快速和肮脏......)

var codes = [100, 101, 102, 122, 200, 201, 202, 203, 204, 205, 206, 207, 226, 300, 301, 302, 303, 304, 305, 306, 307, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410], 411, 411, 412, 413,414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 444, 449, 450, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510 ]; 

      $(codes).each(function() { 
       var s = document.createElement('script'); 
       s.src = "http://localhost/test.php?code="+this; 
       var cd = this; 
       s.onerror = function() { 
        document.write(cd+',') 
       }; 
       document.getElementsByTagName('head')[0].appendChild(s); 

      }); 

和PHP代码:

<?php header('HTTP/1.0 '.$_GET['code'].' OK'); ?> 
+1

这实际上只会导致我的Chrome/Apache环境中的“407”错误。 – pimvdb 2011-04-11 18:55:35

+0

这是我得到使用上面的代码在Firefox: '300,301,302,303,304,305,306,307,400,401,402,403,404,405,406,407,409,410,''408,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,''444,449,450,499,500,501,502,503,504,505,506,507,508,509,510,411,'但3xx的应该是因为我不提供Location头 – 2011-04-11 19:58:42

+0

是,在Firefox的更多错误抛出。不知道为什么。根据规格,当负载过程中出现“错误”时应该触发'onerror'。我想这是依赖于浏览器,关于如何解释。 http://dev.w3.org/html5/spec/scripting-1.html#script – pimvdb 2011-04-11 21:24:34

相关问题