INVALID_STATE_ERR:DOM异常11 [英] INVALID_STATE_ERR: DOM Exception 11

查看:1525
本文介绍了INVALID_STATE_ERR:DOM异常11的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我开发了一个简单的辅助类,发用XmlHtt prequest(低于code)的请求。但我不能让它工作。在谷歌浏览器,例如,我得到的错误 INVALID_STATE_ERR:DOM异常11 ,并在其他浏览器,我得到一个状态== 0

  // @方法XRequest:对象的构造。由于这实现了一个单,对象不能创建调用构造函数,的GetInstance应该叫代替
传播XRequest(){
    this.XHR = XRequest.CreateXHR();
}
XRequest.instance = NULL;

// @法的getInstance:创建类型XRequest的一个单独的对象。应每当类型的对象需要被调用。
// @回归:一个XRequest对象的实例
XRequest.GetInstance =功能(){
    如果(XRequest.instance == NULL){
        XRequest.instance =新XRequest();
    }
    返回XRequest.instance;
}

// @方法静态CreateXHR:Implments一个基本的工厂方法来创建XMLHtt prequest对象
// @回报:XMLHttp对象或空
XRequest.CreateXHR =功能(){
    VAR XHR = NULL;
    VAR厂= [
        功能(){返回新XMLHtt prequest(); },
        功能(){返回新的ActiveXObject(MSXML2.XMLHTTP); },
        功能(){返回新的ActiveXObject(Microsoft.XMLHTTP); }
    ]。

    对于(VAR I = 0; I< factory.length ++我){
        变种F =工厂[I]
        XHR = f()的;
        如果(XHR)返回XHR;
    }
    返回null;
}

XRequest.prototype.SetRequestHeader =函数(名称,值){
    如果(this.XHR){
        this.XHR.setRequestHeader(名称,值);
    }
}

XRequest.prototype.SendRequest =功能(参数){
    VAR异步=真实;
    VAR TYPE =;
    VAR URL =;
    VAR用户名=;
    VAR密码=;
    VAR体= NULL;
    VAR成功= NULL;
    VAR失败= NULL;

    对于(五在args){
        开关(E){
            案异步:
                异步= ARGS [E]
                打破;
            案类型:
                类型= ARGS [E]
                打破;
            案成功:
                成功= ARGS [E]
                打破;
            案失败:
                失败= ARGS [E]
                打破;
            案URL:
                URL = ARGS [E]
                打破;
            案用户名:
                用户名= ARGS [E]
                打破;
            案密码:
                密码= ARGS [E]
                打破;
            案体:
                身体= ARGS [E]
            打破;
            案SetHeader可以:
                VAR H =的args [E] .split(:);
                如果(h.length == 2){
                    this.SetRequestHeader(H [0]中,h [1]);
                }
                打破;
        }
    }

    VAR的=这一点;
    this.XHR.onreadystatechange =功能(){
        警报(readyState的==+ that.XHR.readyState +状态==+ that.XHR.status);
        如果(that.XHR.readyState == 4){
            如果(that.XHR.status == 200 || that.XHR.status == 0){
                如果(成功)成功(that.XHR);
            } 其他 {
                如果(失败)失败();
            }
        }
    };
    this.XHR.open(类型,URL,异步,用户名,密码);
    this.XHR.send(体);
}
 

使用示例:

 < SCRIPT LANGUAGE =JavaScript的>
    传播的onLoad(){
        变种X = XRequest.GetInstance();
        x.SendRequest({类型:GET,
            SetHeader可以:接受:text / html的,图像/ PNG,图片/ *,* / *,
            网址:http://your_server.com/getData?param1=test
            成功:的onSuccess,失败:onFail
        });
    }

    功能的onSuccess(OBJ){
        警报(OK);
    }

    传播onFail(){
        警报(不是在这个时候!);
    }
< / SCRIPT>
 

解决方案

无论如何,你可以通过创建一个混合,而不是使用一个巨大的<$ C简化你的 sendRequest将方法$ C>开关。

  XRequest.prototype.SendRequest =功能(PARAMS){
    VAR defaultParams = {
        异步:真正的,
        类型:     ,
        网址:,
        用户名:,
        密码: ,
        身体:空,
        成功:空,
        失败:空
    };

    对于(VAR我在defaultParams){
        如果(defaultParams.hasOwnProperty(ⅰ)及与安培;的typeof PARAMS [Ⅰ] ==未定义){
            PARAMS [i] = defaultParams [I]
        }
    }

    VAR的=这一点;
    this.XHR.onreadystatechange =功能(){
        如果(that.XHR.readyState == 4){
            如果(that.XHR.status == 200 || that.XHR.status == 0){
                如果(params.success){
                    params.success(that.XHR);
                }
            } 其他 {
                如果(params.failure){
                    params.failure();
                }
            }
        }
    };

    this.XHR.open(
        params.type,parms.url,params.async,params.username,params.password
    );

    //这是没有意义的有一个用于/开关这里的时候,你只处理
    //一例
    如果(params.setHeader){
        变种H = params.setHeader.split(:);
        如果(h.length == 2){
            this.SetRequestHeader(H [0]中,h [1]);
        }
    }

    this.XHR.send(params.body);
};
 

