WebView与Js交互

上周五,老大让暂时搞一个评分app,俩页面。第一个页面显示全部待评分的物业,第二个页面是相应物业的评分页面。评分页面是表格样式的,所以就让web端的同学写个html,我们通过Webview去展示。

这里不不过展示就完了,web页面须要知道我们点击的哪个物业以及所填评委的名字并显示在html上。所以client须要把这两个值传给html。当评委评分完后点击html里的提交button并提交成功后。client也须要进行响应。做法就是client提供接口,js代码去调用来获取值——JS调用Android本地代码来实现。

今天主要总结两点:一是使用Js去调用client公有方法。二是从client调用Js中的方法

一、JS调用client公有方法

上样例:(PS:不会写JS,就网上找了一段js代码)

新建项目,在项目的assets目录下创建一个test.html:

<body>
<a>Web与Js交互:点击我,来调用client的show方法吧</a>
<script>
    function funFromjs(){
    	document.getElementById("helloweb").innerHTML="我是JS里的方法";
    }
    var aTag = document.getElementsByTagName('a')[0];
    aTag.addEventListener('click', function(){
        //调用android本地方法
		AppFunction.show("Js调用show()方法成功。");
        return false;
    }, false);
    </script>
<p></p>
<div id="helloweb">
</div>
</body>

这段代码有两个重点。一是funFromjs()方法,该方法是js里提供给client去调用的方法。二是AppFunction.show();show()方法是client提供给js去调用的方法,AppFunction是定义的接口名。

底下是client的实现:

package com.aliao.web;

import android.annotation.SuppressLint;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.webkit.JavascriptInterface;
import android.webkit.WebView;
import android.widget.Toast;

public class MainActivity extends ActionBarActivity {

    private WebView mWebView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initViews();
    }

    private void initViews() {
        String url = "file:///android_asset/test.html";
        mWebView = (WebView) findViewById(R.id.webview);
        mWebView.getSettings().setJavaScriptEnabled(true);//支持js
        mWebView.addJavascriptInterface(this, "AppFunction");
        mWebView.loadUrl(url);
    }

    @JavascriptInterface
    public void show(String msg){
        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
    }

}

这里须要注意的是,在Android4.2.2及之后的版本号仅仅有带有JavascriptInterface凝视的public方法才可以被js訪问。所以要在show()方法前加:@JavascriptInterface

详细查看:Webview addJavascriptInterface()

public void addJavascriptInterface (Object object, String name)

Added in API level 1

Injects the supplied Java object into this WebView. The object is injected into the JavaScript context of the main frame, using the supplied name. This allows the Java object‘s methods to be accessed
from JavaScript. For applications targeted to API levelJELLY_BEAN_MR1 and
above, only public methods that are annotated with JavascriptInterface can
be accessed from JavaScript. For applications targeted to API level JELLY_BEAN or
below, all public methods (including the inherited ones) can be accessed, see the important security note below for implications.

Note that injected objects will not appear in JavaScript until the page is next (re)loaded. For example:

 class JsObject {
    @JavascriptInterface
    public String toString() { return "injectedObject"; }
 }
 webView.addJavascriptInterface(new JsObject(), "injectedObject");
 webView.loadData("", "text/html", null);
 webView.loadUrl("javascript:alert(injectedObject.toString())");

这段是说,注入提供的java对象到WebView中。

该对象以接口名的方式被注入到Javascript的上下文环境中。这样就能够在JavaScript中去訪问该对象的方法。对于APl Level在4.2及以上的应用。仅仅有带有JavascriptInterface凝视的的公有方法能够被JavaScript訪问。对于Api
Level在4.1及下面的应用。全部的公有方法都能够被訪问(包含继承的方法),參见下面的重要的安全注意的影响。

(系统版本号在4.2下面要考虑的安全问题先mark下这个blog:Android WebView的Js对象注入漏洞解决方式

这里我把当前类的对象注入到webview中,命名为AppFunction。这样在JavaScript里就能够通过AppFunction直接訪问MainActivity中定义的供js调用方法。

   mWebView.addJavascriptInterface(this, "AppFunction");

也能够自己定义一个类,比如上例中的

webView.addJavascriptInterface(new JsObject(), "injectedObject");

定义一个JsObject类。该类里定义了提供给Js调用的方法,将该对象命名为injectedOnject。即接口名注入到js中。

执行后的结果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWxpYW9vb29v/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

二、JS调用client公有方法

前面写过的test.html里已经提供了一个供Androidclient调用的方法funFromjs()。那client的代码要怎么写?

在MainActivity的布局文件里加入一个button,点击该button后,调用js中的funFromjs方法:

package com.aliao.web;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;
import android.webkit.JavascriptInterface;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends ActionBarActivity {

    private WebView mWebView;
    private Button mBtnCallJsFun;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initViews();
    }

    private void initViews() {
        String url = "file:///android_asset/test.html";
        mWebView = (WebView) findViewById(R.id.webview);
        mWebView.getSettings().setJavaScriptEnabled(true);//支持js
        mWebView.addJavascriptInterface(this, "AppFunction");
        mWebView.loadUrl(url);

        mBtnCallJsFun = (Button) findViewById(R.id.btn_call_js_fun);
        mBtnCallJsFun.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mWebView.loadUrl("javascript:funFromjs()");
            }
        });
    }

    @JavascriptInterface
    public void show(String msg){
        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
    }

}

