2015-09-07 40 views
0

我试图倍率prototype.js通过与continue;添加在setRequestHeaders功能if()避免指定部首的Prototype.js 1.4.0抛出“拒绝设置不安全标题‘连接’”错误

for (var i = 0; i < requestHeaders.length; i += 2){ 
    if("Connection" === requestHeaders[i] || "Connection" === requestHeaders[i+1]) 
      continue; 
    this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]); 
    } 

在IE9上这个工作正常,没有修改到prototype.js,但是在其他浏览器(Chrome,Firefox等)中出现错误标题..

感谢您的任何建议和帮助! :)

[编辑]

工作重复的问题: 我发现这个话题,但它不是一样的。在重复的主题中有一个可以修改的文件,但我不能修改prototype.js的代码。

[EDIT2]

此代码是在1.4.0(如写入标题),线约661-685

setRequestHeaders: function() { 
var requestHeaders = 
    ['X-Requested-With', 'XMLHttpRequest', 
    'X-Prototype-Version', Prototype.Version]; 

if (this.options.method == 'post') { 
    requestHeaders.push('Content-type', 
    'application/x-www-form-urlencoded'); 

    /* Force "Connection: close" for Mozilla browsers to work around 
    * a bug where XMLHttpReqeuest sends an incorrect Content-length 
    * header. See Mozilla Bugzilla #246651. 
    */ 
    if (this.transport.overrideMimeType) 
    requestHeaders.push('Connection', 'close'); 
} 

if (this.options.requestHeaders) 
    requestHeaders.push.apply(requestHeaders, this.options.requestHeaders); 

for (var i = 0; i < requestHeaders.length; i += 2){ 
    console.log(requestHeaders[i] + " AND " + requestHeaders[i+1]); 
    //My edition - BEGIN; 
    if("Connection" === requestHeaders[i] || "Connection" === requestHeaders[i+1]) 
      continue; 
    //END; 
    this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]); 
    } 
} 

谢谢! :)

+0

什么是'.equals(...)'?这当然不是Javascript ... – Tomalak

+0

是的,它是@Tomalak – epascarello

+0

@epascarello不,它不是。在规格中告诉我。 – Tomalak

回答

1

所以看来你想改变原型的行为,而不必触摸库代码本身。

这不是问题,您可以在运行时换掉setRequestHeaders函数。

在加载原型的<script>行之后,但在执行任何其他操作之前,请包括此内容。

// monkey-patch Prototype's Ajax request (the following is for Prototype 1.4!) 
Ajax.Request.prototype.setRequestHeaders = function() { 
    var requestHeaders = 
    ['X-Requested-With', 'XMLHttpRequest', 
    'X-Prototype-Version', Prototype.Version]; 

    if (this.options.method == 'post') { 
    requestHeaders.push('Content-type', 
     'application/x-www-form-urlencoded'); 

    /* Force "Connection: close" for Mozilla browsers to work around 
    * a bug where XMLHttpReqeuest sends an incorrect Content-length 
    * header. See Mozilla Bugzilla #246651. 
    */ 
    if (this.transport.overrideMimeType) 
     requestHeaders.push('Connection', 'close'); 
    } 

    if (this.options.requestHeaders) 
    requestHeaders.push.apply(requestHeaders, this.options.requestHeaders); 

    for (var i = 0; i < requestHeaders.length; i += 2) { 
    if (requestHeaders[i].toLowerCase() === "connection") continue; 
    this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]); 
    } 
}; 
+0

这将完全@Override原型的方法? – Rafcik

+0

从技术上讲,它将*物理替换*方法([见](https://en.wikipedia.org/wiki/Monkey_patch))。但实际上,是的。 – Tomalak

+1

toLowerCase是一个JavaScript函数,因此它应该有打开/关闭括号。 您可以对连接执行相同的检查,如下面的代码所述。 '如果(requestHeaders [I] .toLowerCase()= “连接”!){ \t this.transport.setRequestHeader(requestHeaders [I],requestHeaders第[i + 1]);' \t} –

相关问题