WebView Js注入

简介:

注入前:

注入后:

 

主界面:

 

[java]  view plain  copy
 
 在CODE上查看代码片派生到我的代码片
  1. package com.example.webviewjsdemo;  
  2.   
  3. import android.os.Bundle;  
  4. import android.app.Activity;  
  5. import android.view.Menu;  
  6. import android.webkit.WebChromeClient;  
  7. import android.webkit.WebSettings;  
  8. import android.webkit.WebView;  
  9. import android.webkit.WebViewClient;  
  10. import android.widget.Toast;  
  11.   
  12. public class MainActivity extends Activity {  
  13.   
  14.     private WebView wv;  
  15.   
  16.     @Override  
  17.     protected void onCreate(Bundle savedInstanceState) {  
  18.         super.onCreate(savedInstanceState);  
  19.         setContentView(R.layout.activity_main);  
  20.   
  21.         wv = (WebView) findViewById(R.id.wv_main);  
  22.   
  23.         wv.setWebChromeClient(new WebChromeClient() {  
  24.         });  
  25.   
  26.         wv.setWebViewClient(new WebViewClient() {  
  27.             @Override  
  28.             public void onPageFinished(final WebView view, String url) {  
  29.                 Toast.makeText(getApplicationContext(), "3秒后改变内容", 1).show();  
  30.                 new Thread(){  
  31.                     public void run() {  
  32.                         try {  
  33.                             Thread.sleep(3000);  
  34.                         } catch (InterruptedException e) {  
  35.                             e.printStackTrace();  
  36.                         }  
  37.                         view.loadUrl("javascript:function myFunction(){x=document.getElementById(\"demo\");  x.innerHTML=\"改变了html内容!\";}");  
  38.                         view.loadUrl("javascript:myFunction()");  
  39.                     };  
  40.                 }.start();  
  41.                 super.onPageFinished(view, url);  
  42.             }  
  43.         });  
  44.   
  45.         WebSettings wvSettings = wv.getSettings();  
  46.         wvSettings.setJavaScriptEnabled(true);  
  47.   
  48.         wv.loadUrl("file:///android_asset/demo.html");  
  49.     }  
  50.   
  51. }  

 

 

主界面layout:

 

[java]  view plain  copy
 
 在CODE上查看代码片派生到我的代码片
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     tools:context=".MainActivity" >  
  6.   
  7.     <WebView  
  8.         android:id="@+id/wv_main"  
  9.         android:layout_width="match_parent"  
  10.         android:layout_height="match_parent"  
  11.         android:layout_centerHorizontal="true"  
  12.         android:layout_centerVertical="true" />  
  13.   
  14. </RelativeLayout>  


assets目录下的demo.html文件

 

 

[java]  view plain  copy
 
 在CODE上查看代码片派生到我的代码片
    1. <!DOCTYPE html>  
    2. <html>  
    3.     <body>  
    4.         <h1>Js注入</h1>  
    5.         <p id="demo" style="color:red;font-size:16px;">  
    6.             这里将会改变。  
    7.         </p>  
    8.     </body>  
    9. </html>  
      1. Android中向webview注入js代码可以通过webview.loadUrl("javascript:xxx")来实现,然后就会执行javascript后面的代码。

        但是当需要注入一整个js文件的时候,貌似就有点麻烦了。
        不过理清以下思路,方法其实也很简单,如下:
        我们通过在webview的onPageFinished方法中执行js代码注入:

        第一种:
        当webview加载完之后,读取整个js文件中的内容,然后将整个文件内容以字符串的形式,通过webview.loadUrl("javascript:fileContentString")注入

        复制代码
        复制代码
        URL url = new URL("http://www.rayray.ray/ray.js");
        in = url.openStream();
        byte buff[] = new byte[1024];
        ByteArrayOutputStream fromFile = new ByteArrayOutputStream();
        FileOutputStream out = null;
        do {
               int numread = in.read(buff);
               if (numread <= 0) {
                 break;
                 }
                fromFile.write(buff, 0, numread);
             } while (true);
        String wholeJS = fromFile.toString();
        复制代码
        复制代码

         

        复制代码
        @Override
        public void onPageFinished(WebView view, String url) 
         {
                super.onPageFinished(view, url);
                 webview.loadUrl("javascript:" + wholeJS);
         }
        复制代码

         

        第二种:
        页面加载完之后,直接向webview对应的html中加入<script>便签,并包含要注入的js的Url地址,如下:

        String js = "var newscript = document.createElement(\"script\");";
        js += "newscript.src=\"http://www.123.456/789.js\";";
        js += "document.body.appendChild(newscript);";

         

        复制代码
        @Override
         public void onPageFinished(WebView view, String url) 
          {
               super.onPageFinished(view, url);
                webview.loadUrl("javascript:" + js);
          }
        复制代码

         

        后记:上面两种方式中,第二种方法更加简单方便一点。不过第二种方法也有问题,当你注入完JS之后你想要立即调用其中的方法,第一种方法没问题可以调用到。但是第二种方法中,你要确保注入的<script>便签对应的js文件加载完才可调用成功。

        解决:在第二种方法中为加入script标签添加onload事件,确保该script已加载完成。代码可更改如下:

        String js = "var newscript = document.createElement(\"script\");";
           js += "newscript.src=\"http://www.123.456/789.js\";";
           js += "newscript.onload=function(){xxx();};";  //xxx()代表js中某方法
           js += "document.body.appendChild(newscript);";

         


        IOS中也一样,按照同样的思路然后在-(void)webViewDidFinishLoad:(UIWebView *)webView 中使用[webView stringByEvaluatingJavaScriptFromString:@"xxx"];即可 。


