2015-02-15 17 views
9

Kod -XMLHttpRequest rzucanie InvalidSateError mówiąc "stan obiektu musi być otwarty"

"use strict"; 

var AJAX = function (params) { 
    this.server ={}; 
    this.url = params.url; 
    this.method = params.method; 
    this.dataType = params.dataType; 
    this.formData = params.formData; 

    this.init = function(){ 
     if(typeof XMLHttpRequest != 'undefined'){ 
      this.server = new XMLHttpRequest(); 
      this.server.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); 
      this.server.setRequestHeader('Content-length', this.formData.length); 
      this.server.setRequestHeader('Connection', 'close'); 
      console.log("XMLHttpRequest created."); 
      return true; 
     } 
    }; 

    this.send = function(){ 
     if(this.init()){ 
      this.server.open(this.method, this.url, true); 
      this.server.send(this.formData); 
     } 
    }; 

}; 

jest rzucanie następujący błąd:

Error in event handler for contextMenus: InvalidStateError: Failed to execute 'setRequestHeader' on 'XMLHttpRequest': The object's state must be OPENED. 

Jak to jest używany -

var data = new FormData(); 

data.append('user', 'sachin'); 
var params = { 
    url : 'example.com', 
    method : 'post', 
    dataType: 'json', 
    formData : data 
}; 

var backgroundWindow = chrome.extension.getBackgroundPage(); 

var ajax = new backgroundWindow.AJAX(params); 

ajax.send(); 

Nie mogę wydawać się dowiedzieć się, co jest przyczyną. Prawdopodobnie

Odpowiedz

19

Błąd jest prosta:

Error in event handler for contextMenus: InvalidStateError: Failed to execute 'setRequestHeader' on 'XMLHttpRequest': The object's state must be OPENED.

Trzeba zadzwonić .open(..) przed ustawieniem nagłówków żądania.



Biorąc pod uwagę kod, uważam, że najlepszym sposobem byłoby przenieść rozmowę, aby otworzyć w funkcji init(..).

var AJAX = function (params) { 
    this.server ={}; 
    this.url = params.url; 
    this.method = params.method; 
    this.dataType = params.dataType; 
    this.formData = params.formData; 

    this.init = function(){ 
     if(typeof XMLHttpRequest != 'undefined'){ 
      this.server = new XMLHttpRequest(); 

      //Open first, before setting the request headers. 
      this.server.open(this.method, this.url, true); 

      //Now set the request headers. 
      this.server.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); 
      //this.server.setRequestHeader('Content-length', this.formData.length); 
      //this.server.setRequestHeader('Connection', 'close'); 
      console.log("XMLHttpRequest created."); 
      return true; 
     } 
    }; 

    this.send = function(){ 
     if(this.init()){ 
      this.server.send(this.formData); 
     } 
    }; 

}; 
+0

Tak. To jest oczywiste. :) Głupio mnie nie odczytuje poprawnie błędu. Dziękuję Ci . – SachinGutte

+0

Jeszcze jedna rzecz do dodania, muszę usunąć nagłówki "Content-Length" i "Connection". Przeglądarka zajmuje się tym. Ale gdzie można ich użyć? – SachinGutte

+0

Prawidłowo, przeglądarka zajmuje się tymi dwoma nagłówkami. Nie powinieneś ich określać. Jeśli dobrze zrozumiem twoje pytanie, nie będą one nigdzie używane. – SuperSaiyan

2

Trzeba otworzyć połączenie po zakończeniu rozmowy XMLHttpRequest i przed setRequestHeader rozmowy Zamiast:

 this.server = new XMLHttpRequest(); 
     this.server.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); 

myślę, że trzeba zrobić:

 this.server = new XMLHttpRequest(); 
     this.server.open(this.method, this.url, true); 
     this.server.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); 

również upewnić się, że usunięcie tego linia w init(), tak jak zrobiliście powyżej.

Powiązane problemy