先將網頁弄到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中方法
步驟:
*1.設置webView的代理<UIWebViewDelegate>
*2.在代理的方法shouldStartLoadWithRequest:中調用.(該方法與網頁的加載有關)
*方法:就是在網頁鏈接中寫好自定義協議.然后在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();"];
- }