注入前:

注入后:

主界面:

  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. WinServer-IIS-woff字体不显示问题

    ASP.NET mvc发布到IIS之后,访问网站的时候,发现woff字体没有加载 百度发现很多博客上的教程是这样的,在IIS管理器中的MIME选项中添加类型 但是重新使用IIS发布后,新添加的字体就会 ...

  2. spring boot和maven的约定大于配置体现在哪些方面

    spring boot和maven的约定大于配置体现在哪些方面? 两者都遵从了约定大于配置的路线 约定优于配置体现点: 1.maven的目录文件结构 1)默认有resources文件夹,存放资源配置文 ...

  3. shell如何更改当前工作路径

    转载: http://imysqldba.blog.51cto.com/1222376/616805 shell 脚本执行有三种方法 bash 脚本名 sh 脚本名 chmod +x 脚本名 使用下面 ...

  4. HTML5客户端数据存储机制Web Storage和Web SQL Database

    引言 html5本地存储可以选择两种方式,一种是本地存储,一种是sqlite. 比如开发html5的购物车功能,就可以考虑选择其中之一,进行本地存储与操作. 又或者保存用户登录信息,可以使用local ...

  5. php设计模式适配器模式

    php设计模式适配器模式 简介 适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的.一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起. 其实就是通过一个转换类,这个转 ...

  6. pip更新问题

    pip更新及Requirement already up-to-date解决方法 pip更新 更新命令 将pip更新版本 1 python -m pip install --upgrade pip R ...

  7. POJ 1064 Cable master (二分答案,G++不过,C++就过了)

    题目: 这题有点坑,G++过不了,C++能过. 条件:n个数据a[],分成k段,结果精度要求两位小数. 问题:每段最长为多少? 思路:因为精度要求为两位小数,我先把所有的长度a[]*100. 我们对答 ...

  8. java 获取线程id

    如何获取正在运行的线程的ID? 解决方法 下面的示例演示如何使用getThreadId() 方法一个正在运行线程的ID. public class Main extends Object implem ...

  9. hiho1041 - 树,遍历

    题目链接 给一棵树,给一个序列,问能不能按这个序列遍历这棵树,满足每条边最多经过两次. -------------------------------------------------------- ...

  10. VP相关

    1.485模块电平,如果是集成的IC模块,则发送低电平,接收高电平: 2.阀门程序移植至PLC注意事项: 1) 阀门程序中的变量厘清,移植过程中阀门程序中的模块有些用到了,有些没用到,所以这是变量也很 ...