INVALID_STATE_ERR:DOM异常11 [英] INVALID_STATE_ERR: DOM Exception 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
循环有两个不同的问题:
- 您在不使用
VAR
并导致全球被创建:的(E在args)
应为的(在args变种E)
- 当你使用
的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:
- You're not using
var
and causing a global to be created:for (e in args)
should befor (var e in args)
- 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屋!