Jquery jsonp不一致错误:对象不是函数

Jquery jsonp不一致错误:对象不是函数,jquery,ajax,jsonp,Jquery,Ajax,Jsonp,我试图将jsonp与jQuery一起使用,但我得到了不一致的行为。剧本有时行得通,有时不行;我真的不明白为什么 这是Chrome可能显示的错误: Uncaught TypeError: Property 'jQuery18208278296771459281_1362854738133' of object [object Object] is not a function 在下面的示例中,我只想检查应用程序是否在线。但这种不一致的行为可能会发生在其他类似的ajax调用上: $.aj

我试图将jsonp与jQuery一起使用,但我得到了不一致的行为。剧本有时行得通,有时不行;我真的不明白为什么

这是Chrome可能显示的错误:

Uncaught TypeError: Property 'jQuery18208278296771459281_1362854738133' of object [object Object] is not a function
在下面的示例中,我只想检查应用程序是否在线。但这种不一致的行为可能会发生在其他类似的ajax调用上:

     $.ajaxSetup({
        error: function (req, status, ex) {},
        success: function (data, status, req) {},
        timeout: 2000,
        crossDomain: true,
        contentType: "application/json",
        dataType:"jsonp",
        url: "http://myUrl.com/ping.php?preventCache="+new Date()
    });
    return $.ajax();
服务器端PHP文件也非常简单:

<?php
header("Content-Type: application/javascript; charset=UTF-8");
echo $_GET['callback'];
?> ({ "status": "online" })
({“状态”:“在线”})

检查脚本是否连续多次发出相同的AJAX请求

我有一个错误的事件处理程序,它同时触发了两个请求,这导致了相同的问题


(我假设您只调用过一次$.ajaxSetup):看起来您打算为ping调用应用缓存清除器,但在$.ajaxSetup中执行此操作可能会产生相反的效果,因为URL将针对所有后续请求进行修复

您的问题不太清楚,我在尝试两次使用相同的回调函数名时遇到了相同的错误。在任何情况下,在jquery中都应该这样调用jsonp:

      var mycallback = 'c'+Math.floor((Math.random()*100000000)+1);
      $.ajax({
                   type: 'GET',
                    url: URL,
                    async: true,
                    jsonpCallback: mycallback,
                    contentType: "application/json",
                    dataType: 'jsonp'

       }).done(function(json){
           console.log(json);
                    callback(json);
       }).fail(function(f){
           console.log("f");
                    console.log(f.status);
       }).always(function(){
                   // console.log('complete');
      }); 

当JSONP调用超时时(根据
timeout:2000
行,这是两秒),但数据在超时发生后到达,您将得到这种行为

JSONP不使用普通的XmlHTTPRequest。为了执行JSONP,jQuery在文档中插入一个脚本标记,并生成一个临时函数来处理脚本标记加载(函数名是错误消息中的那个长随机字符串)

当出现超时且脚本尚未完成加载时,jQuery将丢弃临时函数。之后的某个时候,脚本标记完成加载,并尝试调用该函数——但为时已晚,该函数已被删除。因此出现了错误

延长超时时间可能会减少错误,但基本问题是无法取消加载脚本标记。如果它没有出错,总有可能比超时时间长一点。据我所知,没有一个简单的解决办法。您可以告诉jQuery使用显式命名的函数作为JSONP回调,而不是自己进行回调,但是您需要自己跟踪是否超时。你可以使用CORS,这是另一回事

也许你最好的办法就是接受它