UIWebView 获取当前的javascript上下文,并js,oc互调

OC调用UIWebView 中的js,网上例子很多,最常用的是UIWebView自带的一个方法;

- (NSString
*)stringByEvaluatingJavaScriptFromString:(NSString
*)script;

UIWebView 中的js 掉用本地的oc方法;

通过UIWebView开始加载请求的代理方法中,去解析OC跟js约定好的协议(比如约定协议objtc://)

比如<a href="objtc://function">调用oc</a>

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest
*)request navigationType:(UIWebViewNavigationType)navigationType{

  NSString *urlString = [[request URL]
absoluteString];

  if( [urlString hasPrefix:@"objtc://"] ){

    //调用oc本地方法

    NSLog(@"....");

  }

}

第二种方法,比如OC类A中有个UIWebView,UIWebView的js想调用OC类A中的方法,

对于JSContext,JSValue跟OC对象的相互转换,获取js的window文档树,或者其他交互功能,百度很多

1)新建一个协议继承JSExport

#import
<JavaScriptCore/JavaScriptCore.h>

#import "objc/runtime.h"

@protocol LLCExport <JSExport>

//UIWebView中的js,就可以通过appPushPageTitle(url,title)调用此协议的这个方法

-(void)appPushPage:(NSString*)url title:(NSString*)title;

@end

2)获取类A 的当前UIWebView中的上下文对象JSContext,

self.jsc = [self.webViewvalueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

3)类A 实现 LLCExport中的方法

-(void)appPushPage:(NSString*)url title:(NSString*)title{

UIViewController *pvc
= [[UIViewController alloc] init];

pvc.title = title;

pvc.strUrl = url;

[self.navigationController pushViewController:pvc animated:YES];

}

4)当UIWebView加载完毕后,给类A动态加自定义的LLCExport协议,然后把类A对象赋值给JSContext中自定义的“APP_NATIVE”对象

- (void)webViewDidFinishLoad:(UIWebView
*)webView{

  class_addProtocol(self.class,@protocol(LLCExport));

  self.jsc["APP_NATIVE"]
= self;

}

5)js里面就可以通过window.APP_NATIVE.appPushPageTitle("http://www.baidu.com","百度");

来调用OC类A中的-(void)appPushPage:(NSString*)url
title:(NSString*)title;这个方法了

时间: 2024-10-14 06:52:36

UIWebView 获取当前的javascript上下文,并js,oc互调的相关文章

javaScript系列:js中获取时间new Date()详细介绍

var myDate = new Date();myDate.getYear(); //获取当前年份(2位)myDate.getFullYear(); //获取完整的年份(4位,1970-????)myDate.getMonth(); //获取当前月份(0-11,0代表1月)myDate.getDate(); //获取当前日(1-31)myDate.getDay(); //获取当前星期X(0-6,0代表星期天) 何问起 hovertree.commyDate.getTime(); //获取当前时

创业笔记-Node.js入门之JavaScript与Node.js

JavaScript与Node.js JavaScript与你 抛开技术,我们先来聊聊你以及你和JavaScript的关系.本章的主要目的是想让你看看,对你而言是否有必要继续阅读后续章节的内容. 如果你和我一样,那么你很早就开始利用HTML进行“开发”,正因如此,你接触到了这个叫JavaScript有趣的东西,而对于JavaScript,你只会基本的操作——为web页面添加交互. 而你真正想要的是“干货”,你想要知道如何构建复杂的web站点 —— 于是,你学习了一种诸如PHP.Ruby.Java

javascript中外部js文件取得自身完整路径得办法

原文:javascript中外部js文件取得自身完整路径得办法 有时候我们需要引入一个外部js文件,这个js文件又需要用到自己的路径或者是所在的目录,别问怎么又这么变态的需求,开发做久了各种奇葩需求也就有了! 有人第一时间想到的是location.href,可是哥哥,那个引用页面的路径啊.比如a.html: <html> <script src="/b/c.js"></script> </html> 这样的话我们用location.hre

JavaScript学习10 JS数据类型、强制类型转换和对象属性

JavaScript学习10 JS数据类型.强制类型转换和对象属性 JavaScript数据类型 JavaScript中有五种原始数据类型:Undefined.Null.Boolean.Number以及String. Undefined数据类型的值只有一个:undefined. 在JavaScript中,如果函数没有声明返回值,那么会返回undefined.(后面有实例). 如果typeof后面跟一个未定义的参数,也是返回undefined. Null数据类型的值只有一个:null. null与

UIWebView与javascript交互三通过OC页面来改变html页面上的值

有一件事要说一下哦, <UIWebView与javascript交互一>这篇博客被几个网站给转载了,很开心,但是开心之余有一点觉得要说一下,大家转载别人的文章的时候记得说明一下转载的出处,有两方面的原因,第一就是尊重作者的劳动成果,另一方面,由于博客里有的时候有一些demo,但是转载的人并没有把demo的下载地址给贴出来,给看到博客的同学带来了很大的不便. 接上篇,我们已经实现了通过html按钮来传数据到oc页面,但是没有实现通过oc页面传数据到js页面,并修改html的页面,谈不上真正完全的

JavaScript进阶 九 JS实现本地文件上传至阿里云服务器

JS实现本地文件上传至阿里云服务器 前言 在前面的博客< JavaScript进阶(八)JS实现图片预览并导入服务器功能>(点击查看详情)中,实现了JS将本地图片文件预览并上传至阿里云服务器的操作.这次需要实现将本地打包好的文件上传至阿里云服务器.使用前面的图片文件上传方法无法完成此操作.操作界面如下: 思路 本地与服务端传输文件的格式应该是熟悉的Base64格式.首先需要将本地文件转换为Base64格式,传输至服务端后,在服务端再将Base64格式的文件转换为原始文件. 源码解析 控制器 /

JAVAscript学习笔记 js句柄监听事件 第四节 (原创) 参考js使用表

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>句柄添加监听事件</title> <script type="text/javascript" src="tzy.js"></script> </head> <body>

Javascript教程:js异步编程的4种方法详述(转载)

文章收集转载于(阮一峰的网络日志) 你可能知道,Javascript语言的执行环境是“单线程”(single thread). 所谓“单线程”,就是指一次只能完成一件任务.如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推. 这种模式的好处是实现起来比较简单,执行环境相对单纯:坏处是只要有一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行.常见的浏览器无响应(假死),往往就是因为某一段Javascript代码长时间运行(比如死循环),导致整个页面卡在这个地方

Javascript开发技巧(JS入门、运算符、分支结构、循环结构)

一.Js简介和入门 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>JavaScript简介</title> <!-- [使用JS的三种方式] 1.HTML标签中内嵌JS(不提倡使用): <button onclick="javascript:alert('小碧池!你真点啊!')">有本事点我呀!!!<