设为首页 加入收藏

TOP

【Swift】WKWebView与JS的交互使用(三)
2019-08-15 00:11:51 】 浏览:542
Tags:Swift WKWebView 交互 使用
一个参数,如果有多个输入框,需要将多个输入框中的值通过某种方式拼接成一个字符串回传,js接收到之后再做处理
//参数 prompt 为 prompt(<message>, <defaultValue>);中的<message> //参数defaultText 为 prompt(<message>, <defaultValue>);中的 <defaultValue> func webView(_ webView: WKWebView, runjava scriptTextInputPanelWithPrompt prompt: String, defaultText: String?, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (String?) -> Void) { let alertViewController = UIAlertController(title: prompt, message: "", preferredStyle: UIAlertController.Style.alert) alertViewController.addTextField { (textField) in textField.text = defaultText } alertViewController.addAction(UIAlertAction(title: "完成", style: UIAlertAction.Style.default, handler: { (alertAction) in completionHandler(alertViewController.textFields![0].text) })) self.present(alertViewController, animated: true, completion: nil) }

  4、获取网页中节点的数据 

//网页加载完成
-(void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{
    //设置JS
    NSString *js = @"document.getElementsByTagName('h1')[0].innerText";
    //执行JS
    [webView eva luatejava script:js completionHandler:^(id _Nullable response, NSError * _Nullable error) {
        NSLog(@"value: %@ error: %@", response, error);
        
    }];
}

  5、通过注入JS修改节点的内容

let js = "document.getElementsByTagName('h2')[0].innerText = '这是一个iOS写入的方法'";
//将js注入到网页中

  6、js获取DOM节点的几种方式

document.getElementById();//id名,
document.getElementsByTagName();//标签名
document.getElementsByClassName();//类名
document.getElementsByName();//name属性值,一般不用
document.querySelector();//css选择符模式,返回与该模式匹配的第一个元素,结果为一个元素;如果没找到匹配的元素,则返回null
document.querySelectorAll()//css选择符模式,返回与该模式匹配的所有元素,结果为一个类数组

 六、java scriptCore

  java scriptCore 这个库是 Apple 在 iOS 7 之后加入到标准库的,它对 iOS Native 与 JS 做交互调用产生了划时代的影响。

   java scriptCore 大体是由 4 个类以及 1 个协议组成的:

  • JSContext 是 JS 执行上下文,你可以把它理解为 JS 运行的环境。

  • JSValue 是对 java script 值的引用,任何 JS 中的值都可以被包装为一个 JSValue。

  • JSManagedValue 是对 JSValue 的包装,加入了“conditional retain”。

  • JSVirtualMachine 表示 java script 执行的独立环境。

  还有 JSExport 协议:

实现将原生类及其实例方法,类方法和属性导出为 java script 代码的协议。

  这里的 JSContext,JSValue,JSManagedValue 相对比较好理解,下面我们把 JSVirtualMachine 单拎出来说明一下:

  JSVirtualMachine 的用法和其与 JSContext 的关系

  JSVirtualMachine 实例表示用于 java script 执行的独立环境。 您使用此类有两个主要目的:支持并发 java script 执行,并管理 java script 和 Objective-C 或 Swift 之间桥接的对象的内存。

  关于 JSVirtualMachine 的使用,一般情况下我们不用手动去创建 JSVirtualMachine。因为当我们获取 JSContext 时,获取到的 JSContext 从属于一个 JSVirtualMachine。

  每个 java script 上下文(JSContext 对象)都属于一个 JSVirtualMachine。 每个 JSVirtualMachine 可以包含多个上下文,允许在上下文之间传递值(JSValue 对象)。 但是,每个 JSVirtualMachine 是不同的,即我们不能将一个 JSVirtualMachine 中创建的值传递到另一个 JSVirtualMachine 中的上下文。

  java scriptCore API 是线程安全的 —— 例如,我们可以从任何线程创建 JSValue 对象或运行 JS 脚本 - 但是,尝试使用相同 JSVirtualMachine 的所有其他线程将被阻塞。 要在多个线程上同时(并发)运行 java script 脚本,请为每个线程使用单独的 JSVirtualMachine 实例。

七、案例源码:

class NAHomeViewController : UIViewController,WKNavigationDelegate,WKScriptMessageHandler,WKUIDelegate,UINavigationControllerDelegate {
    
    var webView : WKWebView?
    var content : JSContext?
    var userContentController : WKUserContentController?
    override func viewDidLoad() {
        super.viewDidLoad()
        self.navigationItem.title = "
首页 上一页 1 2 3 4 5 下一页 尾页 3/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇zap+日志分级分文件+按时间切割日.. 下一篇ubuntu 下 go 语言调试器 dlv 的..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目