我正在尝试从 Mozilla 获取使用 REST Web 服务以在 Firefox 3.0.10 下工作的示例代码。以下代码在 Firefox 中不起作用,但在 IE 8 中起作用!
- 为什么这不起作用?
- 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 抛出异常。虽然我可以有一个例外,但更具描述性的例外会有所帮助。
感谢所有帮助过我的人。