JS和webView的交互
JSContext的交互方式最为简单快捷:
1.申明一个JSContext对象
self.jsRunner = [[JSContext alloc] init];
2.在原生中定义申明一个JS函数方法(JS代码函数中可以使用)
self.jsRunner[@"action1"] = ^(int value){
printf("啦啦啦\n");
};
self.jsRunner[@"action2"] = ^(JSValue *value){
NSLog(@"%@",value);
};
3.通过执行JS代码的方式执行自己定义的函数(热更新通过加载自定义好的JS函数专门来转移实现原生消息发送相关函数,而后通过下载JS文件然后执行预定的代码尝试或达到替代原生代码过程)
[self.jsRunner evaluateScript:@"action1(10);"];
[self.jsRunner evaluateScript:@"action2([1,2,3,\'你好哦\']);function testAction(){return 99;};"];
JSValue *result = [self.jsRunner evaluateScript:@"testAction();"];
NSLog(@"返回的结果:%@",result);
在UIWebView中获得JSContext,在代理OnFinshload函数中通过
self.jsRunner =[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
获得
在WKWebView中
You cannot obtain the context, because layout and javascript is handled on another process. Instead, add scripts to your webview configuration, and set your view controller (or another object) as the script message handler. - (void)setupWKWebView
{
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
// 设置偏好设置
config.preferences = [[WKPreferences alloc] init];
// 默认为0
config.preferences.minimumFontSize = ;
// 默认认为YES
config.preferences.javaScriptEnabled = YES;
// 在iOS上默认为NO,表示不能自动通过窗口打开
config.preferences.javaScriptCanOpenWindowsAutomatically = NO;
config.processPool = [[WKProcessPool alloc] init];
config.userContentController = [[WKUserContentController alloc] init];
//注意在这里注入JS对象名称 "JSObjec"
[config.userContentController addScriptMessageHandler:self name:@"JSObjec"]; self.showWebView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:config];
self.showWebView.navigationDelegate = self;
[self.view addSubview:self.showWebView]; NSURL *path = [NSURL fileURLWithPath:网页文件路径];
[self.showWebView loadRequest:[NSURLRequest requestWithURL:path]];
} Now, send messages from JavaScript like so: //在JS函数代码中调用
//这里的内容差不多全部一样 只是调用的方法有区别 一定要注意区分
//这个是用UIWebView时调用的方法 JSObjec.getCall(callInfo);
//下面是用WKWebView调用的方法
window.webkit.messageHandlers.JSObjec.postMessage(callInfo);
//当执行到上述语句是将回调下面这个函数
Your script message handler will receive a callback: - (void)userContentController:(WKUserContentController *)userContentController
didReceiveScriptMessage:(WKScriptMessage *)message
{
NSLog(@"%@", message.body);
//此处body可以放回调给WebView的js端回调函数名称参数个数类型描述等内容,通过调用执行该JS函数将操作结果返回给Web端
}
普通的实现方式:
通过WebView调用页面中的JS函数,获得返回值
通过代理链接截获,执行原生代码
JS和webView的交互的更多相关文章
- js与webview 常用交互代码
常用js交互 css常用参数::: 是否允许用户选择元素的内容,选择值包括: auto:用户可以选择元素内的内容 none:用户不能选择任何内容 text:用户只能选择元素内的 ...
- WebView与JS的几种交互
http://www.jianshu.com/p/0042d8eb67c0 最近整理了一下原生与H5之间的交互方式,简单的做个总结.OC端与JS的交互,大致有这几种:拦截协议.JavaScriptCo ...
- (转载)JS与WebView交互存在的一些问题
JS与WebView交互存在的一些问题 作者 隔壁的李小宝 关注 2015.06.09 19:30 字数 2896 阅读 11117评论 3喜欢 35 一.背景概述 2013年Android平台暴露出 ...
- Android混合开发之WebViewJavascriptBridge实现JS与java安全交互
前言: 为了加快开发效率,目前公司一些功能使用H5开发,这里难免会用到Js与Java函数互相调用的问题,这个Android是提供了原生支持的,不过存在安全隐患,今天我们来学习一种安全方式来满足Js与j ...
- iOS中JS 与OC的交互(JavaScriptCore.framework)
iOS中实现js与oc的交互,目前网上也有不少流行的开源解决方案: 如:react native 当然一些轻量级的任务使用系统提供的UIWebView 以及JavaScriptCore.framewo ...
- iOS开发:JavaScriptCore.framework的简单使用--JS与OC的交互篇
iOS7之后苹果为众猿推出了JavaScriptCore.framework这个框架,这个框架为大家在与JS交互上提供了很大帮助,可以在html界面上调用OC方法并传参,也可以在OC上调用JS方法并传 ...
- js 与 ios Android交互
一.android 交互 1.js调用webview 在android API Level 17及以上的版本中,就会出现js调用不了android的代码,这是版本兼容的问题,需要在调用的方法上面加一个 ...
- iOS中js与objective-c的交互(转)
因为在iOS中没有WebKit.Framework这个库的,所以也就没有 windowScriptObject对象方法了.要是有这个的方法的话 就方便多了,(ps:MacOS中有貌似) 现在我们利用其 ...
- 与webView进行交互,webView小记
本文转载至 http://www.verydemo.com/demo_c101_i46895.html 一.与webView进行交互,调用web页面中的需要传参的函数时,参数需要带单引号,或者双引号( ...
随机推荐
- switch和continue的关系
突然想到 我们用 switch都是用 break return等关键字来配合,有没有一种情况下是用continue呢?而且如果真的出现了continue,结果是什么样的呢?
- 获取预制和获取gameObject
using UnityEngine; using System.Collections; using System.Collections.Generic; using UnityEditor; pu ...
- 分布式计算开源框架Hadoop入门实践
目录(?)[+] Author :岑文初 Email: wenchu.cenwc@alibaba-inc.com msn: cenwenchu_79@hotmail.com blog: http:// ...
- 从PC端(Ubuntu)挂载nfs网络文件系统ARM9+Linux板子上
挂载概念 在windows操作系统中,挂载通常是指给磁盘分区(包括被虚拟出来的磁盘分区)分配一个盘符. 在linux操作系统中,它指将一个设备(通常是存储设备)挂接到一个已存在的目录上.(这个目录可以 ...
- 【LeetCode OJ】Longest Substring Without Repeating Characters
题目链接:https://leetcode.com/problems/longest-substring-without-repeating-characters/ 题目:Given a string ...
- 如何在浏览器中简单模拟微信浏览器(仅限于通过User Agent进行判断的页面)
模拟微信浏览器: .打开360极速 .F12开发者工具 .开发者模式左上方有一个手机样子的图标 点击进入 设备模式‘ .将UA选项中的字符串替换成: Mozilla/ 备注: 替换的字符串是微信浏览器 ...
- SqlServer 连接远程服务器数据库 实现跨服务器联合查询
第一种: exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 ' exec sp_addlinkedsrvlogin 'IT ...
- 【十大算法实现之KNN】KNN算法实例(含测试数据和源码)
KNN算法基本的思路是比较好理解的,今天根据它的特点写了一个实例,我会把所有的数据和代码都写在下面供大家参考,不足之处,请指正.谢谢! update:工程代码全部在本页面中,测试数据已丢失,建议去UC ...
- 【Spring Boot&&Spring Cloud系列】Spring Boot配置文件
很多的参数可以配置在application.properties或application.yml文件中 一.BANNER banner.charset=UTF-8 # Banner file enco ...
- css - 文字元素等的美化效果代码汇总(更新中...)
投影的设置 -webkit-box-reflect: below 0px -webkit-gradient(linear, left top, left bottom, from(transparen ...