2015-09-07 37 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} –

相關問題