UIWebViewDelegate是否不监视使用XMLHttpRequest发出的请求是否正确?如果是这样,是否有办法监视此类请求?
例如UIWebViewDelegate没有抓住这个-(BOOL) webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSMutableURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
-(BOOL) webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSMutableURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
var xhr = new XMLHttpRequest(); xhr.open("GET", "http://www.google.com", true); xhr.onreadystatechange=function() { if (xhr.readyState==4) { alert(xhr.responseText); } } xhr.send();
有趣的问题。
有两部分可以完成这项工作: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; }
我使用解决方案创建了一个示例项目,但无处可托管。如果可以托管,可以给我发消息,我会相应地对此帖子进行编辑。