执行结果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWxpYW9vb29v/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

时间: 2024-10-06 07:11:47

WebView与Js交互的相关文章

webView和js交互

与 js 交互 OC 调用 JS // 执行 js - (void)webViewDidFinishLoad:(UIWebView *)webView { NSString *title = [webView stringByEvaluatingJavaScriptFromString:@"document.title;"]; NSLog(@"%@", title); [webView stringByEvaluatingJavaScriptFromString:@

android webview与js交互(动态添加js)

1.本地html与本地html里的js交互 2.本地html与本地js交互 3.网络html与网络js交互 4.网络html与本地js交互 5.各个情况动态添加js 以上5点都可以用一种方式来模拟,在本篇中采用本地html与本地js交互 (包含动态添加js的操作) 6.拦截url请求(在webview加载完成以后,触发的请求url) 7.拦截url请求后返回自己封装的数据(基于第6点,加载完成后,触发一些请求数据的url时拦截并自己封装数据返回给webview) 注:6.7点将在下一篇博客介绍

浅谈webview与js交互

浅谈下webview与js的交互,项目中因为需要获取页面中的许多属性,所以用到了这些,让后端在方法中传了过来. 下面的demo是本地的html代码,具体可以仿写,都差不多,注重思想. 1:项目目录 2:jump的代码 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GBK"/> <script type="text/

Android中使用WebView与JS交互全解析

1.概述首先,需要提出一个概念,那就是hybrid,主要意思就是native原生Android和h5混合开发.为什么要这样做呢?大家可以想象一下针对于同一个活动,如果使用纯native的开发方式,Android和iOS两边都要维护同一套界面甚至是逻辑,这样开发和维护的成本会很大,而使用hybrid的开发方式的话,让前端的同学去写一套界面和逻辑,对于native端来说只要使用对应的容器去展示就可以了(对于Android来说这个容器当然就是WebView).那为什么不所有的页面都使用这种方式开发呢?

Android原生webview中js交互

http://www.cnblogs.com/android-blogs/p/4891264.html Html页面和Java代码结合的方式一般用在界面经常被更改 的情况下,可以讲html放在网络中,软件一打开就会访问网络获取到最新的界面.缺点是会受到网络信号的影响,从而导致访问速度慢. 1.用WebView来显示HTML代码 2.允许WebView执行JavaScript webView.getSettings().setJavaScriptEnabled(true); 3.获取到HTML文件

WebView与js交互遇到的问题

1.在WebView中调用js,在4.4(target = 19)之前,只有一种方法: 调用js方法 test() webView.loadUrl("javascript:test()"); 注意,必须在主线程中调用,如果在非UI线程调用,可能会出错.所以,一般这样调用. handler.post( new Runnable() { webView.loadUrl("javascript:test()"); } ); 2.evaluateJavacript()方法调

解决Android签名混淆后WebView与JS交互失效的问题

[本博客内的文章是本人的学习笔记总结,如有错误请各位批评指正,谢谢!欢迎加入群285077071讨论] 问题描述:在开发公司项目的过程中,发现打包签名后app的WebView却不能正常加载网页了,而没有打包的app却一切正常!这是什么问题呢?? 解决思路:打包签名前后加载的都是同一个网页,不同的只是签名后app被混淆了--于是,打开proguard-project.txt文件,里面果然有一行被注释了的语句,如下图 既然打包签名混淆后就不能调用的话,那么我们就把这个注释打开,并且换成自己对应的类名

webView 和 js 交互 之 屏蔽 样式

如上图所见,读读日报为广告部分,我们不想看到,所以屏蔽掉.将url在浏览器打开,查看源码,找出广告部分的样式 执行代码: -(void)webViewDidFinishLoad:(UIWebView *)webView{ [web stringByEvaluatingJavaScriptFromString:@"document.getElementsByClassName('dudu-head')[0].style.display = 'NONE'"]; [web stringByE

Android webview与js交互

记录别人的几篇地址: http://www.cnblogs.com/vanezkw/archive/2012/07/02/2572799.html http://www.cnblogs.com/mengdd/archive/2013/03/02/2940185.html http://blog.csdn.net/cappuccinolau/article/details/8262821