1

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

  1. 为什么这不起作用?
  2. IE 8 是否支持 XMLHttpRequest?我见过的大多数示例都使用 ActiveX 分配。我应该做什么?XMLHttpRequest 似乎更加标准化。

样本:

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 语句引发异常,描述为“未定义”。这很奇怪,因为我分配了 req 对象,在 Firefox 中运行它,并在调用 open 之前检查以确保它已定义(它说它是“对象”类型)。

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

编辑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 运行时会抛出“未定义”。我仔细检查并在 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 抛出异常。虽然我可以有一个例外,但更具描述性的例外会有所帮助。

感谢所有帮助过我的人。

4

8 回答 8

4

除非“ http://www.mozilla.org/ ”是此请求的来源域,否则由于同源策略,这将不起作用

编辑: 好的,好的状态是 200,而不是 0。

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

特别是这段代码:

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);
}
于 2009-05-27T15:23:29.267 回答
2

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

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

于 2010-04-01T18:00:33.517 回答
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。

于 2009-05-27T15:47:01.077 回答
1

也不确定这里发生了什么,但只是想让大家知道 Mozilla 文档中的某个人正在观看此内容,以便在发现有必要时对文档进行调整。

于 2009-05-27T19:51:51.940 回答
1

即使我有同样的问题,这是一个愚蠢的错误,我们不关注代码在 IE 中运行良好,但在 Chrome 和 Firefox 中出现问题

最初我们使用Type="submit"而不是type="button"虽然我们没有任何功能问题,例如更新表格,但是HTTP: error 0当我发出警报时我们进入了警报框req.responseText 使用下面的代码解决了我的问题

input type="button" name="btnEdit5" id="btnEdit5" value="Confirm" onClick="show_confirm()" 
于 2010-06-09T19:04:26.587 回答
0

除了客户端的所有明显错误外,主要原因是壁虎引擎在 servlet 的标头中查找 Access-Control-Allow-Origin。如果它没有找到它,它将中止通信并且你得到一个status=0 和statusText=null。此外,xml 解析错误中的 moz-nullprincipal。所有这些东西都非常具有误导性。解决此问题所需要做的就是:

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

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

于 2011-01-19T14:44:11.073 回答
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
于 2011-10-11T22:17:20.810 回答
0

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

于 2011-10-23T23:57:14.317 回答