2009-05-27 2 views
1

Mozilla에서 Firefox 3.0.10에서 작동하도록 REST 웹 서비스를 사용하는 샘플 코드를 얻으려고합니다. 다음 코드는 Firefox에서는 작동하지 않지만 Internet Explorer 8에서는 작동하지 않습니다!Mozilla의이 XMLHttpRequest 샘플이 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 (이 객체가 '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에서 잘 작동하지만 파이어 폭스에서 실행될 때 '정의되지 않음'을 던집니다. 나는 이중 체크를했고 파이어 폭스에서 '자바 스크립트 사용'이 켜져있다 - 다른 모든 웹 페이지에서 잘 작동하는 것 같다. 솔루션의

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) 내 문제는 도메인 간 참이었다 다음은 jQuery 코드입니다. 게시 된 서비스에 타격을 가한 게시되지 않은 사이트 (파일 시스템)를보고있었습니다. 동일한 도메인으로 사이트를 게시했을 때 사이트가 작동했습니다.

또한 IE와 Firefox간에 중요한 차이가 있습니다. Internet Explorer는이 시나리오를 경험할 때 사용자가 도메인 간 호출을 수락하는지 여부를 묻는 메시지를 표시합니다. Firefox에서 예외가 발생합니다. 예외는 있지만 괜찮 으면 좋겠지 만 좀 더 자세한 설명이 도움이 될 것입니다.

나를 도와 주신 모든 분들께 감사드립니다.

+0

나는 내 서버에서 새 "약간 수정 된"코드를 사용했습니다. 그것은 파이어 폭스에서 작동합니다 3. 체크 아웃 : http://dogself.com/telluriumTest/test.htm 나는 더 나은 기록을 추가하고 그 끔찍한 document.write 쓰레기를 제거합니다. – mkoryak

답변

4

은 'http://www.mozilla.org/'를 제외하고는이 요청이 때문에 동일 출처 정책의이 실 거예요 작업을 시작되는 도메인입니다

편집 : 좋아, 좋은 상태는 0

보지, 200 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); 
} 
+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 
     } 
    } 
} 

이 내가 일하는 곳 우리가 사용하는 아약스 통화의 기본 형식입니다,이 파이어 폭스, IE, 사파리에 대해 동일한 작동합니다.

사이드 노트 : 파이어 버그가 있습니까? 자바 스크립트 문제 해결을위한 훌륭한 리소스입니다.

편집 : 대신에이 코드를 시도 :

<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

나는이 정확한 코드를 시도했다. Internet Explorer에서는 챔피언처럼 작동하지만 Firefox에서는 작동하지 않습니다. Firebug를 사용하여 실제 진행 상황을 확인합니다. –

+0

위의 최신 코드를 참조하십시오 ... –

+0

이것은 매우 기이합니다. 업데이트 된 코드는 IE 8에서 훌륭하게 작동하지만 Firefox에서는 "undefined"오류가 발생합니다. 내 원래의 솔루션을 시도했지만 jQuery ($ .get) 대신 사용하도록 변경했습니다. jQuery는 IE에서 작동하지만 파이어 폭스에서 정의되지 않은 오류가 발생합니다 ... 이것은 기괴합니다. –

1

여기에 무슨 일이 일어나고 있는지 확실하지 않지만 일단 모질라 문서의 누군가가 이것을 알아 내면 필요한 것으로 판명되면이 문서를 조정할 준비가되어 있음을 알기를 바랍니다.

+0

굉장! 여우를 퍼뜨리는 데 도움이되는 모든 것. 문제를 재현 할 수 있습니까? –

+0

Firefox 3.5의 야간 빌드에서 제대로 작동합니다. 여기서 실행됩니다. –

+0

파이어 폭스 3.0.3 (업 그레 이드 작업을하지 않고도 가지고있는 3.0.x의 마지막 버전)에서도 나에게 잘 돌아갔다. –

1

심지어 나는 같은 문제가 없었다 그리고 우리가 코드가 IE에서 잘 작동했다 에 집중하지 않는 바보 같은 실수를했지만

가 Initilly 우리가 대신 Type="submit"을 사용하는 크롬과 파이어 폭스에 문제가 있었다 type="button" 우리는 테이블을 업데이트하는 등의 모든 기능이 문제가 아니라 않았지만 나는 내 문제 아래의 코드가 해결 사용 req.responseText 을 경고 할 때 우리는 경고 상자에 HTTP: error 0을 얻고 있었다

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

클라이언트 측의 명백한 오류 이외에 gecko 엔진은 서블릿의 헤더에서 Access-Control-Allow-Origin을 찾습니다. 찾지 못하면 통신이 중단되고 status = 0 및 statusText = null이됩니다. 또한, xml 구문 분석 오류에서 moz-nullprincipal. 이 모든 것들은 오도 된 것입니다. 이 문제를 해결 할 필요가있다 : 서블릿 코드와 삶에

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

함께 라인

req.open('POST', 'http://localhost/test/test2.txt', true); // WORKS IN IE8 & NOT FIREFOX 

를 교체 좋은 :-)

0

될 것

req.open('GET', 'http://localhost/test/test2.txt', true); // WORKS IN IE8 & NOT FIREFOX 
0

나는 똑같은 문제에 부딪쳤다. IE가 작동하고 다른 브라우저가없는 이유는 IE에서 "C : \ xampp \ htdocs \ project3 \ project3.html"과 같은 URL로 파일을 열 수 있기 때문입니다. 다른 브라우저는이를 "file : /// C : /xampp/htdocs/project3/project3.html "을 참조하십시오. PHP 파일의 도메인은 javascript 파일의 도메인과 동일해야하므로 IE는 작동하지만 다른 브라우저는 작동하지 않습니다. "http : //localhost/project3/project3.html"과 같은 URL을 사용해야합니다. localhost를 사용하십시오. 또한 자바 스크립트 호출에서 localhost를 통해 PHP 파일을 호출하는지 확인하십시오.