• Hybrid--WebView中使用Ajax


    Hybrid框架下的app,使用的Ajax。须要注意的是UIWebViewDelegate不会监測到Ajax的request。也就是再运行Ajax代码时。shouldStartLoadWithReuqest等方法并不会被调用。

    其解决方法须要Javascript和navtive code一起来做,其基本原理可參考这片文章,其流程是在

    Javascript handler中每创建Ajax的请求时。须要将这段js存在ajax_handler.js放在app中

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


    当中的"mpAjaxHandler"为自己定义的Scheme,用于差别request是否是由Ajax发出的。

    在App端

    获得js

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

    加载页面后,运行这段js

    - (void)webViewDidStartLoad:(UIWebView *)webView {
        [webView stringByEvaluatingJavaScriptFromString:JSHandler];
    }
    拦截住Request,不让webview的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;
    }


    Ajax相关知识

    Ajax作为异步Javascript广泛应用在web站点上。

    以下是一个来自于w3school的简单使用Ajax的样例:

    <html>
    <head>
    <script type="text/javascript">
    function loadXMLDoc()
    {
    var xmlhttp;
    var txt,x,i;
    if (window.XMLHttpRequest)
      {// code for IE7+, Firefox, Chrome, Opera, Safari
      xmlhttp=new XMLHttpRequest();
      }
    else
      {// code for IE6, IE5
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
      }
    xmlhttp.onreadystatechange=function()
      {
      if (xmlhttp.readyState==4 && xmlhttp.status==200)
        {
        xmlDoc=xmlhttp.responseXML;
        txt="";
        x=xmlDoc.getElementsByTagName("title");
        for (i=0;i<x.length;i++)
          {
          txt=txt + x[i].childNodes[0].nodeValue + "<br />";
          }
        document.getElementById("myDiv").innerHTML=txt;
        }
      }
    xmlhttp.open("GET","http://www.w3school.com.cn/example/xmle/books.xml",true);
    xmlhttp.send();
    }
    </script>
    </head>
    
    <body>
    
    <h2>My Book Collection:</h2>
    <div id="myDiv"></div>
    <button type="button" onclick="loadXMLDoc()">GET Book List</button>
     
    </body>
    </html>

    点击button。通过Ajax的方式获得书单。部分内容參考于stackoverflow

  • 相关阅读:
    Lambda+Stream替换集合中每个对象的指定字段值
    bootstrap table的属性sidePagination设置不当导致数据不显示
    fullcalendar从后台获取events报Uncaught TypeError: callback is not a function
    com.sun.mail.smtp.SMTPSendFailedException: 550 Invalid User
    js中复制功能的实现
    List列表排序报空指针异常
    springboot+tomcat不同环境采用不同配置文件
    装饰模式
    Ambari和大数据集群部署(精华)
    Ambari安装和汉化(转)
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/7227338.html
Copyright © 2020-2023  润新知