ios开发--网页中调用JS与JS注入

先将网页弄到iOS项目中:

网页内容如下, 仅供测试:

[html] view plain copy

  1. <html>
  2. <head>
  3. <meta xmlns="http://www.w3.org/1999/xhtml" http-equiv="Content-Type" content="text/html; charset=utf-8" />
  4. <title>这是一个示例html文件</title>
  5. <script Type=‘text/javascript‘>
  6. function clickme() {
  7. alert(‘点击按钮了!‘);
  8. }
  9. </script>
  10. </head>
  11. <body>
  12. <h1>OC与JS互动</h1>
  13. <h2>blog.csdn.net/xn4545945</h2>
  14. <!-- 自定义协议与OC进行交互 -->
  15. <a href="neng://loadUrl/blog.csdn.net">点击一下, 链接调用OC函数</a>
  16. <br/>
  17. <br/>
  18. <a href="http://m.baidu.com">js注入, 到baidu页面上实验</a>
  19. </body>
  20. </html>

一、在OC中调用JS

最重要的方法:stringByEvaluatingJavaScriptFromString

直接上代码,说明见注释:

[objc] view plain copy

  1. /**===========================OC 中调用 JS====================================*/
  2. - (void)webViewDidFinishLoad:(UIWebView *)webView {
  3. //1.OC中调用JS的文档对象. (先拼出文档对象的属性) 可以在浏览器控制台输入来进行测试
  4. NSLog(@"%@", [self.webView stringByEvaluatingJavaScriptFromString:@"document.title"]);
  5. //2.OC中调用JS的方法
  6. [self.webView stringByEvaluatingJavaScriptFromString:@"clickme()"];
  7. }

二、用超链接来调用OC中方法

步骤:

*1.设置webView的代理<UIWebViewDelegate>

*2.在代理的方法shouldStartLoadWithRequest:中调用.(该方法与网页的加载有关)

*方法:就是在网页链接中写好自定义协议.然后在OC方法中检查点击的链接中是否有该协议,有则做相关操作.

代码如下:

[objc] view plain copy

  1. /**=========================== webView链接 中调用 OC===============================*/
  2. /**webView的代理方法:加载页面有关. 当直接返回为NO时,会调用JS方法
  3. 其中request参数与发送请求有关*/
  4. - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
  5. NSLog(@"%@", request.URL.absoluteString); //可以直接拿到发送请求的网址
  6. NSString *urlStr = request.URL.absoluteString;
  7. // 格式 neng://loadUrl/blog.csdn.net  协议/方法/网址
  8. //判断链接中的协议头,如果是neng://, 则进行相关操作
  9. if ([urlStr hasPrefix:@"neng://"]) {
  10. //拿到除去协议头的后部
  11. NSString *urlContent = [urlStr substringFromIndex:[@"neng://" length]];
  12. NSLog(@"%@", urlContent);
  13. //用/来拆分字符串
  14. NSArray *urls = [urlContent componentsSeparatedByString:@"/"];
  15. NSLog(@"拆分的结果为:%@", urls);
  16. //取出方法名
  17. if (urls.count != 2) {
  18. return NO;
  19. }
  20. NSString *funName = [NSString stringWithFormat:@"%@:", urls[0]]; //带参数的方法,加冒号
  21. SEL callFun = NSSelectorFromString(funName);
  22. //取消警告
  23. # pragma clang diagnostic push
  24. # pragma clang diagnostic ignored "-Warc-performSelector-leaks"
  25. [self performSelector:callFun withObject:urls[1]]; //将blog.csdn.net作为参数传入
  26. # pragma clang diagnostic pop
  27. NSLog(@"方法名为%@, 传入参数为%@", funName, urls[1]);
  28. return NO;
  29. }
  30. return YES;
  31. }
  32. - (void)loadUrl:(NSString *)urlStr {
  33. NSLog(@"接收到参数: %@", urlStr);
  34. //跳转到指定的URL--->urlStr
  35. NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://%@", urlStr]];
  36. NSURLRequest *request = [NSURLRequest requestWithURL:url];
  37. [self.webView loadRequest:request];
  38. }

三、JS实现注入

JS是操作网页的利器,利用好JS才能真正在应用中随心所欲的操作网页。

核心方法:stringByEvaluatingJavaScriptFromString(与第一个相同,这个是在iOS中操作JS最重要方法)

代码如下:

