Почему этот пример XMLHttpRequest от Mozilla не работает в Firefox 3? - PullRequest
1 голос
/ 27 мая 2009

Я пытаюсь получить пример кода от Mozilla, который использует веб-сервис REST для работы под 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 вызывает исключение с описанием «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 выбрасывает исключение. Хотя со мной все в порядке, за исключением, было бы более информативным.

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

Ответы [ 8 ]

4 голосов
/ 27 мая 2009

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

редактирование: Хорошо, хороший статус - 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);
}
2 голосов
/ 01 апреля 2010

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

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

1 голос
/ 09 июня 2010

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

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

input type="button" name="btnEdit5" id="btnEdit5" value="Confirm" onClick="show_confirm()" 
1 голос
/ 27 мая 2009

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

1 голос
/ 27 мая 2009

Я настоятельно рекомендую асинхронный способ сделать это, одна функция запускает запрос, а другая функция обрабатывает ответ.

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.

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 голосов
/ 24 октября 2011

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

0 голосов
/ 12 октября 2011

Заменить строку

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 голосов
/ 19 января 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...