我正在尝试从Mozilla获取示例代码,该代码使用REST Web服务在Firefox 3.0.10下工作。以下代码在Firefox中不起作用,但在IE 8中起作用!
样品:
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抛出异常。虽然我对一个例外情况很好,但更具描述性的却会有所帮助。
感谢所有帮助过我的人。
答案 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文件。