为什么来自Mozilla的XMLHttpRequest示例在Firefox 3中不起作用?

时间:2009-05-27 15:18:55

标签: javascript ajax firefox rest xmlhttprequest

我正在尝试从Mozilla获取示例代码,该代码使用REST Web服务在Firefox 3.0.10下工作。以下代码在Firefox中不起作用,但在IE 8中起作用!

  1. 为什么这不起作用?
  2. IE 8是否支持XMLHttpRequest?我见过的大多数例子都使用ActiveX 分配。我该怎么办? XMLHttpRequest似乎更标准化了。
  3. 样品:

    var req = new XMLHttpRequest();
    req.open('GET', 'http://localhost/myRESTfulService/resource', false);    // throws 'undefined' exception
    req.send(null);
    if(req.status == 0)
      dump(req.responseText);
    

    open语句抛出一个带有'undefined'描述的异常。这很奇怪,因为我分配了req对象,我在Firefox中运行它,并检查以确保在调用open之前定义它(它说它是'object'类型)。

    我也试过这个的异步版本没有运气。

    编辑2:以下是我最近的代码:

    function createRequestObject() {
        if( window.XMLHttpRequest ) {
            return new XMLHttpRequest();
        }
        else if( window.ActiveXObject ) {
            return new ActiveXObject( "Microsoft.XMLHTTP" );
        }
    
        return null;
    }
    
    function handleResponse( req ) {
        document.writeln( "Handling response..." );   // NEVER GETS CALLED
        if( req.readyState == 0 ) {
            document.writeln( "UNITIALIZED" );
        }
        else if( req.readyState == 1 ) {
            document.writeln( "LOADING" );
        }
        else if( req.readyState == 2 ) {
            document.writeln( "LOADED" );
        }
        else if( req.readyState == 3 ) {
            document.writeln( "INTERACTIVE" ); 
        }
        else if( req.readyState == 4 ) {
            document.writeln( "COMPLETE" );
            if( req.status == 200 ) {
                document.writeln( "SUCCESS" );
            }
        }
    }
    
    document.writeln( "" );
    var req = createRequestObject();
    
    try {
        document.writeln( "Opening service..." );
        req.onreadystatechange = function() { handleResponse( req ); };
        req.open('POST', 'http://localhost/test/test2.txt', true);  // WORKS IN IE8 & NOT FIREFOX
    
    
        document.writeln( "Sending service request..." );
        req.send('');
    
        document.writeln( "Done" );
    }
    catch( err ) {
        document.writeln( "ERROR: " + err.description );
    }
    

    编辑3: 好吧,我在jQuery中重写了这个。 jQuery在IE中运行得很好,但是从Firefox运行时会抛出“Undefined”。我仔细检查并在Firefox中启用了“启用JavaScript” - 似乎在所有其他网页中都能正常工作。下面是jQuery代码:

    function handleResponse( resp ) {
        alert( "Name: " + resp.Name );
        alert( "URL: " + resp.URL );
    }
    
    $(document).ready( function() {
        $("a").click( function(event) {
    
            try {
                $.get( "http://localhost/services/ezekielservices/configservice/ezekielservices.svc/test", 
                       "{}",
                       function(data) { handleResponse( data ); },
                       "json" );
            } 
            catch( err ) {
                alert("'$.get' threw an exception: " + err.description);
            }
    
            event.preventDefault();
        });
    } );    // End 'ready' check
    

    解决方案摘要:

    好的,网络课程101.我的问题确实是跨域的。我正在查看未发布的网站(仅在文件系统上),该网站正在发布已发布的服务。当我在相同的域名下发布我的网站时。

    这也带来了IE和Firefox之间的重要区别。当IE遇到这种情况时,它会提示用户是否接受跨域调用。 Firefox抛出异常。虽然我对一个例外情况很好,但更具描述性的却会有所帮助。

    感谢所有帮助过我的人。

8 个答案:

答案 0 :(得分:4)

除非“http://www.mozilla.org/”是此请求所源自的域,否则由于相同的原始政策而无效

修改 好的,良好的状态是200,而不是0。

请参阅http://dogself.com/telluriumTest/并单击“stackoverflow test”。它使用你的代码和工作。

特别是这段代码:

function test(){
    var req = new XMLHttpRequest();
    req.open('GET', 'index2.htm', false);    
    req.send(null);
    if(req.status == 200)
    alert("got some stuff back:"+req.responseText);
}

答案 1 :(得分:2)

发送同步请求时不使用onreadystatechange('false'),将处理程序放在send()函数之后。如果请求是同步的,似乎FF不执行onreadystatechange函数。

