HTML5   发布时间:2022-04-27  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ios – 如何从UIWebView中的最终表单步骤获取/处理ajax响应?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个混合应用程序,它使用UIWebView从服务器加载ajax /多步骤表单.每个步骤都向服务器发送一个ajax请求,并根据之前的步骤输入从服务器接收适当的响应.在最后一步,我希望能够处理响应并在我的应用程序中使用该信息来处理各种事情.使用 Swift,实现这一目标的最佳方法是什么?我很明显可以在使用NSURLCache加载页面时获得初始响应,但我似乎无法弄清楚如何获取在ajax步骤之间收到的响应.有任何想法吗?

解决方法

由于您可以将自己的 Javascript注入UIWebView网页,因此可以在初始页面加载后为Ajax调用引入填充层.

在这个填充程序中,您可以加载一个组成的URL,您可以根据Ajax调用在UIWebView委托中检测该URL.当委托看到假URL时,您记录Ajax调用,但返回不应该发生加载.你shim然后调用原始的Ajax代码,所以一切正常.

因此,虽然您无法检测到Ajax调用,但您可以检测到URL请求.

以下答案似乎只有你需要的:UIWebViewDelegate not monitoring XMLHttpRequest?

**更新**

我从上面的链接获取代码并将其扩展为也检测响应.此更新的代码请求在“//”之后加载包含readyState和http状态的虚假URL.它在每个准备好的状态变化时执行此操作

因此,当发出Ajax请求时,您将在UIWebView委托中看到以下请求:

1)加载形式为mpAjaxHandler:// URL的URL的请求

2)在Ajax send()之后的每个状态更改中,请求加载mpAjaxHandlerDone形式的URL:// readyState:httpstatus / URL

我想你正在寻找当readyState达到4时,HTTP状态为200才能成功.

要激活它,请在主页完成加载到UIWebView中时加载下面的javascript,并查看您的委托是否触发请求和响应.

var s_ajaxListener = new Object();
s_ajaxListener.tempOpen = XMLHttpRequest.prototype.open;
s_ajaxListener.tempSend = XMLHttpRequest.prototype.send;
s_ajaxListener.callback = function () {
    console.log('mpAjaxHandler://' + this.url);
    window.location='mpAjaxHandler://' + this.url;
};
s_ajaxListener.callbackDone = function (state,status) {
    console.log('mpAjaxHandlerDone://' + state + ':' + status + '/' + this.url);
    window.location='mpAjaxHandlerDone://' + state + ':' + status + '/' + this.url;
};

// Added this function to catch the readyState changes and request
// fake page loads.
function override_onreadystatechange(){
  s_ajaxListener.callbackDone(this.readyState);
  this.original_onreadystatechange();
}

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

  // Added this to intercept Ajax responses for a given send().
  this.original_onreadystatechange = this.onreadystatechange;
  this.onreadystatechange = override_onreadystatechange;
}

我已经在浏览器中尝试了这个,将代码粘贴到此W3Schools演示中的loadDoc()方法的顶部并查看javascript控制台. http://www.w3schools.com/ajax/tryit.asp?filename=tryajax_first.如果你首先尝试这个注释掉两个window.location =行.

希望这会有所帮助或为您提供一个开始.

大佬总结

以上是大佬教程为你收集整理的ios – 如何从UIWebView中的最终表单步骤获取/处理ajax响应?全部内容,希望文章能够帮你解决ios – 如何从UIWebView中的最终表单步骤获取/处理ajax响应?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: