【问题标题】:JQuery/JSONP/PHP - Firefox OK, but it doesn't work on Chrome and OperaJQuery/JSONP/PHP - Firefox 可以,但在 Chrome 和 Opera 上不起作用
【发布时间】:2012-05-17 01:28:05
【问题描述】:

我必须使用带有跨域 AJAX 请求的 JQuery 和 PHP 创建一个 Web 应用程序。所以,我使用 JSONP 来完成我的请求。它在 Firefox 上运行良好,但在 Chrome 和 Opera 上不行。

我有一个执行请求的函数:

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) . ')'; 
}
?>

感谢您的帮助!

【问题讨论】:

  • 如果您使用 JSON-P,为什么要使用所有 CORS 标头?
  • @Quentin,阿门。吻。刮掉所有的标题 goop。
  • 我已经删除了所有的标题(我只保留了:header('content-type: application/javascript; charset=utf-8');)它什么也没改变:s

标签: php jquery ajax jsonp


【解决方案1】:

我想知道您是否在浏览器中安装了任何 adblock 插件,并且您的请求 url 包含一些关键字,例如“ad”。

我也遇到过类似的问题,最后发现是adblock导致的问题。

【讨论】:

    【解决方案2】:

    伙计,你那里有很多东西。这不是真的必要。尝试这个。它让 jQuery 处理您的回调,以便成功函数传递响应中嵌入的 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;
            }
        });
    }
    

    【讨论】:

    • @adeneo,很好。我也会删除它。 :)
    【解决方案3】:

    JSON-P 不是 JSON。它是嵌入在 JavaScript 程序中的 JSON。 MIME 类型应为application/javascript

    Chrome 和 Opera 可能正在对似乎试图将函数调用注入 JSON 字符串的行为做出反应。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-10
      • 2021-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多