注入前:

注入后:

主界面:

  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. 2015 Multi-University Training Contest 3 hdu 5318 The Goddess Of The Moon

    The Goddess Of The Moon Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/ ...

  2. Hadoop解析--MapReduce

    从本篇博客開始咱们一起来具体了解Hadoop的每一个部分.我们在上篇博客中介绍了HDFS,MapReduce,MapReduce为了更有效率事实上是建立在HDFS之上的.有了分布式的文件系统,我们就能 ...

  3. python解压,压缩,以及存数据库的相关操作

    zipfile实现压缩整个目录和子目录 import os,shutil,zipfile,glob def dfs_get_zip_file(input_path,result): # files = ...

  4. Elasticsearch yellow 意味着主分片可用,副本不可用

    摘自:http://unasm.com/2016/11/644/ 在通过 /_cluster/state 命令查看es 状态的时候,发现es 处于一个yellow的状态, 这个很奇怪,按照官方的解释, ...

  5. hdoj--2180--时钟(数学)

    时钟 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

  6. vue中的swiper element ui

    欢迎加入前端交流群交流知识&&获取视频资料:749539640 很多同学问,怎么把swiper引入到vue的脚手架里去,之前的一篇博客有提到怎么引入,但是后来感觉不怎么好,还是用一些v ...

  7. html5+css3+javascript 自定义弹出窗口

    效果图: 源码: 1.demo.jsp <%@ page contentType="text/html;charset=UTF-8" language="java& ...

  8. 51nod 1557 两个集合 (严谨的逻辑题)

    题目: 1557 两个集合 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 小X有n个互不相同的整数: p1,p2,...,pn  ...

  9. 手工备份恢复oracle数据库

     手工备份恢复oracle数据库: 虽然已经有了rman工具 但是手工恢复oracle能够让你对oracle数据库有更加深入的了解 数据库一致性开机条件: 数据文件 scn,控制文件 scn,redo ...

  10. ActiveMQ学习笔记(8)----ActiveMQ的消息存储持久化

    1. 概述 ActiveMQ不仅支持persistent和non-persistent两种方式,还支持消息的恢复(recovery)方式. 2. PTP Queue的存储是很简单的,其实就是FIFO的 ...