2009-05-27 1 views
1

Я пытаюсь получить образец кода из Mozilla, который использует веб-службу REST для работы в Firefox 3.0.10. Следующий код НЕ работает в Firefox, но работает в IE 8!Почему этот образец XMLHttpRequest из Mozilla не работает в Firefox 3?

  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); 

открытое заявление бросает исключение с описанием 'неопределенным'. Это странно, поскольку я выделяю объект req, запускаю его в Firefox и проверял, чтобы убедиться, что он определен до вызова open (который говорит, что он имеет тип «объект»).

Я также пробовал асинхронную версию этого без везения.

EDIT 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); 
} 

EDIT 3: Хорошо, я переделывал это в JQuery. jQuery отлично работает в IE, но при запуске из Firefox он выбрасывает «Undefined». Я дважды проверил и включил «Включить 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 выдает исключение. Хотя я в порядке с исключением, более описательным было бы полезно.

Спасибо всем, кто мне помог.

+0

Я использовал ваш новый «слегка модифицированный» код на моем сервере. он работает в firefox 3. проверьте это: http://dogself.com/telluriumTest/test.htm Я только добавил лучше регистрировать и удалять этот ужасный document.write crap. – mkoryak

ответ

4

если «http://www.mozilla.org/» не является областью, из которой этот запрос происходит, это не будет работать из-за того же происхождения политики

редактировать: Ok, хорошее состояние 200, а не 0.

см http://dogself.com/telluriumTest/ и нажмите «Тест стека». его использование вашего кода и работа.

конкретно этот код:

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); 
} 
+0

Хорошо, я понимаю, о чем вы говорите. Я пробовал ударить локальный файл и локальную веб-службу, и он тоже не работает. Он работает в IE8 локально, но не работает в Firefox. –

+0

проверить мои последние изменения. ваш код работает на меня – mkoryak

+0

в любом случае, почему вы не спасете себя несколько часов боли в голове и не используете jquery? – mkoryak

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.

Сторона примечания: у вас есть firebug? это отличный ресурс для устранения неполадок javascript.

EDIT: Попробуйте этот код вместо:

<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.

+0

Я пробовал этот точный код. Работает как чемпион в IE, но не в Firefox. Я собираюсь использовать Firebug очень быстро и посмотреть, что происходит ... –

+0

Посмотри мой последний код выше ... –

+0

Это ОЧЕНЬ странно. Ваш обновленный код отлично работает в IE 8, но я получаю сообщение «ERROR: undefined» в Firefox. Я попробовал свое оригинальное решение, но изменил его, чтобы вместо него использовать jQuery ($ .get). JQuery работает в IE, но выдает неопределенную ошибку в Firefox ... это жуткий. –

1

не уверен, что здесь происходит, но просто хотел, чтобы вы все знали, что кто-то из документации Mozilla наблюдает за этим, чтобы быть готовым подправить документы, если это окажется необходимым, как только это будет выяснено.

+0

Удивительный! Что-нибудь, чтобы помочь распространить лису. Можете ли вы воспроизвести проблему? –

+0

Он отлично работает в ночной сборке Firefox 3.5. Я здесь. – 2009-05-27 20:12:15

+0

Он также отлично работает для меня в Firefox 3.0.3 (последняя версия 3.0.x у меня под рукой без обновления). – 2009-05-27 20:14:37

2

Не используйте onreadystatechange при отправке синхронного запроса ('false'), поместите обработчик сразу после функции send(). Кажется, что FF не выполняет функцию onreadystatechange, если запрос является синхронным.

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

1

Даже у меня была такая же проблема, и это было нелепая ошибка, которую мы не сосредотачиваемся на код работал отлично в IE, но были проблемы в Chrome и Firefox

Initilly мы использовали Type="submit" вместо type="button", хотя у нас не было никаких проблем с функциональностью, таких как обновление таблиц, но мы получали HTTP: error 0 в поле предупреждения, когда я предупреждал req.responseText Используя приведенный ниже код, моя проблема

input type="button" name="btnEdit5" id="btnEdit5" value="Confirm" onClick="show_confirm()" 
0

Помимо всех очевидных ошибок на стороне клиента, основная причина этого заключается в том, что gecko engine ищет Access-Control-Allow-Origin в заголовке из сервлета. Если он не найдет его, он прервет связь, и вы получите статус = 0 и statusText = null. Кроме того, moz-nullprincipal в xml синтаксическом анализе. Все эти вещи очень вводят в заблуждение. Все, что вам нужно решить эту проблему:

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

В коде сервлета и жизни будет хорошо :-)

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 
0

Я столкнулся с той же проблемой. Причина, по которой работает IE, и никаких других браузеров, заключается в том, что IE позволяет открыть файл с таким URL, как «C: \ xampp \ htdocs \ project3 \ project3.html». Другие браузеры изменят это на URL-адрес, например «file: /// C: /xampp/htdocs/project3/project3.html». Поскольку домен PHP-файла должен быть таким же, как домен javascript-файла, IE работает, но другие браузеры этого не делают. Убедитесь, что вы используете URL-адрес, например «http: //localhost/project3/project3.html». Обратите внимание на использование localhost. Также убедитесь, что в вашем javascript-вызове вы вызываете PHP-файл через localhost.

Смежные вопросы