美文网首页
WKWebview与JavaScript 交互(二)监听远程网页

WKWebview与JavaScript 交互(二)监听远程网页

作者: Gavin_盖文 | 来源:发表于2018-08-03 10:44 被阅读0次

    引言

    监听网页的按钮的点击事件,并且网页不是我们招呼一声对方就能改的。那么继续。

    正文

    1.WKUserScript

    先介绍WebKit框架一个类WKUserScript:

    核心方法,传入JS代码字符串,返回给我们一个WKUserScript对象。

    /*! @abstract Returns an initialized user script that can be added to a @link WKUserContentController @/link.
     @param source The script source.
     @param injectionTime When the script should be injected.
     @param forMainFrameOnly Whether the script should be injected into all frames or just the main frame.
     */
    - (instancetype)initWithSource:(NSString *)source injectionTime:(WKUserScriptInjectionTime)injectionTime forMainFrameOnly:(BOOL)forMainFrameOnly;
    

    WKUserScriptInjectionTime枚举

    // 两个枚举值得解释
    
    // WKUserScriptInjectionTimeAtDocumentStart Description: Inject the script after the document element is created, but before any other content is loaded.
    
    // WKUserScriptInjectionTimeAtDocumentEnd Description: Inject the script after the document finishes loading, but before other subresources finish loading.
    
    typedef NS_ENUM(NSInteger, WKUserScriptInjectionTime) {
        WKUserScriptInjectionTimeAtDocumentStart,
        WKUserScriptInjectionTimeAtDocumentEnd
    } API_AVAILABLE(macosx(10.10), ios(8.0));
    

    它的功能是可以往webview加载的网页注入JS代码。那么我们的问题有望解决了。我们就把我们需要的核心代码window.webkit.messageHandlers.(messagename).postMessage注入到我们想监听的网页。

    2.找出网页按钮的id

    这里我们用某知名搜索网站的按钮做测试。
    我们找出网页按钮的id,在通过document.getElementById("buttonId");获取控件对象。
    在给控件添加监听button.addEventListener('click',addFun,false);

    注意:
    (1)有的控件没有id属性,可以选择class属性获取getElementsByClassName。遍历getElementsByClassName返回的集合确定我们需要的控件。
    (2)有些网页pc端和手机端的域名不一样。所以找网页控件的id或class的时候,同一个网站pc网页和手机网页源码中id或class属性不一致的情况。

    3.准备注入的JS代码

    function fun() {
        window.webkit.messageHandlers.%@.postMessage(null);
    }
    (function(){
        var btn = document.getElementById("%@");
        btn.addEventListener('click',fun,false);
    }());
    

    在OC中,上面代码以字符串的形式传给WKUserScript

    NSString *scriptStr = [NSString stringWithFormat:@"function fun(){window.webkit.messageHandlers.%@.postMessage(null);}(function(){var btn=document.getElementById(\"%@\");btn.addEventListener('click',fun,false);}());", baiduMessage, baiduButtonId];
    WKUserScript *userScript = [[WKUserScript alloc] initWithSource:scriptStr injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
    [_userContentController addUserScript:userScript];
    

    4.执行结果

    点击网页按钮我们的控制台会打印:


    执行结果

    总结

    到此我们监听网页按钮点击事件的目的可以实现了,(想看交互本地html的可以去看第一张交互本地html链接)。有其他方望分享出来一起学习。

    监听了哪个网页的按钮呢?建议去看demo工程,到我的Github下载。

    相关文章

      网友评论

          本文标题:WKWebview与JavaScript 交互(二)监听远程网页

          本文链接:https://www.haomeiwen.com/subject/ardsvftx.html