本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/5775429.html,如需转载请自行联系原作者
相关文章
|
8月前
|
JavaScript 前端开发 网络协议
抖音直播弹幕数据逆向:websocket和JS注入
抖音直播弹幕数据逆向:websocket和JS注入
831 1
|
10月前
|
JavaScript 前端开发 Android开发
kotlin开发 webview如何在收到JS调用后,native返回数据给到JS
这段内容描述了在Hybrid App开发中,使用Kotlin的Compose构建的Web视图(WebView)如何通过JsBridge实现JavaScript与原生代码的交互
|
9月前
|
JavaScript API
前后端数据交互.js文件的axios的写法,想要往后端发送数据,页面注入API,await的意思是同步等待服务器数据,并返回,axios注入在其他页面,其他页面调用的时候,同步作用
前后端数据交互.js文件的axios的写法,想要往后端发送数据,页面注入API,await的意思是同步等待服务器数据,并返回,axios注入在其他页面,其他页面调用的时候,同步作用
|
9月前
|
Web App开发 JavaScript 前端开发
Android端使用WebView注入一段js代码实现js调用android
Android端使用WebView注入一段js代码实现js调用android
216 0
|
10月前
|
安全 网络安全 API
kotlin安卓开发JetPack Compose 如何使用webview 打开网页时给webview注入cookie
在Jetpack Compose中使用WebView需借助AndroidView。要注入Cookie,首先在`build.gradle`添加WebView依赖,如`androidx.webkit:webkit:1.4.0`。接着创建自定义`ComposableWebView`,通过`CookieManager`设置接受第三方Cookie并注入Cookie字符串。最后在Compose界面使用这个自定义组件加载URL。注意Android 9及以上版本可能需要在网络安全配置中允许第三方Cookie。
1070 0
|
JavaScript 前端开发 Android开发
Android AgentWeb WebView 与js交互总结
Android AgentWeb WebView 与js交互总结
443 0
|
JavaScript
js基础笔记学习235解决xss注入攻击
js基础笔记学习235解决xss注入攻击
152 0
js基础笔记学习235解决xss注入攻击
|
JavaScript 前端开发 网络协议
Frida - App逆向 JavaScript代码注入 常用语法介绍
Frida可以通过将JavaScript 脚本插入到APP的内存中来对APP的逻辑进行跟踪和监视乃至修改原程序的逻辑,实现逆向开发和分析人员想要实现的功能称之为HOOK(钩子 即通过钩子机制与钩子函数建立联系);
1295 0
Frida - App逆向 JavaScript代码注入 常用语法介绍
|
JavaScript Android开发
用JS删除webView的内容
用JS删除webView的内容
244 0
用JS删除webView的内容
|
存储 JavaScript 调度
cocos webview js和c++交互
cocos webview js和c++交互
500 0
下一篇
oss创建bucket