2

次のコードは、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)
        {

(示された行の後の行がエラーを返す可能性が高いと思っていましたが、デバッガーは実行時エラーが示された行にあると言います)

理由はありますか?

4

3 に答える 3

1

すべてが機能するようになったので、調査結果を報告するだけだと思っていました。次のクライアント側コード (少し簡略化され、匿名化されています) には、このスレッドで概説されている問題に対処するために必要なすべての回避策が含まれており、IE (8.0.6001)、FF(3.5.9)、および Chrome (5.0. 375.55 ベータ版)。古いバージョンのブラウザではまだテストしていません。回答してくれたすべての人に感謝します。

また、サーバーの応答に以下を含める必要があることを確認する必要があることも付け加えておきます。

Response.ContentType = "text/xml" ;

IEで動作するようにします。FF は ContentType が text/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) ;
    }
}
于 2010-05-27T19:39:27.377 に答える
1

このようなことを試してください(いつものように、IEは異なる方法で動作します)( 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;
于 2010-05-24T23:54:58.387 に答える
0

これに対する解決策を見つけました。xml ファイルのエンコーディング タイプを us-ascii (encoding='us-ascii') にします。それは私の問題を解決しました。

于 2012-06-27T00:56:40.643 に答える