ios开发--网页中调用JS与JS注入
先将网页弄到iOS项目中:
网页内容如下, 仅供测试:
- <html>
- <head>
- <meta xmlns="http://www.w3.org/1999/xhtml" http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>这是一个示例html文件</title>
- <script Type='text/javascript'>
- function clickme() {
- alert('点击按钮了!');
- }
- </script>
- </head>
- <body>
- <h1>OC与JS互动</h1>
- <h2>blog.csdn.net/xn4545945</h2>
- <!-- 自定义协议与OC进行交互 -->
- <a href="neng://loadUrl/blog.csdn.net">点击一下, 链接调用OC函数</a>
- <br/>
- <br/>
- <a href="http://m.baidu.com">js注入, 到baidu页面上实验</a>
- </body>
- </html>
一、在OC中调用JS
最重要的方法:stringByEvaluatingJavaScriptFromString
直接上代码,说明见注释:
- /**===========================OC 中调用 JS====================================*/
- - (void)webViewDidFinishLoad:(UIWebView *)webView {
- //1.OC中调用JS的文档对象. (先拼出文档对象的属性) 可以在浏览器控制台输入来进行测试
- NSLog(@"%@", [self.webView stringByEvaluatingJavaScriptFromString:@"document.title"]);
- //2.OC中调用JS的方法
- [self.webView stringByEvaluatingJavaScriptFromString:@"clickme()"];
- }
二、用超链接来调用OC中方法
步骤:
代码如下:
- /**=========================== webView链接 中调用 OC===============================*/
- /**webView的代理方法:加载页面有关. 当直接返回为NO时,会调用JS方法
- 其中request参数与发送请求有关*/
- - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
- NSLog(@"%@", request.URL.absoluteString); //可以直接拿到发送请求的网址
- NSString *urlStr = request.URL.absoluteString;
- // 格式 neng://loadUrl/blog.csdn.net 协议/方法/网址
- //判断链接中的协议头,如果是neng://, 则进行相关操作
- if ([urlStr hasPrefix:@"neng://"]) {
- //拿到除去协议头的后部
- NSString *urlContent = [urlStr substringFromIndex:[@"neng://" length]];
- NSLog(@"%@", urlContent);
- //用/来拆分字符串
- NSArray *urls = [urlContent componentsSeparatedByString:@"/"];
- NSLog(@"拆分的结果为:%@", urls);
- //取出方法名
- if (urls.count != 2) {
- return NO;
- }
- NSString *funName = [NSString stringWithFormat:@"%@:", urls[0]]; //带参数的方法,加冒号
- SEL callFun = NSSelectorFromString(funName);
- //取消警告
- # pragma clang diagnostic push
- # pragma clang diagnostic ignored "-Warc-performSelector-leaks"
- [self performSelector:callFun withObject:urls[1]]; //将blog.csdn.net作为参数传入
- # pragma clang diagnostic pop
- NSLog(@"方法名为%@, 传入参数为%@", funName, urls[1]);
- return NO;
- }
- return YES;
- }
- - (void)loadUrl:(NSString *)urlStr {
- NSLog(@"接收到参数: %@", urlStr);
- //跳转到指定的URL--->urlStr
- NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://%@", urlStr]];
- NSURLRequest *request = [NSURLRequest requestWithURL:url];
- [self.webView loadRequest:request];
- }
三、JS实现注入
JS是操作网页的利器,利用好JS才能真正在应用中随心所欲的操作网页。
核心方法:stringByEvaluatingJavaScriptFromString(与第一个相同,这个是在iOS中操作JS最重要方法)
代码如下:
- /**===========================JS 注入====================================*/
- - (void)jsClick {
- [self.webView stringByEvaluatingJavaScriptFromString:@"var script = document.createElement('script');"
- "script.type = 'text/javascript';"
- "script.text = \"function myFunction() { " //定义myFunction方法
- "var field = document.getElementsByName('word')[0];"
- "field.value='WWDC2014';"
- "document.forms[0].submit();"
- "}\";"
- "document.getElementsByTagName('head')[0].appendChild(script);"]; //添加到head标签中
- [self.webView stringByEvaluatingJavaScriptFromString:@"myFunction();"];
- }
附上例子源码:http://download.csdn.net/detail/xn4545945/7584575
ios开发--网页中调用JS与JS注入的更多相关文章
- 【iOS】网页中调用JS与JS注入
非常多应用为了节约成本,做出同一时候在Android与iOS上都能使用的界面,这时就要使用WebView来做.Android和IOS上都有WebView,做起来非常省事.当然这时就要考虑怎样在Andr ...
- js网页中调用本地应用程序
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta http-equiv="Con ...
- bug日记之---------js中调用另一个js中的有ajax的方法, 返回值为undefind
今天做一个OCR授权的需求, 需要开发一个OCR弹框, 让用户选择是否授权给第三方识别公司(旷世科技)保存和识别用户个人信息, 照片等. 其中用到了在一个js的方法中调用另外一个js的方法, 其中有一 ...
- Js文件函数中调用另一个Js文件函数的方法
在项目中Js文件需要完成某一功能,但这一功能的大部分代码在另外一个Js文件已经完成,只需要调用这个文件实现功能.那么如何调用:一个Js文件函数中调用另一个Js文件函数的方法? (直接代码说明) 示例d ...
- iOS开发 Xcode8中遇到的问题及改动
iOS开发 Xcode8中遇到的问题及改动 新版本发布总会有很多坑,也会有很多改动. 一个一个填吧... 一.遇到的问题 1.权限以及相关设置 iOS10系统下调用系统相册.相机功能,或者苹果健康 ...
- iOS开发——基础篇——iOS开发 Xcode8中遇到的问题及改动
iOS开发 Xcode8中遇到的问题及改动 新版本发布总会有很多坑,也会有很多改动. 一个一个填吧... 一.遇到的问题 1.权限以及相关设置 iOS10系统下调用系统相册.相机功能,或者苹果健康 ...
- iOS:在OC中调用JS脚本
示例一:在webView中调用js脚本进行搜索 1.首先导入JavaScriptCore.framework这个框架 2.创建webView.设置代理.请求手机端百度 #import "Vi ...
- iOS开发:JavaScriptCore.framework的简单使用--JS与OC的交互篇
iOS7之后苹果为众猿推出了JavaScriptCore.framework这个框架,这个框架为大家在与JS交互上提供了很大帮助,可以在html界面上调用OC方法并传参,也可以在OC上调用JS方法并传 ...
- 如何在网页中调用百度地图api
我想在木有提供地图接口的年代,前端工程师门要么只写上企业的具体地址,要么就是用一张标有自己位置的地图图片.但是现在不一样啦!为了增强用户体验,谷歌,甚至百度都很开放了,你可以在他们的网站上找到地图接口 ...
随机推荐
- NodeJS安全设计:好吃的草莓味糖果,只给好朋友小红
上一篇文章中,我们已经建立了一个有缓冲机制的文件服务器,能给客户端响应附件类型的文件,其实,就爱莲(iLinkIT)而言,NodeJS的模块做到这样也就已经可以了,因为使用的场景就是电脑和手机之间,与 ...
- Tomcat遇到的问题The Tomcat server configuration at ServersTomcat v5.5 Server at localhost-config is missing. Check..
一.解决方法 删除Servers视图,重新创建一个即可.
- 关于remote访问中的flex端配置问题
刚刚开始使用blazeds可能会有个疑问.tomcat服务器是必须配置的吗?如果前台后台分开,怎么开发. 其实服务器不是必须配置的,配置了那个服务器,就会在“附加编译参数”加入这样一句: -servi ...
- class不想被复制的两个做法
1,当一个class不想被复制的时候,可以将copy构造函数和copy assignment操作符声明为private.(只声明不定义,因此可以不指定函数参数) 2,或者,继承一个专门为了阻止copy ...
- 动态linq表达式新方法,Dynamic LINQ Extension Method
Remember those old posts on Dynamic LINQ? You are probably aware that Microsoft has made its impleme ...
- OpenCV3添加滑动条和鼠标事件到图形界面
鼠标事件和滑动条控制在计算机视觉和OpenCV中非常有用,使用这些控件,用户可以直接与图形界面交互,改变输入图像或者变量的属性值. /* In this section, we are going t ...
- CSS3 弹性盒布局模型(转)
简介 引入弹性盒布局模型的目的是提供一种更加有效的方式来对一个容器中的条目进行排列. 对齐和分配空白空间.即便容器中条目的尺寸未知或是动态变化的,弹性盒布局模型也能正常的工作.在该布局模型中,容器会根 ...
- ES6学习笔记(一)
1.let命令 基本用法 ES6新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. { let a = 10; var b = 1; } a / ...
- Discuz x2.5 单页制作的教程
首先,单页包括该单页的php文件和该单页的模板(.htm)文件,比如:host.php.host.htm 单页的php文件内容如下: <?php require './source/class/ ...
- 《C和指针》读书笔记——第五章 操作符和表达式
1.当/操作符的两个操作数都是整数时,它执行整除运算:其他都是执行浮点数除法. 2.逻辑移位:左边移入的位用0填充: 算数移位:左边移入的位用符号位填充: 3.位置1 :value |= 1<& ...