当前位置: 首页 > 面试题库 >

UIWebViewDelegate不监视XMLHttpRequest吗?

梁宪
2023-03-14
问题内容

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委托方法。在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;
}

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



 类似资料:
  • 我使用pm2已经有一段时间了。最近,我需要向我的Express4项目添加一个名为“ActionLog”的自定义日志目录。因为它是一个用日志文件更新的目录,我不希望pm2在日志文件更改时重新启动应用程序,所以我希望pm2忽略查看该目录。将pm2更新到最新后,下面是我使用的命令: 我在pm2日志中得到以下错误流: https://github.com/unitech/pm2/issues/1288 h

  • XMLHttpRequest对象是AJAX的关键。 自Internet Explorer 5.5于2000年7月发布以来,它一直可用,但直到2005年的AJAX和Web 2.0开始流行才被完全发现。 XMLHttpRequest(XHR)是一种API,可以被JavaScript,JScript,VBScript和其他Web浏览器脚本语言用于使用HTTP在Web服务器之间传输和操作XML数据,在网页

  • 这一节我们编写一个监视器:EventLogMonitor ,也就是用来接收事件的程序,用来代替 netcat 。EventLogMonitor 做下面事情: 接收 LogEventBroadcaster 广播的 UDP DatagramPacket 解码 LogEvent 消息 输出 LogEvent 消息 和之前一样,将实现自定义 ChannelHandler 的逻辑。图13.4描述了LogEv

  • 我想我发出的是同样的命令。。。 它从npx运行服务器 从package.json,它运行服务器,但不监视(不响应文件更改): 有什么想法吗?

  • 通过Android设备监视器我找不到任何文件在我的仿真器Android 7牛轧糖。 即使在选择设备后,也会显示空文件资源管理器点击。 只有通过 请通过Android设备监视器访问指南。 操作系统:Ubuntu 16.04 Android Studio:2.2。2. Android设备监视器:25.2。2.

  • 类应该有一个名为的实例方法,它应该返回特定监视器上设置的缩放因子。在这里(单击“Monitor”后)记录了它:https://help.eclipse.org/2021-03/index.jsp?topic=/org.eclipse.platform.doc.isv/reference/api/org/eclipse/swt/widgets/package-summary.html