views:

319

answers:

4

I am having Ajax issues with IE (6, 7 & 8).

I am using the Simple AJAX Code-Kit (SACK) v1.6.1 which works fine in FF, GC, Opera and Safiri.

In IE it throws the error:

System error: -1072896658.
Breaking on JS error on line 157 (self.response = self.xmlhttp.responseText;).

/* Simple AJAX Code-Kit (SACK) v1.6.1 */
/* 2005 Gregory Wild-Smith */
/* www.twilightuniverse.com */
/* Software licenced under a modified X11 licence,
 see documentation or authors website for more details */

function sack(file) {
        this.xmlhttp = null;

        this.resetData = function() {
                this.method = "POST";
                this.queryStringSeparator = "?";
                this.argumentSeparator = "&";
                this.URLString = "";
                this.encodeURIString = true;
                this.execute = false;
                this.element = null;
                this.elementObj = null;
                this.requestFile = file;
                this.vars = new Object();
                this.responseStatus = new Array(2);
        };

        this.resetFunctions = function() {
                this.onloading = function() { };
                this.onloaded = function() { };
                this.onInteractive = function() { };
                this.onCompletion = function() { };
                this.onerror = function() { };
                this.onFail = function() { };
        };

        this.reset = function() {
                this.resetFunctions();
                this.resetData();
        };

        this.createAJAX = function() {
                try {
                        this.xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
                } catch (e1) {
                        try {
                                this.xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
                        } catch (e2) {
                                this.xmlhttp = null;
                        }
                }

                if (! this.xmlhttp) {
                        if (typeof XMLHttpRequest != "undefined") {
                                this.xmlhttp = new XMLHttpRequest();
                        } else {
                                this.failed = true;
                        }
                }
        };

        this.setVar = function(name, value){
                this.vars[name] = Array(value, false);
        };

        this.encVar = function(name, value, returnvars) {
                if (true == returnvars) {
                        return Array(encodeURIComponent(name), encodeURIComponent(value));
                } else {
                        this.vars[encodeURIComponent(name)] = Array(encodeURIComponent(value), true);
                }
        }

        this.processURLString = function(string, encode) {
                encoded = encodeURIComponent(this.argumentSeparator);
                regexp = new RegExp(this.argumentSeparator + "|" + encoded);
                varArray = string.split(regexp);
                for (i = 0; i < varArray.length; i++){
                        urlVars = varArray[i].split("=");
                        if (true == encode){
                                this.encVar(urlVars[0], urlVars[1]);
                        } else {
                                this.setVar(urlVars[0], urlVars[1]);
                        }
                }
        }

        this.createURLString = function(urlstring) {
                if (this.encodeURIString && this.URLString.length) {
                        this.processURLString(this.URLString, true);
                }

                if (urlstring) {
                        if (this.URLString.length) {
                                this.URLString += this.argumentSeparator + urlstring;
                        } else {
                                this.URLString = urlstring;
                        }
                }

                // prevents caching of URLString
                this.setVar("rndval", new Date().getTime());

                urlstringtemp = new Array();
                for (key in this.vars) {
                        if (false == this.vars[key][1] && true == this.encodeURIString) {
                                encoded = this.encVar(key, this.vars[key][0], true);
                                delete this.vars[key];
                                this.vars[encoded[0]] = Array(encoded[1], true);
                                key = encoded[0];
                        }

                        urlstringtemp[urlstringtemp.length] = key + "=" + this.vars[key][0];
                }
                if (urlstring){
                        this.URLString += this.argumentSeparator + urlstringtemp.join(this.argumentSeparator);
                } else {
                        this.URLString += urlstringtemp.join(this.argumentSeparator);
                }
        }

        this.runResponse = function() {
                eval(this.response);
        }

        this.runAJAX = function(urlstring) {
                if (this.failed) {
                        this.onFail();
                } else {
                        this.createURLString(urlstring);
                        if (this.element) {
                                this.elementObj = document.getElementById(this.element);
                        }
                        if (this.xmlhttp) {
                                var self = this;
                                if (this.method == "GET") {
                                        totalurlstring = this.requestFile + this.queryStringSeparator + this.URLString;
                                        this.xmlhttp.open(this.method, totalurlstring, true);
                                } else {
                                        this.xmlhttp.open(this.method, this.requestFile, true);
                                        try {
                                                this.xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=ISO-8859-1;")
                                                this.xmlhttp.setRequestHeader('User-agent' , 'Mozilla/4.0 (compatible) Naruki');

                                        } catch (e) { }
                                }

                                this.xmlhttp.onreadystatechange = function() {
                                        switch (self.xmlhttp.readyState) {
                                                case 1:
                                                        self.onloading();
                                                        break;
                                                case 2:
                                                        self.onloaded();
                                                        break;
                                                case 3:
                                                        self.onInteractive();
                                                        break;
                                                case 4:
                                                        if(self.xmlhttp.status==200){
                                                        **self.response = self.xmlhttp.responseText;**
                                                        //console.log(self.xmlhttp.responseText);

                                                        self.responseXML = self.xmlhttp.responseXML;
                                                        self.responseStatus[0] = self.xmlhttp.status;
                                                        self.responseStatus[1] = self.xmlhttp.statusText;
                                                        }
                                                        else{alert("Problem retrieving XML data")}


                                                        if (self.execute) {
                                                                self.runResponse();
                                                        }

                                                        if (self.elementObj) {
                                                                elemNodeName = self.elementObj.nodeName;
                                                                elemNodeName.toLowerCase();
                                                                if (elemNodeName == "input"
                                                                || elemNodeName == "select"
                                                                || elemNodeName == "option"
                                                                || elemNodeName == "textarea") {
                                                                        self.elementObj.value = self.response;
                                                                } else {
                                                                        self.elementObj.innerHTML = self.response;
                                                                }
                                                        }
                                                        if (self.responseStatus[0] == "200") {
                                                                self.onCompletion();
                                                        } else {
                                                                self.onerror();
                                                        }

                                                        self.URLString = "";
                                                        /* These lines were added by Alf Magne Kalleland ref. info on the sack home page. It prevents memory leakage in IE */
                                                        delete self.xmlhttp['onreadystatechange'];
                                                        self.xmlhttp=null;
                                                        self.responseStatus=null;
                                                        self.response=null;
                                                        self.responseXML=null;

                                                        break;
                                        }
                                };

                                this.xmlhttp.send(this.URLString);
                        }
                }
        };

        this.reset();
        this.createAJAX();
}
A: 

The error message means that the encoding of the response is not supported.

Check the encoding of the page that you are getting. Most browsers are a bit relaxed about the syntax and accepts an encoding like UTF8, while IE demands the correct form UTF-8.

Guffa
+1  A: 

This IE error is probably related to the content-type header of the response sent from the server, where the charset may be invalid, or not what IE is expecting. A typical cause would be setting the charset to UTF8 instead of UTF-8.

Related article:

Daniel Vassallo
A: 

Thank you all, iut was the charactor set, we had it set to utf8 instead utf-8.

Kyle Hudson
@Kyle: That's good news that you managed to solve this problem. You may want to mark the most helpful answer as 'accepted'. This will help you in the future, should you ask further questions on Stack Overflow.
Daniel Vassallo
A: 

Thank you so much for the hint, this solved our problem. Actually we were struggling to find alternatives for IE, even we were thinking of avoiding AJAX and do a page Submit. Any ways the utf-8 (the correct syntax) worked well.

Thanks once again.

getjins