先将网页弄到iOS项目中:

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

  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

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

  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方法中检查点击的链接中是否有该协议,有则做相关操作.

代码如下:

  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最重要方法)

代码如下:

  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

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

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

    非常多应用为了节约成本,做出同一时候在Android与iOS上都能使用的界面,这时就要使用WebView来做.Android和IOS上都有WebView,做起来非常省事.当然这时就要考虑怎样在Andr ...

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

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta http-equiv="Con ...

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

    今天做一个OCR授权的需求, 需要开发一个OCR弹框, 让用户选择是否授权给第三方识别公司(旷世科技)保存和识别用户个人信息, 照片等. 其中用到了在一个js的方法中调用另外一个js的方法, 其中有一 ...

  4. Js文件函数中调用另一个Js文件函数的方法

    在项目中Js文件需要完成某一功能,但这一功能的大部分代码在另外一个Js文件已经完成,只需要调用这个文件实现功能.那么如何调用:一个Js文件函数中调用另一个Js文件函数的方法? (直接代码说明) 示例d ...

  5. iOS开发 Xcode8中遇到的问题及改动

      iOS开发 Xcode8中遇到的问题及改动 新版本发布总会有很多坑,也会有很多改动. 一个一个填吧... 一.遇到的问题 1.权限以及相关设置 iOS10系统下调用系统相册.相机功能,或者苹果健康 ...

  6. iOS开发——基础篇——iOS开发 Xcode8中遇到的问题及改动

      iOS开发 Xcode8中遇到的问题及改动 新版本发布总会有很多坑,也会有很多改动. 一个一个填吧... 一.遇到的问题 1.权限以及相关设置 iOS10系统下调用系统相册.相机功能,或者苹果健康 ...

  7. iOS:在OC中调用JS脚本

    示例一:在webView中调用js脚本进行搜索 1.首先导入JavaScriptCore.framework这个框架 2.创建webView.设置代理.请求手机端百度 #import "Vi ...

  8. iOS开发:JavaScriptCore.framework的简单使用--JS与OC的交互篇

    iOS7之后苹果为众猿推出了JavaScriptCore.framework这个框架,这个框架为大家在与JS交互上提供了很大帮助,可以在html界面上调用OC方法并传参,也可以在OC上调用JS方法并传 ...

  9. 如何在网页中调用百度地图api

    我想在木有提供地图接口的年代,前端工程师门要么只写上企业的具体地址,要么就是用一张标有自己位置的地图图片.但是现在不一样啦!为了增强用户体验,谷歌,甚至百度都很开放了,你可以在他们的网站上找到地图接口 ...

随机推荐

  1. spring aop配置及用例说明(3)

    欢迎转载交流:http://www.cnblogs.com/shizhongtao/p/3476336.html 1.这里说一下aop的@Around标签,它提供了在方法开始和结束,都能添加用户业务逻 ...

  2. linux网络编程九:splice函数,高效的零拷贝

    from:http://blog.csdn.net/jasonliuvip/article/details/22600569 linux网络编程九:splice函数,高效的零拷贝 最近在看<Li ...

  3. js中的等号与非等号

    等号与非等号都会进行类型转换,转换规则如下: 1 如果有一个是boolean值,则true改为1,false改为0  false == 0 ; true == 1 返回true  true == 2 ...

  4. 中科红旗倒下,谁来挑战windows

    中科红旗解散 国产操作系统从此梦断 2月10日,关门上锁的中科红旗北京总部大门上粘贴了一张最新公告,这张公告彻底击破了那些仍然坚守公司工作的员工“拯救中国红旗”的希望.该公告称:因北京中科红旗软件技术 ...

  5. Cassandra1.2文档学习(19)—— CQL索引

    参考文档:http://www.datastax.com/documentation/cql/3.0/webhelp/index.html#cql/ddl/ddl_primary_index_c.ht ...

  6. Spark Streaming揭秘 Day7 再探Job Scheduler

    Spark Streaming揭秘 Day7 再探Job Scheduler 今天,我们对Job Scheduler再进一步深入一下,对一些更加细节的源码进行分析. Job Scheduler启动 在 ...

  7. fedora 禁止nouveau加载

    To remove / disable nouveau drivers from kernel initramfs ## Backup old initramfs nouveau image ## m ...

  8. Bootstrap 内核引用(一)

    方法一: Bootstrap CDN推荐 本站实例采用的是百度的静态资源库(http://cdn.code.baidu.com/)上的Bootstrap资源. 百度的静态资源库的 CDN 服务,访问速 ...

  9. 【BZOJ1030】文本生成器

    Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是 ...

  10. 使用pd设计表的 多对多的中间表的设计方式, 有图有真相

    设计多对多表时解决重复问题 目前流行两种设计方式: 方式一 是在中间表中建一个单独的id主键, 与业务表关联的键设置为unique唯一; 干事二: 联合主键的方式, 该方式中间表不会有与业务表无关的主 ...