SCRIPT65535:IE9中的调用对象无效

时间:2013-05-21 11:31:13

标签: javascript ajax

我是javascript的新手。我在其他人编写的代码中遇到了一个问题。他们创建了一个security.js文件,他们试图覆盖xmlHTTPRequest(我不确定)。在这里附上代码。

(function () {
    function getXHRObj(baseObj){
        var Impl = function(){          
            this.onreadystatechange = null;
            return this;
        };
        //Impl.prototype.onreadystatechange = null;
            // set the prototype of the new constructor
        Impl.prototype = baseObj;


        //Impl.prototype.constructor = Impl; // does not work in IE

            // the object to be returned
        var retObj = new Impl();

        function isHTTPReq(url){
            if(url){
                var colIndx = url.indexOf('://');
                if((colIndx < 0) 
                    || (url.substr(0, colIndx).toLowerCase().indexOf('http') == 0))
                    return true;
            }
            return false;
        }

            // customize open to add token in URL
            // even POST request should do this since POST may not always have key=value&... data format
        retObj.open = function(method, URL, async, user, pwd){

            if(isHTTPReq(URL)){         
                var prefix = (URL.indexOf('?') < 0)? '?' : '&';
                URL += (prefix + window.csrfToken);
            }
            //alert('making ajax to - ' + URL);
            Impl.prototype.open(method, URL, async, user, pwd);
        };

            // customize send
        retObj.send = function(body){

                /* Register the handler just before "send" to allow reuse of same object */
            Impl.prototype.onreadystatechange = function(){
                //alert('Impl.prototype.readyState- '+ Impl.prototype.readyState);

                    // copy the properties to return object
                if(Impl.prototype.readyState)
                    retObj.readyState = Impl.prototype.readyState;


                if(Impl.prototype.readyState == 4){
                    if(Impl.prototype.status)
                        retObj.status = Impl.prototype.status;

                    if(Impl.prototype.statusText)
                        retObj.statusText = Impl.prototype.statusText;

                    if(Impl.prototype.responseText)
                        retObj.responseText = Impl.prototype.responseText;

                    if(Impl.prototype.responseXML)
                        retObj.responseXML = Impl.prototype.responseXML;
                    //alert('xml done');
                }
                    // publish event to return object handler
                if(retObj.onreadystatechange){
                    //alert('invoking handler - \n' + retObj.onreadystatechange);
                    retObj.onreadystatechange();
                }else{
                    //alert('no handler');
                }
            };


            Impl.prototype.send(body);          
        };

            // delegate other methods
            /* Redefinition is necessary because IE does not allow inheritance 
               from native objects */
        retObj.abort = function() {
            Impl.prototype.abort();
        };

        retObj.setRequestHeader = function(hdr, val){
            Impl.prototype.setRequestHeader(hdr, val);
        };

        retObj.getResponseHeader = function(hdr){
            return Impl.prototype.getResponseHeader(hdr);
        };

        retObj.getAllResponseHeaders = function(){
            return Impl.prototype.getAllResponseHeaders();
        };

        return retObj;
    }

        // redefine the XMLttpRequest to use custom definition
    if(window.XMLHttpRequest){
        var Base_XMLHttpRequest = window.XMLHttpRequest;
        window.XMLHttpRequest = function(){
            //alert('in new XHR');
            return getXHRObj(new Base_XMLHttpRequest());
        };
    }

        // redefine the ActiveXObject to use custom definition
    if(window.ActiveXObject) {
        var Base_ActiveXObject = window.ActiveXObject;
        window.ActiveXObject = function(objType){
            //alert('in new ActiveXObj for - ' + objType);      
            if((objType.toLowerCase() != "microsoft.xmlhttp") 
                &&(objType.toLowerCase().indexOf("msxml2.xmlhttp") < 0)){
                    // return the standard impl for non-ajax objects
                return new Base_ActiveXObject(objType);
            }else{`enter code here`
                //alert('returning new impl for ' +  objType);
                return getXHRObj(new Base_ActiveXObject(objType));
            }
        };
    }
})();

(function () { function getXHRObj(baseObj){ var Impl = function(){ this.onreadystatechange = null; return this; }; //Impl.prototype.onreadystatechange = null; // set the prototype of the new constructor Impl.prototype = baseObj; //Impl.prototype.constructor = Impl; // does not work in IE // the object to be returned var retObj = new Impl(); function isHTTPReq(url){ if(url){ var colIndx = url.indexOf('://'); if((colIndx < 0) || (url.substr(0, colIndx).toLowerCase().indexOf('http') == 0)) return true; } return false; } // customize open to add token in URL // even POST request should do this since POST may not always have key=value&... data format retObj.open = function(method, URL, async, user, pwd){ if(isHTTPReq(URL)){ var prefix = (URL.indexOf('?') < 0)? '?' : '&'; URL += (prefix + window.csrfToken); } //alert('making ajax to - ' + URL); Impl.prototype.open(method, URL, async, user, pwd); }; // customize send retObj.send = function(body){ /* Register the handler just before "send" to allow reuse of same object */ Impl.prototype.onreadystatechange = function(){ //alert('Impl.prototype.readyState- '+ Impl.prototype.readyState); // copy the properties to return object if(Impl.prototype.readyState) retObj.readyState = Impl.prototype.readyState; if(Impl.prototype.readyState == 4){ if(Impl.prototype.status) retObj.status = Impl.prototype.status; if(Impl.prototype.statusText) retObj.statusText = Impl.prototype.statusText; if(Impl.prototype.responseText) retObj.responseText = Impl.prototype.responseText; if(Impl.prototype.responseXML) retObj.responseXML = Impl.prototype.responseXML; //alert('xml done'); } // publish event to return object handler if(retObj.onreadystatechange){ //alert('invoking handler - \n' + retObj.onreadystatechange); retObj.onreadystatechange(); }else{ //alert('no handler'); } }; Impl.prototype.send(body); }; // delegate other methods /* Redefinition is necessary because IE does not allow inheritance from native objects */ retObj.abort = function() { Impl.prototype.abort(); }; retObj.setRequestHeader = function(hdr, val){ Impl.prototype.setRequestHeader(hdr, val); }; retObj.getResponseHeader = function(hdr){ return Impl.prototype.getResponseHeader(hdr); }; retObj.getAllResponseHeaders = function(){ return Impl.prototype.getAllResponseHeaders(); }; return retObj; } // redefine the XMLttpRequest to use custom definition if(window.XMLHttpRequest){ var Base_XMLHttpRequest = window.XMLHttpRequest; window.XMLHttpRequest = function(){ //alert('in new XHR'); return getXHRObj(new Base_XMLHttpRequest()); }; } // redefine the ActiveXObject to use custom definition if(window.ActiveXObject) { var Base_ActiveXObject = window.ActiveXObject; window.ActiveXObject = function(objType){ //alert('in new ActiveXObj for - ' + objType); if((objType.toLowerCase() != "microsoft.xmlhttp") &&(objType.toLowerCase().indexOf("msxml2.xmlhttp") < 0)){ // return the standard impl for non-ajax objects return new Base_ActiveXObject(objType); }else{`enter code here` //alert('returning new impl for ' + objType); return getXHRObj(new Base_ActiveXObject(objType)); } }; } })();

这段代码在IE7&amp; 8,但这在所有其他浏览器中给出了错误。 IE9错误 -

  

SCRIPT65535:无效的调用对象   security.js,第71行第4期

错误指向this.onreadystatechange = null;

立即获得帮助。 谢谢!

0 个答案:

没有答案