Я пытаюсь получить пример кода от Mozilla, который использует веб-сервис REST для работы под 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 вызывает исключение с описанием «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, но выдает «Undefined» при запуске из Firefox. Я дважды проверил и «Включить JavaScript» включен в Firefox - кажется, работает нормально на всех других веб-страницах. Ниже приведен код 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 выбрасывает исключение. Хотя со мной все в порядке, за исключением, было бы более информативным.
Спасибо всем, кто мне помог.