2012-11-30 100 views
0

由於某種原因,$ .ajax()沒有被調用。它正在檢測$(「#login」)。submit()函數,因爲我確實在那裏有警報,它會調用它。Ajax呼叫在PhoneGap上不起作用

我正在使用http://build.phonegap.com構建文件而不是構建它們。

我看到這個彈出很多。但是,沒有任何解決方案幫助我解決問題。我有這樣的代碼:

signin.js:

$(window).load(function() { 


$('#login').submit(function(e){ 
    e.preventDefault(); 
    obj = $(this); 
    un = $("input[name='user']").val(); 
    pass = $("input[name='pass']").val(); 
    $.ajax({ 
     url: https+"getUserDetails", 
     data: { 
      username: un, 
      password: pass 
     }, 
     dataType: "jsonp", 
     crossDomain: true, 
     type: "POST", 
     jsonpCallback: "user", 
     success: function(response, textStatus, jqXHR){ 
      if(response.exists){ 
       alert(response.access_token); 
       window.localStorage.setItem("user", JSON.stringify({"name": response.name, "id": response.id, "token":response.access_token}, null)); 
       runController(); 
      } 
      else{ 
       $("#er").show(); 
      } 
     } 
    }); 
    return false; 
}); 

}); 

config.js:

addr = "domain.com" 
api = "/api/v1/" 
http = "http://"+addr+api 
https = "https://"+addr+api 

config.xml文件:

.... 
<access origin="*" subdomains="true" /> 

<feature name="http://api.phonegap.com/1.0/device" /> 
<feature name="http://api.phonegap.com/1.0/file" /> 
<feature name="http://api.phonegap.com/1.0/network" /> 

<preference name="phonegap-version" value="2.1.0" /> 
.... 

的index.html:

<!DOCTYPE html> 
<html> 
<head> 
    .... 
    <title>Sign In</title> 
    <script type="text/javascript" src="js/jquery-1.8.2.min.js"></script> 
    <script type="text/javascript" src="js/controller.js"></script> 
    <script type="text/javascript" src="cordova-2.2.0.js"></script> 
    <script type="text/javascript" src="js/signin.js"></script> 
    .... 
</head> 
<body> 
    .... 
    <form id="login" action="#"> 
     <h2 class="form-signin-heading">Please sign in</h2> 
     <input type="text" class="input-block-level" placeholder="Email address" name="user"> 
     <input type="password" class="input-block-level" placeholder="Password" name="pass"> 
     <label class="checkbox"> 
      <input type="checkbox" value="remember-me"> Remember me 
     </label> 
     <button class="btn btn-large btn-primary" type="submit">Sign in</button> 
     </form> 
    ....  
    </body> 
</html> 

更新1

這裏是服務器日誌顯示:

Started POST "/api/v1/getUserDetails" for .... at 2012-11-29 20:38:22 -0800 
Processing by Api::V1::ApiController#user_details as JSON 
Parameters: {"username"=>"user", "password"=>"[FILTERED]"} 
WARNING: Can't verify CSRF token authenticity 
Completed 406 Not Acceptable in 15ms (ActiveRecord: 2.9ms) 

更新2

我禁用CSRF在我的API控制標記,因爲它不需要在這裏是什麼我的服務器日誌顯示在phonegap下進行ajax調用時。

Started POST "/api/v1/getUserDetails" for .... at 2012-11-30 11:38:26 -0800 
Processing by Api::V1::ApiController#user_details as JSON 
Parameters: {"username"=>"user", "password"=>"[FILTERED]"} 
Completed 406 Not Acceptable in 27ms (ActiveRecord: 0.4ms) 

仍然收到406錯誤。接下來我應該嘗試什麼?

+2

您是否有任何服務器端日誌顯示請求永遠不會使它在那裏?也可以添加一個錯誤函數來查看它是否獲得了呼叫,但它沒有收到200響應。 –

+0

同意以上。向ajax函數添加一個錯誤方法。另外,確保服務器上實際存在回調方法。 – chrisvillanueva

+0

所以它調用了ajax函數,但是我收到了錯誤406。當我在本地機器上做過測試時,它可以正常工作。但是,不是生產服務器。爲什麼? –

回答

0

這是對我的Ruby on Rails的側面造成這個錯誤。我忘了,因爲這是一個移動設備,我修改格式爲手機。我必須做的解決這個問題是在API控制器做到這一點:

skip_before_filter :prepare_for_mobile 

這解決了我的問題。

0

現在我們看到問題的根源,您將不得不去調試406.這裏有幾個鏈接解釋了406的含義。

http://www.checkupdown.com/status/E406.html

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

從本質上講,你需要確保你的HTTP請求沿着頭,指出客戶端(您的應用程序)將接受的方式,服務器可以服務格式化的響應發送背部。讓客戶端和服務器就格式達成一致可能需要客戶端或服務器端的更改。我不知道你正在使用的服務器什麼,但你可以修改通過接受您的jQuery Ajax請求的頭這裏提到

http://api.jquery.com/jQuery.ajaxSetup/

+0

你有什麼建議放入ajaxSetup?我之所以這樣說,是因爲在Chrome或其他版本下運行ajax命令時,它工作得很好,並執行它應該做的事情。 –

+0

您是在Chrome中還是在仿真器/模擬器或設備上測試您的應用程序? Chrome可能會正確創建請求,但似乎並不是這種情況,即使您發現此錯誤。至於需要進入ajaxSetup的內容將取決於您的請求當前正在發送的Accept報頭以及服務器願意回送的內容。 –

+0

我在Chrome和真實設備上測試我的應用程序。 –