利用JS 直接调用执行OC代码,非提取URL
2016-03-12 09:35
549 查看
一:
首先导入JavaScriptCore.framework:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/31/f4752a8be879ca81604386346c45e678)
二.
在需要JS调用OC方法的.m文件中导入头文件
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/31/7954be12c0561e4bfba548dda7307d25)
三.
在OC中进行JS执行环境配置,和指定JS调用的方法的OC代码执行体
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/31/b68822f178525e2e6695c4b8d3d93aaa)
四.
这个利用JavaScriptCore.framework框架,使JS直接调用OC代码的实质是:
在JS中定义好方法,在OC中指定执行体;
JS调用的还是JS的方法,而方法的执行体可以由OC代码中编写;
上次忘记附上html跟js文件了,在此附上,供大家参考:
html:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/31/2e92b53744e7d12ff07709b34827c2f0)
js中定义的方法:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/31/bca1eed36b83ab7776fef3551206de71)
注意点:
1.这是加载本地的html文件时,做的一个demo,至于加载服务器提供的html文件时js调用OC方法,我猜测应该在webView的代理方法
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
里边做判断 是否加载的request中的URL是那个特定的html,如果是就在此方法中执行步骤三的操作;
2.这与不通过URL让JS直接调用OC方法,并不矛盾;
3.注意OC中定义的block代码块是跟js函数中的submit进行绑定,一定不能错;
关于上边提到的注意点1,笔者亲自实践,发现是不可行的,不过通过笔者苦逼的尝试,终于实现了JS直接调用OC本地方法;
在此在此做出补充:
首先,声明笔者项目开发情景是,加载一个重定向的html时调用执行OC的代码;
其次,方法配置步骤三,笔者测试应该放在webView加载完成的
- (void)webViewDidFinishLoad:(UIWebView *)webView{};监听方法中;
然后在配置完成后,通过OC执行JS中被配置过的JS中的脚本来达到调用OC的目的;
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/31/d22928c297c10b2d3bf199d576f48f3b)
可能有点儿绕,不过细细体会一下还是能自圆其说的吧
![](https://oscdn.geek-share.com/Uploads/Images/Content/201707/61c17ed2eb67211a84e137429ac3f7ad.gif)
!!!
特别说明一下,代码中的isLoad是我在
// 监听网页的加载
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request
navigationType:(UIWebViewNavigationType)navigationType;
中通过
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/31/7f8dfc17a276e0011de8c99083a4267e)
拦截到。
网上搜了好久都没有JS直接调用OC(非URL)本地方法特别有用的解决方案,通过自己的实践出不整理出来供大家参考,如果有什么不准确的地方,请大家留言指正,
谢谢。
首先导入JavaScriptCore.framework:
二.
在需要JS调用OC方法的.m文件中导入头文件
三.
在OC中进行JS执行环境配置,和指定JS调用的方法的OC代码执行体
四.
这个利用JavaScriptCore.framework框架,使JS直接调用OC代码的实质是:
在JS中定义好方法,在OC中指定执行体;
JS调用的还是JS的方法,而方法的执行体可以由OC代码中编写;
上次忘记附上html跟js文件了,在此附上,供大家参考:
html:
js中定义的方法:
注意点:
1.这是加载本地的html文件时,做的一个demo,至于加载服务器提供的html文件时js调用OC方法,我猜测应该在webView的代理方法
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
里边做判断 是否加载的request中的URL是那个特定的html,如果是就在此方法中执行步骤三的操作;
2.这与不通过URL让JS直接调用OC方法,并不矛盾;
3.注意OC中定义的block代码块是跟js函数中的submit进行绑定,一定不能错;
关于上边提到的注意点1,笔者亲自实践,发现是不可行的,不过通过笔者苦逼的尝试,终于实现了JS直接调用OC本地方法;
在此在此做出补充:
首先,声明笔者项目开发情景是,加载一个重定向的html时调用执行OC的代码;
其次,方法配置步骤三,笔者测试应该放在webView加载完成的
- (void)webViewDidFinishLoad:(UIWebView *)webView{};监听方法中;
然后在配置完成后,通过OC执行JS中被配置过的JS中的脚本来达到调用OC的目的;
可能有点儿绕,不过细细体会一下还是能自圆其说的吧
![](https://oscdn.geek-share.com/Uploads/Images/Content/201707/61c17ed2eb67211a84e137429ac3f7ad.gif)
!!!
特别说明一下,代码中的isLoad是我在
// 监听网页的加载
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request
navigationType:(UIWebViewNavigationType)navigationType;
中通过
拦截到。
网上搜了好久都没有JS直接调用OC(非URL)本地方法特别有用的解决方案,通过自己的实践出不整理出来供大家参考,如果有什么不准确的地方,请大家留言指正,
谢谢。
相关文章推荐
- web浏览器中的javascript 1
- ExtJS学习(一)Ext自定义类实现
- ExtJS学习(一)Ext自定义类实现
- 史上最短小精悍的javascript编写的俄罗斯方块游戏,仅仅60行代码
- JS在文本框光标处插入文本
- 原生 javaScript 百叶窗 效果的实现及原理介绍
- JavaScript开发者必备的10个sublime的插件
- json-schema-core(liuhailong翻译)
- JavaScript学习(二)——javascript prompt的使用
- 第一个JSP程序
- JS中创建函数的三种方式及区别
- 基于HTML5和JSP实现的图片Ajax上传和预览
- JSP继续学习(完成一个最简单的用户登录界面)
- JavaScript中循环遍历Array与Map的方法小结
- Ajax与JSON的一些总结
- Ajax:拥抱JSON,让XML走开
- JSON详解
- js createElement
- JavaScript高级程序设计(第三版)学习笔记8、9、10章
- JS详细教程(下)