2009-05-27 11 views
1

Firefox 3.0.10で動作するREST Webサービスを使用するサンプルコードをMozillaから取得しようとしています。次のコードはFirefoxでは動作しませんがIE 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'型であると言います)を呼び出す前に定義されていることを確認するためにチェックされています。

私はまた、この非同期バージョンには運がないと試しました。

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」がスローされます。私はダブルチェックし、Firefoxで 'JavaScriptを有効にする'が有効になっています - 他のすべてのWebページでうまく動作しているようです。以下は、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

私はあなたの新しい「わずかに変更された」コードを私のサーバーで使用しました。それはFirefox3で動作します: http://dogself.com/telluriumTest/test.htm 私はより良いログを追加し、その恐ろしいdocument.writeくそを削除します。 – mkoryak

答えて

4

は「http://www.mozilla.org/」しない限り、この要求があるため同一生成元ポリシーの、この文句を言わない作業を発信するドメインである

編集: [OK]を、良い状態が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

さて、あなたが言っていることが分かります。私は、ローカルファイルとローカルWebサービスを打つことを試みたが、どちらも動作しません。 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でも同じように動作します。

サイドノート:火薬瓶はありますか? 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

私はこの正確なコードを試しました。 FirefoxではなくIEでのチャンピオンのように動作します。私はFirebugを素早く使って、何が起こっているのかを見てみよう。 –

+0

私の最新のコードを参照してください... –

+0

これは非常に奇妙です。あなたの更新されたコードはIE 8でうまくいきますが、Firefoxでは "ERROR:undefined"と表示されます。私はオリジナルのソリューションを試しましたが、代わりにjQuery($ .get)を使用するように変更しました。 jQueryはIEで動作しますが、Firefoxでは未定義のエラーが発生します...これはうんざりです。 –

1

ここで何が起こっているのか分かりませんが、一度これがわかると、Mozillaのドキュメントの誰かがこれを見て、ドキュメントを調整する準備が整ったことを知りたがっています。

+0

恐ろしい!キツネを広げるのを助ける何でも。問題を再現できますか? –

+0

Firefox 3.5の夜間ビルドでうまく動作します。私はここで走っています。 –

+0

Firefox 3.0.3(私がアップグレードをしていない3.0.xの最新バージョン)でもうまく動いています。 –

1

はさえ、私は同じ問題を抱えていたし、それは我々がコードをIEで正常に働いていたが、ChromeとFirefoxの

に問題

がInitilly我々は​​の代わりを使用していた に焦点を当てていない愚かな間違いでした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の使用に注意してください。また、javascript呼び出しで、localhostを使用してPHPファイルを呼び出していることを確認してください。

関連する問題