http://support.mozilla.com/tiki-view_forum_thread.php?locale=ca&comments_parentId=124952&forumId=1

答案 2 :(得分:1)

我强烈建议以异步方式执行此操作,一个函数启动请求,另一个函数处理响应。

function makeRequest() 
{
   var httpRequest;
   if (window.XMLHttpRequest) // firefox etc 
   {
       httpRequest = new XMLHttpRequest();
   } else if (window.ActiveXObject) { // ie
       httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
   }
   httpRequest.onreadystatechange = function(){handleResponse(httpRequest)};
   httpRequest.open('POST','http://localhost/test/test2.txt',true);
   httpRequest.send('');
}


function handleResponse(request)
{
    if(request.readyState == 4) {
        if(request.status == 200) {
        // handling code here
            // request.responseText is the string returned
        }
    }
}

这是我工作时使用的ajax调用的基本格式,对于Firefox,IE和Safari,这应该是相同的。

旁注:你有萤火虫吗?它是解决javascript问题的绝佳资源。

编辑: 请尝试使用此代码:

<html>
<head>
<script>
function out(outStr) // cheap and dirty output function
{
    document.getElementById("out").innerHTML += "<br>" + outStr;
}

function handleResponse(req) {
    if( req.readyState == 0 ) {
        out("UNITIALIZED");
    }
    else if( req.readyState == 1 ) {
        out("LOADING");
    }
    else if( req.readyState == 2 ) {
        out("LOADED");
    }
    else if( req.readyState == 3 ) {
        out("INTERACTIVE"); 
    }
    else if( req.readyState == 4 ) {
        out("COMPLETE");
        if( req.status == 200 ) {
            out(req.responseText);
        }
    }
}

function createRequestObject() {
    var req = null  
    if(window.XMLHttpRequest) {
        req = new XMLHttpRequest();
    } else if(window.ActiveXObject) {
        req = new ActiveXObject("Microsoft.XMLHTTP");
    }
    return req;
}

function makeRequest()
{
    var req = createRequestObject();

    try {
        out("Opening service...");
        req.onreadystatechange = function() { handleResponse( req ); };
        req.open('POST', 'http://localhost/test/test2.txt', true);  // WORKS IN IE8 & NOT FIREFOX


        out("Sending service request...");
        req.send('');

        out("Done");
    }
    catch( err ) {
        out("ERROR: " + err.description);
    }
}
</script>
</head>
<body>
<div onclick="makeRequest();">test<br></div>
<div id="out">Output Here</div>
</body>
</html>

指向:http://localhost/test/test2.txt到您服务器上的现有文件。

不确定您的代码到底出了什么问题,但它直接写入文档,似乎正在填写已经写入的所有代码。在这个版本中,我正在写一个div。

答案 3 :(得分:1)

也不确定这里发生了什么,但只是想让大家知道Mozilla文档中的某个人正在观察这个文件是否已经准备好调整文档,如果事实证明这是必要的。

答案 4 :(得分:1)

即使我有同样的问题,也是我们不关注的愚蠢的错误 代码在IE中工作正常但在Chrome和Firefox中存在问题

我们使用Type="submit"代替type="button",虽然我们没有任何功能问题,例如更新表格,但是当我收到警报时,我们在警告框中收到了HTTP: error 0 {{1} }} 使用以下代码解决了我的问题

req.responseText

答案 5 :(得分:0)

除了客户端上的所有明显错误之外,主要原因是gecko引擎在servlet的头中查找Access-Control-Allow-Origin。如果找不到它,它将中止通信,你得到一个status = 0和statusText = null。此外,xml解析错误中的moz-nullprincipal。所有这些都是非常误导的。解决此问题的所有方法是:

response.setHeader("Access-Control-Allow-Origin","*");

在servlet代码中,生活会很好: - )

答案 6 :(得分:0)

替换

req.open('POST', 'http://localhost/test/test2.txt', true); // WORKS IN IE8 & NOT FIREFOX

req.open('GET', 'http://localhost/test/test2.txt', true); // WORKS IN IE8 & NOT FIREFOX

答案 7 :(得分:0)

我遇到了同样的问题。 IE工作原因并没有其他浏览器是因为IE允许你用“C:\ xampp \ htdocs \ project3 \ project3.html”之类的URL打开文件。其他浏览器会将此更改为“file:///”这样的URL C:/xampp/htdocs/project3/project3.html”。由于PHP文件的域必须与IE工作的javascript文件的域相同,但其他浏览器不能。确保使用“http://localhost/project3/project3.html”之类的URL。请注意使用localhost。还要确保在javascript调用中通过localhost调用PHP文件。