XMLHttpRequest抛出InvalidSateError说“;对象状态必须打开”;

XMLHttpRequest throwing InvalidSateError saying "Object state must be opened"

本文关键字:状态 对象 抛出 InvalidSateError XMLHttpRequest      更新时间:2023-11-17

代码-

"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);
        }
    };
};

它抛出以下错误:

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

如何使用-

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();

我似乎不明白背后的原因是什么。

错误是直接的:

contextMenu的事件处理程序中出错:InvalidStateError:未能对"XMLHttpRequest"执行"setRequestHeader":对象的状态必须为OPENED。

在设置请求标头之前,您需要调用.open(..)



考虑到您的代码,我认为最好的方法是将调用移动到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);
        }
    };
};

您可能需要在XMLHttpRequest调用之后和setRequestHeader调用之前打开连接,而不是:

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

我认为你需要做:

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

也要确保删除init()中的这一行,就像上面所做的那样。