2010-08-27 82 views
2

我试图覆盖XMLHttpRequest对象上的getResponseBody方法。代码如下这样:无法覆盖XMLHttpRequest上的getResponseHeader方法

xhr.onreadyStateChange = function(){ 
    if (xhr.readyState !== 4) { 
     return; 
    } 
    if (xhr.status === 200) { 
     // callback to handle the result 
    } else { 
     var _orig = xhr.getResponseHeader; 
     xhr.getResponseHeader = function(name){ 
      return decodeHeader(_orig.apply(xhr,[name])); 
     }; 
     // callback to handle the failure 
    } 
} 

它抛出调用_orig.apply时错误“对象不支持此属性或方法”。

有什么想法?谢谢。 PS:我每次创建一个新的XHR对象,不要重复使用旧的XHR对象。

回答

3

XMLHttpRequest是一个host object(即由环境提供以表示环境而不是语言的一部分的对象),并且主对象可以基本上做他们喜欢的任何事情。它们不像内置对象那样受到相同的规则约束。 IE尤其值得注意,因为它利用了这种自由,其许多主机对象(包括XMLHttpRequest)的行为并不像人们希望的那样。

因此,最好不要尝试添加或更改任何主机对象的任何属性。相反,写你自己的XMLHttpRequest包装。

+0

另请参阅http://ajaxian.com/archives/ie7-xmlhttprequest-native-or-not – 2010-08-27 10:14:51

+0

Marcel:是的。对于任何浏览器的“XMLHttpRequest”实现来说,“Native”是单词的一个奇怪选择:它始终是一个主机对象。对于Web开发人员来说,IE 7的这种变化几乎没有什么实际影响,除非IE 6已经足够让人无视了。 – 2010-08-27 10:33:34