[objc] view plain copy

  1. /**===========================JS  注入====================================*/
  2. - (void)jsClick {
  3. [self.webView stringByEvaluatingJavaScriptFromString:@"var script = document.createElement(‘script‘);"
  4. "script.type = ‘text/javascript‘;"
  5. "script.text = \"function myFunction() { "   //定义myFunction方法
  6. "var field = document.getElementsByName(‘word‘)[0];"
  7. "field.value=‘WWDC2014‘;"
  8. "document.forms[0].submit();"
  9. "}\";"
  10. "document.getElementsByTagName(‘head‘)[0].appendChild(script);"];  //添加到head标签中
  11. [self.webView stringByEvaluatingJavaScriptFromString:@"myFunction();"];
  12. }

附上例子源码:http://download.csdn.net/detail/xn4545945/7584575

时间: 2024-10-11 05:49:11

ios开发--网页中调用JS与JS注入的相关文章

【iOS】网页中调用JS与JS注入

很多应用为了节约成本,做出同时在Android与iOS上都能使用的界面,这时就要使用WebView来做.Android和IOS上都有WebView,做起来很省事.当然这时就要考虑如何在Android或iOS中实现与网页的交互.对iOS而言,包括如何在网页中调用OC,以及如何在OC中对网页进行操作. 先将网页弄到iOS项目中: 网页内容如下, 仅供测试: <html> <head> <meta xmlns="http://www.w3.org/1999/xhtml&q

js网页中调用本地应用程序

<!DOCTYPE html> <html lang="zh-CN"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Test ActiveXObject</title> <script> function Run(command) { windo

bug日记之---------js中调用另一个js中的有ajax的方法, 返回值为undefind

今天做一个OCR授权的需求, 需要开发一个OCR弹框, 让用户选择是否授权给第三方识别公司(旷世科技)保存和识别用户个人信息, 照片等. 其中用到了在一个js的方法中调用另外一个js的方法, 其中有一点特别的是另外一个js的方法中会进行一个ajax, 会根据ajax返回的结果来进行返回true或者false. 在测试的过程中我发现不管怎么弄, 最后返回的都是undefind. 下面来模拟一下这个场景 上面这个例子中,flag一直都是undefind,ajax已经是同步的情况下依旧返回undefi

&lt;&lt;&lt; 网页中如何利用原生js和jquery储存cookie

javascript当中的cookie机制,使应用达到了真正的全局变量的要求,cookie是浏览器提供的一种机制,它将document 对象的cookie属性提供给JavaScript.可以由JavaScript对其进行控制,而并不是JavaScript本身的性质,由于cookie机制是把信息储存到硬盘,所以他可以用来做全局变量 cookie有关安全性和作用域 1.cookie可能被禁用.当用户非常注重个人隐私保护时,他很可能禁用浏览器的cookie功能:  2.cookie是与浏览器相关的.这

js中调用mangeto的js翻译

第一步: <script type="text/javascript"> Translator.add('英文','<?php echo this->__('目标语言')?>'); </script> 第二步: 在你模块的etc文件夹下创建jstranslator.xml,并添加一下内容 <jstranslator> <validate-select translate="message" module=&

iOS 在object-c 中调用c文件 方法

1,新建c 头文件  lib.h 定义 c 函数 2,新建 c 实现文件,新建模板选中 c File  lib.c 3,oc 中调用,引用 c 头文件 lib.h ok .搞定 iOS 在object-c 中调用c文件 方法,布布扣,bubuko.com

IOS问题汇总:2015-1-9 IOS之NSArray 中调用的方法详解(转)

IOS之NSArray 中调用的方法详解 下面的例子以 NSArray *array = [NSArray arrayWithObjects:@“wendy”,@“andy”,@“tom”,@“jonery”,@“stany”, nil];1.获取数组中总共有多少个对象. -(NSUInteger)count; NSLog(@“%d”,[array count]); 2 2.获取数组中下标对应的元素对象.(下标是从0开始) -(id)objectAtIndex:(NSUInteger)index

iOS:在OC中调用JS脚本:示例一

1.首先导入JavaScriptCore.framework这个框架 2.创建webView.设置代理.请求手机端百度 #import "ViewController.h" #import <JavaScriptCore/JavaScriptCore.h> #define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width #define SCREEN_HEIGHT [UIScreen mainScreen].bound

iOS开发——实用技术OC篇&amp;UIWebView与JS的交互

UIWebView与JS的交互 事情的起因还是因为项目需求驱动.折腾了两天,由于之前没有UIWebView与JS交互的经历,并且觉得这次在功能上有一定的创造性,特此留下一点文字,方便日后回顾. 我要实现这样一个需求:按照本地的CSS文件展示一串网络获取的带HTML格式的只有body部分的文本,需要自己拼写完整的HTML.除此之外,还需要禁用获取的HTML文本中自带的 < img > 标签自动加载,并把下载图片的操作放在native端来处理,并通过JS将图片在Cache中的地址返回给UIWebv