Hybrid--WebView中使用Ajax
来源:互联网 发布:网络会员制营销 编辑:程序博客网 时间:2024/04/30 13:44
Hybrid框架下的app,使用的Ajax,需要注意的是UIWebViewDelegate不会监测到Ajax的request,也就是再执行Ajax代码时,shouldStartLoadWithReuqest等方法并不会被调用。
其解决方法需要Javascript和navtive code一起来做,其基本原理可参考这片文章,其流程是在
Javascript handler中每创建Ajax的请求时,需要将这段js存在ajax_handler.js放在app中
var s_ajaxListener = new Object();s_ajaxListener.tempOpen = XMLHttpRequest.prototype.open;s_ajaxListener.tempSend = XMLHttpRequest.prototype.send;s_ajaxListener.callback = function () { window.location='mpAjaxHandler://' + this.url;};XMLHttpRequest.prototype.open = function(a,b) { if (!a) var a=''; if (!b) var b=''; s_ajaxListener.tempOpen.apply(this, arguments); s_ajaxListener.method = a; s_ajaxListener.url = b; if (a.toLowerCase() == 'get') { s_ajaxListener.data = b.split('?'); s_ajaxListener.data = s_ajaxListener.data[1]; }}XMLHttpRequest.prototype.send = function(a,b) { if (!a) var a=''; if (!b) var b=''; s_ajaxListener.tempSend.apply(this, arguments); if(s_ajaxListener.method.toLowerCase() == 'post')s_ajaxListener.data = a; s_ajaxListener.callback();}
其中的"mpAjaxHandler"为自定义的Scheme,用于区别request是否是由Ajax发出的。
在App端
获得js
static NSString *JSHandler;+ (void)initialize { JSHandler = [[NSString stringWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"ajax_handler" withExtension:@"js"] encoding:NSUTF8StringEncoding error:nil] retain];}
载入页面后,执行这段js
- (void)webViewDidStartLoad:(UIWebView *)webView { [webView stringByEvaluatingJavaScriptFromString:JSHandler];}拦截住Request,不让webview的URL做出改变
#define CocoaJSHandler @"mpAjaxHandler"- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { if ([[[request URL] scheme] isEqual:CocoaJSHandler]) { NSString *requestedURLString = [[[request URL] absoluteString] substringFromIndex:[CocoaJSHandler length] + 3]; NSLog(@"ajax request: %@", requestedURLString); return NO; } return YES;}
Ajax相关知识
Ajax作为异步Javascript广泛应用在web网站上。下面是一个来自于w3school的简单使用Ajax的例子:
<html><head><script type="text/javascript">function loadXMLDoc(){var xmlhttp;var txt,x,i;if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp=new XMLHttpRequest(); }else {// code for IE6, IE5 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); }xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState==4 && xmlhttp.status==200) { xmlDoc=xmlhttp.responseXML; txt=""; x=xmlDoc.getElementsByTagName("title"); for (i=0;i<x.length;i++) { txt=txt + x[i].childNodes[0].nodeValue + "<br />"; } document.getElementById("myDiv").innerHTML=txt; } }xmlhttp.open("GET","http://www.w3school.com.cn/example/xmle/books.xml",true);xmlhttp.send();}</script></head><body><h2>My Book Collection:</h2><div id="myDiv"></div><button type="button" onclick="loadXMLDoc()">GET Book List</button> </body></html>
点击button,通过Ajax的方式获得书单。部分内容参考于stackoverflow
1 0
- Hybrid--WebView中使用Ajax
- Android中Hybrid的使用
- Hybrid App 开发初探:使用 WebView 装载页面
- Android 使用 WebView 实现 Hybrid 的思路导引
- 使用webview几种常见的hybrid通信方式
- hybrid优化&webview加速
- android webview 中使用 ajax 读取 asset 资源问题
- WebView整合,Hybrid Apps起始
- Hybrid--webview session保持--2
- Android Hybrid 和 WebView 解析
- Android Hybrid 和 WebView 解析
- Hybrid(混合式) Appz之WebView中如何让JS与Java安全地互相调用
- WebView中使用javascript
- Unity中使用WebView
- Android中WebView使用
- Android 中使用WebView
- 在gvim中使用YaHei Consolas Hybrid字体
- Hybrid app开发获取webview屏幕宽度
- 短文本(微博)情感分析
- 记录自己最近的工作状态
- 6个变态的C语言Hello World程序 之 雷人的程序语言
- Unable to compile class for JSP 问题解决方法
- [编程之美] PSet2.13 子数组的最大乘积
- Hybrid--WebView中使用Ajax
- OC:打僵尸问题(类的问题)
- poj1703
- Highcharts选项配置详细说明文档
- hdu1251 字典树
- Android BaiduMap 定位到指定坐标
- 单例的灾难
- 【黑马程序员】Java学习技术博客——银行业务调度系统
- 从“O2O演唱会”中得到的启示