2011-01-07 4 views
2

UPDATE 1:私は何が起こっているのか分かっていませんが、これは間違いなく私のプロジェクトに問題があるようです。簡単なテストページを作成した後、getJSONが実際に想定されているようにXHRオブジェクトを返すかどうかを検証できました。jQueryのAjaxメソッドがXHRオブジェクトを返さない

更新日2:うわー、これは変です。より多くのテストをした後、私は "コールバック=?" XHRオブジェクトは正しく返されません。しかし、私は "コールバック="を指定していない場合は? XHRオブジェクトが正しく返されます。問題は、私はJSONPサービスを呼び出しているので、 "コールバック=?"パラメータが必要です。

なぜこのようなケースが考えられるのですか?

UPDATE 3:ここでは、この問題を説明するためのスタンドアロンのコードサンプルをいくつか示します。最初のサンプルでは、​​console.log(request)は未定義です。 2番目のコードサンプルでコールバックパラメータをハードコードすると、console.log(request)がXHRオブジェクトになります。

<html> 
    <head> 
     <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script> 
    </head> 
    <body> 
     <script> 
      $(document).ready(function() { 
       var request = $.getJSON('http://localhost?callback=?', function(data) { 

       }); 
       console.log(request); 
      }); 
     </script> 
    </body> 
</html> 

<html> 
    <head> 
     <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script> 
    </head> 
    <body> 
     <script> 
      $(document).ready(function() { 
       var request = $.getJSON('http://localhost?callback=callback', function(data) { 

       }); 
       console.log(request); 
      }); 
     </script> 
    </body> 
</html> 

UPDATE 4:以下regileroさんのコメントパー、私は$アヤックスの方法を使用してに切り替え、データオブジェクトを介してパラメータを渡します。ここでは、要求のための完全なコードは次のとおりです。

var request = $.ajax({ 
    data: { 
     f: 'json', 
     geometry: '{x:44.203642291681845,y:-95.79085806500001}', 
     geometryType: 'esriGeometryPoint', 
     imageDisplay: '727,500,96', 
     layers: 'all', 
     mapExtent: '-179.462733065,16.116769346042226,-51.669764315000016,71.57609342040729', 
     returnGeometry: false, 
     tolerance: 10 
    }, 
    dataType: 'jsonp', 
    success: function(data) { 
     console.log(data); 
    }, 
    url: 'http://server.arcgisonline.com/ArcGIS/rest/services/Specialty/Soil_Survey_Map/MapServer/identify' 
}); 
console.log(request); 

私が指定した場合:configオブジェクトで「データ型 『をJSONP』」、にconsole.log(リクエスト)が再び定義されていません。しかし、 "dataType: 'json'"を指定すると、console.log(request)がXHRオブジェクトになります。

この動作は、$ .getJSONショートカットで経験したことと一致しています。


元の質問stackoverflowの質問パー

は/ここに答える:Abort Ajax requests using jQueryと他の質問/このサイト上の答えと他の数を、jQueryのAjaxの方法は、XHRオブジェクトを返す必要があります。

ただし、次のコードを実行すると、要求は「未定義」です。

var request = $.getJSON(url, function(data) { 
    console.log(data); 
}); 

console.log(request); 

jQueryの変更がありませんでしたか?私は1.4.4を使用しています。

+0

マニュアルによると、それはまだXHRオブジェクトを返す必要があります。 http://api.jquery.com/jQuery.getJSON/リクエストが失敗する可能性がありますか? –

+0

@ペッカ:いいえ、要求は間違いなく失敗しません。 –

+0

ええ、ごめんなさい。私はその質問を誤解した。 – Anders

答えて

4

jsonpはXMLHTTPRequestを使用しません。これはすべてのXMLHTTPRequestsに適用される同じ起点ポリシーの回避策です。 DOMの中に<script>タグを挿入し、サーバーにcallback=?パラメータで示されるJS関数でラップされたJSONオブジェクトを返すように要求します。

XMLHTTPRequestは使用されないため、その型のオブジェクトは返されません。

+0

これは明らかになり始めました!確認していただきありがとうございます。だから、JSONPリクエストを中止する方法はないと思いますよね?私ができることは、 "古くなった" JSONPリクエストからのリターンを無視することだと思います。 –

