当前位置: 首页 > 知识库问答 >
问题:

XMLHttpRequest抛出InvalidSateError表示“必须打开对象状态”

贺兴昌
2023-03-14

密码-

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

我似乎想不出背后的原因是什么。

共有1个答案

利俊迈
2023-03-14

错误是直截了当的:

ContextMenus的事件处理程序中出错:InvalidStateError:无法对“XMLHttpRequest”执行“Set RequestHeAder”:对象的状态必须打开。

设置请求标头之前,需要调用.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);
        }
    };

};
 类似资料:
  • 问题内容: 代码 - 它抛出以下错误: 如何使用- 我似乎无法弄清楚背后的原因是什么。 问题答案: 错误很简单: contextMenus的事件处理程序中的错误:InvalidStateError:无法对’XMLHttpRequest’执行’setRequestHeader’:对象的状态必须为OPENED。 您需要在设置请求标头之前调用。 对于您的代码,我认为最好的方法是将调用移到函数中以打开。

  • 简介 浏览器与服务器之间,采用 HTTP 协议通信。用户在浏览器地址栏键入一个网址,或者通过网页表单向服务器提交内容,这时浏览器就会向服务器发出 HTTP 请求。 1999年,微软公司发布 IE 浏览器5.0版,第一次引入新功能:允许 JavaScript 脚本向服务器发起 HTTP 请求。这个功能当时并没有引起注意,直到2004年 Gmail 发布和2005年 Google Map 发布,才引起

  • 主要内容:1. 语法,2. 方法,3. 属性,3. 例子对象在网页的客户端和服务器端之间建立介质,可以由许多脚本语言(如,,和其他Web浏览器)使用,以传输和操作XML数据。 使用对象,可以更新网页的一部分而无需重新加载整个页面,在页面加载后从服务器请求和接收数据并将数据发送到服务器。 1. 语法 对象可以实例化如下 - 要处理所有浏览器,包括IE5和IE6,请检查浏览器是否支持对象,如下代码所示 - 可以查看如何使用XMLHttpRequest对象加

  • IE5 是第一款引入XHR 对象的浏览器。在IE5 中,XHR 对象是通过MSXML 库中的一个ActiveX对象实现的。因此,在IE 中可能会遇到三种不同版本的XHR 对象,即MSXML2.XMLHttp、MSXML2.XMLHttp.3.0 和MXSML2.XMLHttp.6.0。要使用MSXML 库中的XHR 对象,需要像第18章讨论创建XML 文档时一样,编写一个函数,例如: //适用于I

  • 问题内容: 我一直在尝试更新一个名为libpynexmo的小型Python库以与Python 3一起使用。 我一直坚持这个功能: 遇到这个问题时,json会回应: 我在一些地方读到,应该为您传递带有附件的对象(在这种情况下为对象),但是它不适用于对象。 我不知道下一步该怎么做,但是由于我的整个1500行脚本是新转换为Python 3的,所以我不想回到2.7。 问题答案: 我最近写了一个小功能来发送

  • 这是我的代码的一部分,工作不正常,我试图设置键,使桨向上和向下移动,但我无法找出我的代码有什么问题。 错误是: 参数必须是rect样式对象