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); }); }