gpt4 book ai didi

ajax - UIWebViewDelegate 不监控 XMLHttpRequest?

转载 作者:行者123 更新时间:2023-12-03 05:56:11 26 4
gpt4 key购买 nike

UIWebViewDelegate 是否不监视使用 XMLHttpRequest 发出的请求?如果是这样,有没有办法监控此类请求?

例如UIWebViewDelegate 没有在 -(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 委托(delegate)方法。在 JavaScript 中,我们可以修改原型(prototype)方法以在创建 AJAX 请求时触发事件。通过我们的 UIWebView 委托(delegate),我们可以捕获这些事件。

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 文件。我建议将其存储在静态变量中。我习惯使用+initialize。

static NSString *JSHandler;

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

接下来,我们希望在页面加载完成之前注入(inject)此 JavaScript,以便我们可以接收所有事件。

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

最后,我们要捕获该事件。

由于 URL 方案已制定,我们不想实际遵循它。我们返回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 - UIWebViewDelegate 不监控 XMLHttpRequest?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5353278/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com