注入前:

注入后:

主界面:

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

主界面layout:

  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. <WebView
  7. android:id="@+id/wv_main"
  8. android:layout_width="match_parent"
  9. android:layout_height="match_parent"
  10. android:layout_centerHorizontal="true"
  11. android:layout_centerVertical="true" />
  12. </RelativeLayout>

assets目录下的demo.html文件

    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"];即可 。

WebView Js注入的更多相关文章

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

    先将网页弄到iOS项目中: 网页内容如下, 仅供测试: <html> <head> <meta xmlns="http://www.w3.org/1999/xh ...

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

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

  3. WebView JS交互 JSBridge 案例 原理 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  4. WebView JS交互 addJavascriptInterface MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  5. WebView JS与RN进行通讯

    RN0.37终于官方增加了WebView与React Native的通讯,之前一真使用的是第三方控件React-Native-WebView-Bridge,但不是知道怎么回事这个第三方控件喊了很长时间 ...

  6. js注入,黑客之路必备!

    最近刚出了新闻,阿里四名网络安全部门员工利用网页漏洞写js脚本抢月饼,于是兴致来了,想了解一下这个js脚本到底怎么写,各种刷单各种抢枪抢又是怎么实现的. 什么是javascript注入攻击? 1.每当 ...

  7. PHP防止sql注入-JS注入

    一:为了网站数据安全,所有和数据库操作的相关参数必须做相关过滤,防止注入引起的网站中毒和数据泄漏 1.PHP自带效验函数 mysql_real_escape_string() 函数转义 SQL 语句中 ...

  8. 我对于js注入的理解

    资料:http://blog.csdn.net/gisredevelopment/article/details/41778671 js注入就是在前端利用使用js的地方 在这其中注入你写的js代码 使 ...

  9. webview javascript 注入方法

    Android中向webview注入js代码可以通过webview.loadUrl("javascript:xxx")来实现,然后就会执行javascript后面的代码. 但是当需 ...

随机推荐

  1. HDU1061_Rightmost Digit【高速幂取余】

    Rightmost Digit Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  2. 数组溢界地址的正确使用: 即 int a[6] 中的 a[-1] 和 a[6] 正确使用

    正如大家所知道的那样: 数组  int a[6] ,  编译器阅读到这句数组定义,会为分配6个int 类型的地址:a[0]  a[1]   a[2]   a[3]  a[4]  a[5].我们 能够正 ...

  3. Get Client IP

    How to get a user's client IP address in ASP.NET? Often you will want to know the IP address of some ...

  4. 51nod 1179 最大的最大公约数 (打表计数法)

    题目: 考虑清楚就简单了,我们把每个数的因子计数. 两个数的公约数就是计数超过2的数,然后找到最大的那个就好了. 计算每个数的素因子,记得sqrt(),不然会超时. 打表计数法时间复杂度O(n*sqr ...

  5. HTML基础——网站后台显示页面

    1.框架集标签:(作用:将页面进行区域的划分) <frameset rows="" cols=""> <frame src="&qu ...

  6. 【原创】关于java中的lock

    看了下java中高性能锁Lock,其中有如下: ReentrantLock:独占锁,类似于synchronized,不过锁的粒度更小 ReadWriteLock(ReentrantReadWriteL ...

  7. HDU 1556 Color the ball【树状数组】

    题意:给出n个区间,每次给这个区间里面的数加1,询问单点的值 一维的区间更新,单点查询,还是那篇论文里面讲了的 #include<iostream> #include<cstdio& ...

  8. Rx = Observables + LINQ + Schedulers

    The Reactive Extensions (Rx) is a library for composing asynchronous and event-based programs using ...

  9. 3ds Max脚本的使用实例教程

    本教程主要讲解了一个关于草地脚本的使用,应用到max与photoshop的一些命令及参数设置. 这个场景使用了3DSMAX5.1进行建模,使用VRAY渲染器进行的渲染,并且在最后使用PHOTOSHOP ...

  10. python一些被我忽略的知识

    最后一个不小心打错了,刚看到,try ...else 与 while/for else的相同