+0

@Nateいいえ、JSONPリクエストを中止する方法はありません。 – lonesomeday

+0

疑問のある人は、window.stop()を呼び出してスクリプトリクエスト(JSONP)を中止することができます。これは、すべての保留中のイメージとスクリプト要求を中止します。したがって、ほとんどの場合、これは大きな解決策ではありません。 –

0

間違った答え。この投稿を無視してください。

$ .getJSONは値を返しません。代わりに、送信されたURLの応答を取得し、それをJSONオブジェクトに変換し、渡された場合はコールバックに渡します。 URLチェック:[1] [リンクテキスト]を[1]:(jQueryのサイトごとなど)http://api.jquery.com/jQuery.getJSON/ getJSONメソッドのスケルトン: > jQueryの。 > >リクエストを送信するURLが にあるurlA文字列> getJSON(url、[data]、[ > callback(data、textStatus、xhr)]) > > > >要求のあるサーバーに、 に送信されるdataAマップまたは文字列。 > >コールバック(data、textStatus、xhr) > >要求が成功した場合に実行されるコールバック関数。
+0

リンクしたドキュメントによると、getJSONはXmlHttpRequestを返します。右側の見出しを見てください。 –

+0

Thx Nate。削除された行のポストを更新しました。 – Chandu

0

$ .getJSONは、$ .ajax()の略語のように、$ .ajax()の略語のように、デフォルトのエラーハンドラはありません。 $ .ajaxを使用してエラーハンドラを設定してください。 Mayeの何かがあなたのJson構文で間違っています。あなたは「サイレント・フェイル」問題に陥っています。

ドクエキス:

重要: JSONファイルに構文エラーが含まれている場合はjQuery 1.4のとおり、 要求は通常、黙って失敗します。 この理由から、JSON のデータを頻繁に手で編集することは避けてください。 JSONは、 JavaScriptのオブジェクトリテラル表記よりも厳しい構文 の規則を持つ データ交換形式です。 たとえば、プロパティーが であるかどうかにかかわらず、すべての文字列がJSONの を表しているかどうかは、二重引用符の で囲む必要があります。 JSON 形式の詳細については、http://json.org/を参照してください。

+0

いいえ、私は間違いなく適切な応答を戻しています。オリジナルの投稿の「Update 2」を参照してください。そこにいくつかの新しい情報があります。 –

+0

@Nateパラメータについては、URLをurlencodeするか、$ .ajax()のdataパラメータを使用してurlのパラメータを設定する必要があります。そして、あなたが「適切な応答」と言うとき、それは本当に構文の点では良いと思いますか? – regilero

+0

これを試しました。上記の「Update 4」をチェックしてください。 –

0

$.getJSONの機能は、JSONリクエストがまだ完了していなくても、スクリプトを超えて実行を継続する非同期の意味です。要求が返される前にconsole.log(request);が実行されている可能性があります。おそらくxhrオブジェクトがありません。

これはわかりませんが、それは考えです。

編集:以下は私がXHRオブジェクトは、コールバック関数の3番目の引数として渡され
間違っていた実現私のオリジナルの答えでした。必要ならば、function(data) {の代わりにfunction(data, statusText, xhr) {を使用する必要があります。

成功コールバックがまったく呼び出されていない場合、それは別の話です。コールバックにalert(statusText);を追加して、コールバックされていることを確認してください。呼び出されていない場合は、@regileroと記述して、エラーハンドラが渡されたかどうかを確認するためにエラーハンドラを渡して$.ajaxを使用してください。

+0

$ .getJSONはXHRオブジェクトを返します。そのため、非同期要求であることは何の関係もないはずです。 –

0

最初の答えは実際にあなたがAJAX要求を中止することができます間違っている;)

$.ajax({ 
    url: "/event/search/list-event.html", 
    data:{ 
     page: 1 
    }, 
    beforeSend: function(xhr) 
    {  
     if(window.eventListXhr != null){ 
      window.eventListXhr.abort(); 
     } 
     window.eventListXhr = xhr; 
    }, 
    success: function(data) { 
     // .... 
    } 
}); 
+0

ええ、私は最初に質問したときにこれが利用できなかったと思いますが、jQueryに追加されました。 –

関連する問題