web-dev-qa-db-ja.com

$ .getJSONが機能しない

JQueryで関連トピックを検索します。しかし、私は自分の問題を解決する方法を見ませんでした。

$(document).ready(function(){
    $("#inputForm").submit(function(event){
        $(":text").each(function() {
            var inputText = $(this).val();
            var userList = [];
            var weblink = 'http://test.com';

            // problem is from here.
            $.getJSON(weblink, function(data){
                alert(weblink); // this statement doesn't show up
                $.each(data, function(entryIndex, entry){
                    userList.Push(entry['from_user']);
                });
            });
            alert(userList);
        });
     });
});

ここには4つの問題があります。

  1. 最初のアラート( 'weblink')が表示されない理由。
  2. このコードがウェブサイトからjsonデータを取得できない理由
  3. このコードの目的は、jsonファイルからfrom_userタグを取得し、userList配列に格納することです。
  4. "$ .each(data、function(entryIndex、entry){"ステートメントの変数。関数には2つの入力パラメーターがあります。1つはentryIndexで、もう1つはentryです。これらの2つのパラメーターは何のためにあるのでしょうか?また、どのように使用できますか?これらの2つのパラメータ。

誰かが私がこの問題を解決するのを手伝ってくれる?ここに1日入荷しました。どうもありがとうございました。

7
Jimmy Lin

そこでのいくつかの問題:

  1. getJSONはajaxリクエストを実行します。 Ajaxリクエストは 同一生成元ポリシー の対象となります。ページがhttp://test.com(または他のいくつかの警告)から読み込まれない限り、機能しません。サーバーがサポートしていれば、おそらく JSON-P (jQueryもサポートしています)を探しています。

  2. getJSONは、すべてのajaxリクエストと同様に、デフォルトで非同期であるため、(ユーザーリストを含む)2番目のアラートがbeforeリクエストが完了します。 ajaxリクエストを同期させることはできますが、それは非常に悪い考えです(リクエスト中にほとんどのブラウザーのUIをロックします)。代わりに、getJSONを呼び出す関数で使用するのではなく、コールバックでユーザーリストを受け取った後で使用してください。

編集:Twitter検索APIを使用しようとしていると以下に述べました。そのAPIはJSON-Pをサポートしているため、JSON-Pを使用してリクエストを実行すると機能するはずです。例えば。:

$(document).ready(function(){
    $("#inputForm").submit(function(event){
        $(":text").each(function() {
            var inputText = $(this).val();
            var userList = [];
            var weblink = 'http://search.Twitter.com/search.json?q=&ands=google';

            // problem is from here.
            $.ajax({
                url:        weblink,
                dataType:   "jsonp", // <== JSON-P request
                success:    function(data){
                    alert(weblink); // this statement doesn't show up
                    $.each(data.result, function(entryIndex, entry){ // <=== Note, `data.results`, not just `data`
                        userList.Push(entry['from_user']); // <=== Or `entry.from_user` would also work (although `entry['from_user']` is just fine)
                    });
                    alert(userList); // <== Note I've moved this (see #2 above)
                }
            });
        });
     });
});

...しかし確かにあなたはフォームのeachテキストフィールドに対してそれをしたくないですか?

これが実際の例です ただしフォームはありません(各フィールドのリクエストではなく、1つのリクエストのみを実行します)。

15
T.J. Crowder

リンクに追加するだけ

&callback=?

または

?callback=?

(これが最初で唯一のGET変数の場合)これにより、呼び出しがJSONP呼び出しになりますが、同一生成元ポリシーに問題はありません。

4
nagisa

MVCプラットフォームを使用していますか?どうやら、デフォルトでMVC 2.0は、JsonResultを返すアクションへのGETリクエストをブロックします。チェックアウト:

http://mhinze.com/2010/04/13/json-hijacking-in-asp-net-mvc-2/

.getJSON呼び出しを使用してMVCコントローラーからビューに(jquery/javascriptを介して)データをプルする既存のアプリケーション(MVC v1で記述)をアップグレードしているときに同じ問題が発生し、それらが機能しない理由を理解できませんでした。運が悪かったjquery、それから私は上記のリンクを見つけました。代わりにPOSTに変更し(また、データがコントローラーから送信される方法を少し変更しました-辞書を使用しました)、動作させました-ついに!!

幸運を! JayD

1
JayD

わかりませんが、get引数は必要ありませんか?これを試して:

$.getJSON(weblink, {}, function(data){
1
Chris

WindowsのIIS)の下の開発環境で、jQuery.getJSON()が期待どおりに応答しない可能性がある別の理由を追加したいと思います。

ここに記載されているすべての手順に従って、*。jsonファイルからデータを取得できませんでした。拡張子を* .jsに変更した場合にのみ、応答ステータスが返されました。

{"status"="404", "statusText"="Not Found"}

次に、IISで指定されていないMIME /タイプがいくつかあることを思い出しました。拡張子が.jsonのファイルにMIME /タイプapplication/jsonを追加すると、問題が解決しました。

iis7にMIME /タイプを追加する方法について

0
raphie