代码之家  ›  专栏  ›  技术社区  ›  rossmcm

“null”为空或不是IE javascript中的对象错误

  •  2
  • rossmcm  · 技术社区  · 15 年前

    以下代码在firefox和chrome中执行良好,但出现错误:

    'null' is null or not an object
    

    在Internet Explorer中执行时。

    if (xmlhttp.responseXML != null)
        {
        var xmlDoc = xmlhttp.responseXML.documentElement ;
        var ResultNodes = xmlDoc.getElementsByTagName ("Result") ;   <---- error here
        if (ResultNodes != null)
            {
    

    (我本以为指示行之后的行更有可能返回错误,但调试器说运行时错误在指示行处)

    有什么想法吗?

    3 回复  |  直到 12 年前
        1
  •  1
  •   jeanreis    15 年前

    试着这样做(像往常一样,做不同的事)(从 http://msdn.microsoft.com/en-us/library/ms534370(VS.85).aspx )

    if (xmlhttp.responseXML.xml)
        var xmlDoc = xmlhttp.responseXML.xml;
    else
        var xmlDoc = xmlhttp.responseXML;
    
        2
  •  1
  •   rossmcm    15 年前

    我以为只要把我的发现报告回来就行了,现在一切都正常了。下面的客户端代码(略为删节和匿名)包含了我解决这个线程中概述的问题所需的所有解决方法,并且适用于IE(8.0.6001)、FF(3.5.9)和Chrome(5.0.375.55 beta)。仍然没有在旧版本的浏览器下进行测试。非常感谢所有回应者。

    我还应该补充一点,我需要确保服务器响应包括:

    Response.ContentType = "text/xml" ;
    

    对于它与IE一起工作,FF不介意ContentType是文本/HTML,但是IE会咳嗽。

    创建xmlhttp请求的代码:

    function GetXMLHTTPRequest () 
    {
    var activexmodes=["Msxml2.XMLHTTP", "Microsoft.XMLHTTP"] ; //activeX versions to check for in IE
    if (window.ActiveXObject)  //Test for support for ActiveXObject in IE first (as XMLHttpRequest in IE7 is broken)
        {
        for (var i=0; i < activexmodes.length ; i++)
            {
            try
                {
                return new ActiveXObject(activexmodes[i]) ;
                }
            catch (e)
                {    //suppress error
                }
            }
        }
     else if (window.XMLHttpRequest) // if Mozilla, Safari etc
        {
        return new XMLHttpRequest () ;
        }
     else
        {
        return (false) ;
        }
    }
    

    返回记录节点文本值的代码:

    function GetRecordElement (ARecordNode, AFieldName)
    {
    try
        {
        if (ARecordNode.getElementsByTagName (AFieldName) [0].textContent != undefined)
            {
            return (ARecordNode.getElementsByTagName (AFieldName) [0].textContent) ; // Chrome, FF
            }
    
        if (ARecordNode.getElementsByTagName (AFieldName) [0].text != undefined)
            {
            return (ARecordNode.getElementsByTagName (AFieldName) [0].text) ;  //  IE
            }
    
        return ("unknown") ;    
        }
    catch (Exception)
        {
        ReportError ("(GetRecordElement): " + Exception.description) ;
        }
    }
    

    执行Ajax请求的代码:

    function GetRecord (s)
    {
    try 
        {
        ReportStatus ("") ;
    
        var xmlhttp = GetXMLHTTPRequest () ;
        if (xmlhttp)
            {
            xmlhttp.open ("GET", "blahblah.com/AJAXget.asp?...etc", true) ;
    
            if (xmlhttp.overrideMimeType) 
                {
                xmlhttp.overrideMimeType("text/xml") ;
                }
            xmlhttp.setRequestHeader ("Content-Type", "text/xml; charset=\"utf-8\"") ; 
    
            xmlhttp.onreadystatechange = function () 
                {
                if (xmlhttp.readyState == 4) 
                    {
                    if (xmlhttp.responseXML != null)
                        {
                        var xmlDoc = xmlhttp.responseXML;                
                        var ResultNodes = xmlDoc.getElementsByTagName ("Result") ;
                        if (ResultNodes != null)
                            {
                            var PayloadNode = xmlDoc.getElementsByTagName ("Payload") ;
                            if (PayloadNode != null)
                                {
                                var ResultText = ResultNodes [0].firstChild.nodeValue ;
                                if (ResultText == "OK")
                                    {
                                    ReportStatus (ResultText) ;
                                    var RecordNode  = PayloadNode [0].firstChild ;
                                    if (RecordNode != null)
                                        {
                                        UpdateRecordDisplay (RecordNode) ; // eventually calls GetRecordElement 
                                        }
                                    else
                                        {
                                        ReportError ("RecordNode is null") ;
                                        }
                                    }
                                else
                                    {
                                    ReportError ("Unknown response:" + ResultText) ;
                                    }             
                                }    
                            else
                                {
                                ReportError ("PayloadNode is null") ;
                                }
                            }    
                        else
                            {
                            ReportError ("ResultNodes is null") ;
                            }
                        }
                    else   
                        {
                        ReportError ("responseXML is null") ;
                        }
                    }    
                else
                    {  
                    ReportStatus ("Status=" + xmlhttp.readyState) ;
                    }
                }    
    
            ReportStatus ("Requesting data ...") ;
            xmlhttp.send (null) ;
            }
        else
            {
            ReportError ("Unable to create request") ;
            }        
        }
    catch (err)
        {
        ReportError ("(GetRecord): " + err.description) ;
        }
    }
    
        3
  •  0
  •   Tomik    12 年前

    我刚刚找到了解决办法。使XML文件中的编码类型为us ascii(encoding='us-ascii')。它解决了我的问题。