另外要注意:您现有的的for..in 循环有两个不同的问题:

  1. 您在不使用 VAR 并导致全球被创建:的(E在args)应为的(在args变种E)
  2. 当你使用的for..in ,您应经常检查,以确保每个键是对象的直接成员,而不是继承无意中通过原型

 的(VAR我在OBJ){
    如果(obj.hasOwnProperty(i))的{
        //做的东西在这里
    }
}
 

I'm developing a simple auxiliary class to send requests using XmlHttpRequest (code below). But I cant make it work. At google chrome, for example, I get the error INVALID_STATE_ERR: DOM Exception 11 and at the other browsers I get a status == 0.

//@method XRequest: Object constructor. As this implements a singleton, the object can't be created calling the constructor, GetInstance should be called instead
function XRequest() {
    this.XHR = XRequest.CreateXHR();
}
XRequest.instance = null;

//@method static GetInstance: Creates a singleton object of type XRequest. Should be called whenever an object of that type is required.
//@return: an instance of a XRequest object
XRequest.GetInstance = function() {
    if(XRequest.instance == null) {
        XRequest.instance = new XRequest();
    }
    return XRequest.instance;
}

//@method static CreateXHR: Implments a basic factory method for creating a XMLHttpRequest object
//@return: XMLHttp object or null
XRequest.CreateXHR = function() {
    var xhr = null;
    var factory = [
        function() { return new XMLHttpRequest(); },
        function() { return new ActiveXObject("Msxml2.XMLHTTP"); },
        function() { return new ActiveXObject("Microsoft.XMLHTTP"); }
    ];

    for(var i = 0; i < factory.length; ++i) {
        var f = factory[i];
        xhr = f();
        if(xhr) return xhr;
    }
    return null;
}

XRequest.prototype.SetRequestHeader = function(name, value) {
    if(this.XHR) {
        this.XHR.setRequestHeader(name, value);
    }
}

XRequest.prototype.SendRequest = function(args) {
    var async = true;
    var type = "";
    var url = "";
    var username = "";
    var password = "";
    var body = null;
    var success = null; 
    var failure = null;

    for(e in args) {
        switch(e) {
            case "async":
                async = args[e];
                break;
            case "type":
                type = args[e];
                break;
            case "success":
                success = args[e];
                break;
            case "failure":
                failure = args[e];
                break;
            case "url":
                url = args[e];
                break;
            case "username":
                username = args[e];
                break;
            case "password":
                password = args[e];
                break;
            case "body":
                body = args[e];
            break;
            case "setHeader":
                var h = args[e].split(":");
                if(h.length == 2) {
                    this.SetRequestHeader(h[0], h[1]);
                }
                break;
        }
    }

    var that = this;
    this.XHR.onreadystatechange = function() {
        alert("readyState == " + that.XHR.readyState + "  status == " + that.XHR.status);
        if(that.XHR.readyState == 4) {
            if(that.XHR.status == 200 || that.XHR.status == 0) {
                if(success) success(that.XHR);
            } else {
                if(failure) failure();
            }
        }
    };
    this.XHR.open(type, url, async, username, password);
    this.XHR.send(body);
}

Example of usage:

<script language="javascript">
    function onLoad() {
        var x = XRequest.GetInstance();
        x.SendRequest({type:"GET",
            setHeader:"Accept:text/html, image/png, image/*, */*",
            url: "http://your_server.com/getData?param1=test",
            success:onSuccess, failure:onFail
        });
    }

    function onSuccess(obj) {
        alert("OK");                
    }

    function onFail() {
        alert("Not at this time!");
    }
</script>

解决方案

Regardless, you can simplify your SendRequest method by creating a mixin instead of using a giant switch.

XRequest.prototype.SendRequest = function(params) {
    var defaultParams = {
        async:    true,
        type:     "",
        url:      "",
        username: "",
        password: "",
        body:     null,
        success:  null,
        failure:  null
    };

    for ( var i in defaultParams ) {
        if ( defaultParams.hasOwnProperty(i) && typeof params[i] == "undefined" ) {
            params[i] = defaultParams[i];
        }
    }

    var that = this;
    this.XHR.onreadystatechange = function() {
        if ( that.XHR.readyState == 4 ) {
            if ( that.XHR.status == 200 || that.XHR.status == 0 ) {
                if ( params.success ) {
                    params.success(that.XHR);
                }
            } else {
                if ( params.failure ) {
                    params.failure();
                }
            }
        }
    };

    this.XHR.open(
        params.type, parms.url, params.async, params.username, params.password
    );

    // It doesn't make sense to have a for/switch here when you're only handling
    // one case
    if ( params.setHeader ) {
        var h = params.setHeader.split(":");
        if ( h.length == 2) {
            this.SetRequestHeader(h[0], h[1]);
        }
    }

    this.XHR.send(params.body);
};

Also be careful: your existing for..in loops have two distinct problems:

  1. You're not using var and causing a global to be created: for (e in args) should be for (var e in args)
  2. Whenever you use for..in, you should always check to make sure that each key is a direct member of the object, and not something inherited inadvertently through prototype

.

for ( var i in obj ) {
    if ( obj.hasOwnProperty(i) ) {
        // do stuff here
    }
}

这篇关于INVALID_STATE_ERR:DOM异常11的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