2012-04-09 18 views
1

调用JSONP未知的错误,我有以下HTML代码:从内部的PhoneGap和jQuery

<!DOCTYPE html> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
     <meta name="viewport" content="width=device-width, initial-scale=1"> 
     <script src="js/jq.js"></script> 
     <script src="js/jqm.js"></script> 
     <script src="js/jstore.js"></script> 
     <script src="js/progressbar.js"></script> 
     <script src="js/sql.js"></script> 
     <script src="js/phonegap-1.4.1.js"></script> 
     <script src="js/sha512.js"></script> 
    </head> 
    <body> 
     <!-- Start of first page: #one --> 
     <div data-role="page"> 
      <!-- header --> 
      <div data-role="header"> 
       <table width="100%" border="0" cellpadding="0" cellspacing="0"> 
        <tr> 
         <td> 

         </td> 
         <td> 
         </td> 
        </tr> 
       </table> 
      </div> 
      <!-- /header --> 
      <div data-role="content" data-theme="a"> 
       <center> 
        <span class="progressBar" id="pb1"></span> 
        <br /> 
        Initial Syncronisation in progress! 
       </center> 
      </div> 
      <!-- footer --> 
      <div data-role="footer"> 

      </div> 
      <!-- /footer --> 
      <script lang="text/javascript"> 
       document.addEventListener("deviceready", onDeviceReady, false); 
       function onDeviceReady() { 
        $("#pb1").progressBar(); 
        $("#pb1").progressBar(5); 
        $.ajax({ 
         url: 'https://url/user/'+$.jStorage.get("username","false")+'/modeSet/'+$.jStorage.get("password","false")+'/subSequence/'+hex_md5(new Date().getTime())+'.html', 
         dataType:'jsonp', 
         jsonp:'jsonp_callback', 
         jsonpCallback:'infoData', 
         success: function (data) { 
           alert('success'); 
         }, 
         error:function (xhr, ajaxOptions, thrownError){ 
          alert(xhr.status); 
          alert(thrownError); 
         } 
        }); 
       } 
      </script> 
     </div> 
    </body> 
</html> 

当我调用的页面,我得到的代码200,并包含以下内容的附加警告框的错误:

Error: infoData was not called! 

它运行在一个真正的三星Galaxy S2与Android 4.0.4。我有一个互联网连接,但我不知道我要出错的地方。

infoData({"validJsonDocument":"yes"}); 

我使用的PhoneGap 1.4.1使用jQuery 1.7.1和jQuery移动的up2date

其他库实际上是不使用:

服务器返回的文档。

+0

你忘了在你的问题中包含infoData函数的函数定义吗?我没有看到你的代码。 – jmort253 2012-04-09 00:44:52

+1

我认为你没有在代码中声明'infoData'函数。 – rcdmk 2012-04-09 00:45:38

回答

1

JSONP代表带有填充的JSON。填充表示在发送回客户端时包装JSON响应的函数名称。

当收到结果时,它实际上被当作是普通JavaScript处理,并按照这种方式处理。因此,调用包装在您的JSON中的函数。

这意味着为了让JSONP正常工作,DOM中必须存在一个与包装JSON响应的函数名相匹配的函数。

此外,作为使用"jsonCallback" jQuery AJAX property回调函数的名称,您所指定的“INFODATA”:

jsonpCallback String, Function 

为JSONP请求指定回调函数的名称。这个值将被用来代替jQuery自动生成的随机名称。最好让jQuery生成一个唯一的名称,因为它可以更容易地管理请求并提供回调和错误处理。当您希望启用更好的浏览器缓存GET请求时,您可能需要指定回调。从jQuery 1.5开始,你也可以为这个设置使用一个函数,在这种情况下,jsonpCallback的值被设置为该函数的返回值。

尝试在名为“infoData”的页面上定义一个函数,该函数采用单个参数,这会让您通过此错误。

function infoData(jsonObj) { 
    alert(JSON.stringify(jsonObj)); // print the raw JSON object 
    alert(jsonObj.validJsonDocument); // access the property in your JSON object. 
} 

或者,你可以采取jQuery的文档的建议,并彻底清除jsonpCallback选项,靠你已经定义的成功回调。

0

我修改的代码如下:

<script lang="text/javascript"> 
      document.addEventListener("deviceready", onDeviceReady, false); 
      function onDeviceReady() { 
       $("#pb1").progressBar(5); 
       $.ajax({   
        url: 'http:url/jsonp.html', 
        dataType: 'jsonp', 
        jsonp: 'callback', 
        jsonpCallback: 'jsonpCallback', 
        success: function (data) { 
          $("#pb1").progressBar(25); 
          alert(data.version); 
        }, 
        error:function (xhr, ajaxOptions, thrownError){ 
         alert(xhr.status); 
         alert(thrownError); 
        }      
       }); 

      } 
      function jsonpCallback(data){ 
       alert(data.message); 
      } 
     </script> 

如果我在谷歌浏览器打开页面,它的工作原理没有问题。 如果我在android浏览器中打开它,它会做同样的事情。 给我一个错误200,并说我没有调用jsonpCallback。 我真的不知道为什么脚本给了我这么难的时间。 Chris