1

クロスドメイン AJAX リクエストで JQuery と PHP を使用して Web アプリケーションを作成する必要があります。したがって、JSONP を使用してリクエストを実行します。Firefox では正常に動作しますが、Chrome と Opera では動作しません。

リクエストを実行するための関数が 1 つあります。

function update()
{
    $.ajax({
        url : url,
        type : "GET",
        dataType: "jsonp",
        crossDomain : true,
        jsonpCallback : "updateCallback",
        async : false, 
        data : {'session_id' : sessionID,'user' : userName },
        error : function (xhr, status, error) {
            alert("Erreur de chargement du fichier '"+url+"' : "+xhr.responseText+" ("+status+" - "+error+")");
        },
        success: function(){
            alert("Success !");
        }
    });
}

これはコールバック関数です:

function updateCallback(data)
{     
    var i = 0;
    var messages = data.messages;

    while(i < data.messages.length){  
       appendMessage(data.messages[i]);
       i++;
    }

    saveLastMsgID = lastMsgID;
    doUpdate = updateInProgress = false;
}

AJAX リクエストによって呼び出される PHP スクリプト:

<?php

/* ... */ 

function sendResponse($messages,$date)
{
    header('content-type: application/json; charset=utf-8'); 
    header("Access-control-allow-origin: *");
    header ("Access-Control-Allow-Headers: x-requested-with", true);
    header('Access-Control-Allow-Methods: GET,OPTIONS');

    $datas = array();

    for($i = 0 ; $i < count($messages) ; $i++){
        $msg = $messages[$i];
        $message = null;
        $message->sender = $msg->getSender();
        $message->date = $date;
        $message->msg = stripslashes($msg->getContent());
        $message->carrier = $carrier;
        $datas[] = $message;
    }
    $data->messages = $datas;
    echo $_GET['callback']. '('. json_encode($data) . ')'; 
}
?>

ご協力いただきありがとうございます!

4

3 に答える 3

3

男、あなたはそこにたくさんのものを持っています。それは本当に必要ではありません。これを試して。jQueryがコールバックを処理できるようにするため、success関数には、応答に埋め込まれたJSONで表されるオブジェクトが渡されます。

function update()
{
    $.ajax({
        url : url,
        dataType: "jsonp",
        // async : false, <-------- THIS IS IGNORED BY JQUERY DUE TO JSONP DATATYPE
        data : {'session_id' : sessionID,'user' : userName },
        success: function(data){
            // alert("Success !");
            var i = 0;
            var messages = data.messages;

            while(i < data.messages.length){  
               appendMessage(data.messages[i]);
               i++;
            }

            saveLastMsgID = lastMsgID;
            doUpdate = updateInProgress = false;
        }
    });
}
于 2012-05-08T14:47:59.800 に答える
2

ブラウザに adblock プラグインをインストールしていて、リクエスト URL に「ad」などのキーワードが含まれているかどうか疑問に思っていました。

同様の問題がありましたが、最終的にadblockが問題の原因であることがわかりました.

于 2013-03-12T14:55:15.400 に答える
2

JSON-P は JSON ではありません。JavaScript プログラムに埋め込まれた JSON です。MIME タイプは ですapplication/javascript

Chrome と Opera が、関数呼び出しを JSON 文字列に挿入しようとする試みに反応している可能性があります。

于 2012-05-08T14:37:37.823 に答える