栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

UIWebViewDelegate不监视XMLHttpRequest吗?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

UIWebViewDelegate不监视XMLHttpRequest吗?

有趣的问题。

有两部分可以完成这项工作:Javascript处理程序和UIWebView委托方法。在Javascript中,我们可以修改原型方法以在创建AJAX请求时触发事件。使用我们的UIWebView委托,我们可以捕获这些事件。

在我们的案例中,为了使代码正常工作,我将以下Javascript放入了与我的应用程序捆绑在一起的名为 ajax_handler.js 的资源中。

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

这实际上是将浏览器的位置更改为某些组合的URL方案(在本例中为 mpAjaxHandle
),其中包含有关所发出请求的信息。不用担心,我们的代表可以抓住这一点,而且位置不会改变。

UIWebView代表

首先,我们需要阅读我们的Javascript文件。我建议将其存储在静态变量中。我有使用+ initialize的习惯。

static NSString *JSHandler;+ (void)initialize {    JSHandler = [[NSString stringWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"ajax_handler" withExtension:@"js"] encoding:NSUTF8StringEncoding error:nil] retain];}

接下来,我们想在页面加载完成之前注入此Javascript,以便我们可以接收所有事件。

- (void)webViewDidStartLoad:(UIWebView *)webView {    [webView stringByevaluatingJavascriptFromString:JSHandler];}

最后,我们要捕获事件。

由于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;}

我使用解决方案创建了一个示例项目,但无处可托管。如果可以托管,可以给我发消息,我会相应地对此帖子进行编辑。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/403952.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号