ajax – UIWebViewDelegate不监视XMLHttpRequest?

前端之家收集整理的这篇文章主要介绍了ajax – UIWebViewDelegate不监视XMLHttpRequest?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
是否真的UIWebViewDelegate不监视使用XMLHttpRequest做的请求?如果是,是否有一种方法来监视这些类型的请求?

例如UIWebViewDelegate不捕获 – (BOOL)webView:(KMWebView *)webView shouldStartLoadWithRequest:(NSMutableURLRequest *)请求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请求时收到通知。我发现解决方here

在我们的例子中,为了使代码工作,我把以下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 Delegate

首先,我们需要读取我们的JavaScript文件。我建议把它存储在一个静态变量。我习惯使用初始化。

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 Scheme是组成的,我们不想实际跟踪它。我们返回NO,一切都很好。

#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相关文章