PhoneGap開發,理論上好處多多。但由於javascript是其中的主角,而且是直接存放於手機,跟服務器數據交互,就會有一個跨域訪問的問題。javascript
固然,這個問題確定有解決方案,否則的話,這種利用PhoneGap等的混合APP模式就沒有存在的價值。html
網上的方案有不少,好比獲取數據,能夠採用Jsonp。java
但提交數據呢?web
首先能夠在服務器端作一些配置,容許跨域請求。好比,對於ASP.NET開發的網站,能夠修改web.config,加上:json
web.config:跨域
<system.webServer> <httpProtocol> <customHeaders> <add name="Access-Control-Allow-Methods" value="OPTIONS,POST,GET"/> <add name="Access-Control-Allow-Headers" value="x-requested-with,content-type"/> <add name="Access-Control-Allow-Origin" value="*" /> </customHeaders> </httpProtocol> </system.webServer>
$(function () { $("#divHello").html("Hello PhoneGap"); forServer(); }); var ashx = "http://10.69.25.132/test.ashx"; function forServer(){ var xhr; xhr = new XMLHttpRequest(); if (xhr){ xhr.onerror = function(){alert("錯誤");}; //xhr.timeout = 60000;//IE9加上這個屬性會報錯,不知道爲何,其餘版本未測試 xhr.ontimeout = function(){alert("超時");}; xhr.onload = function(){ var data = $.parseJSON(xhr.responseText); $("#divData").html(data.data); }; xhr.open("post", ashx,true); xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded"); xhr.send("p1=guangzhou tianhe"); } else{ alert("Failed to create"); } }
public class test1 : IHttpHandler { public void ProcessRequest(HttpContext context) { context.Response.ContentType = "application/json"; context.Response.Charset = "utf-8"; string res = String.Format(@"{{""data"":""{0}""}}", context.Request.Form["p1"] ); context.Response.Write(res); } public bool IsReusable { get { return false; } } }
經驗總結:瀏覽器
一、$.getJSON()的方式,Chrome下能夠,IE死活不行,在IE瀏覽器下,按F12查看,根本沒有鏈接指定的.ashx,直接拒絕。改用XMLHttpRequest,兩種瀏覽器都能接受。放在安卓手機模擬器裏也能正常運行服務器
二、形如 http://localhost:8088/test.ashx 這種方式,在安卓手機模擬器裏是連不上的,要改爲IP或域名:http://192.168.10.1:8088/test.ashxapp
function getData(){ $.getJSON( ashx ,{"uid" : Date()} ,function(data) { $("#divData").html(data.data); }); }