1.整体思路:
js调用java
首先将js代码注入到webview的页面中,然后通过修改window.location.href来向java传递参数,java端通过监听页面url的改变来识别js端传递的参数.然后再经解析数据实现java方法的调用.
java调用js
java通过webView.loadUrl("JavaScript:"+jsCode);来实现js代码的调用
2. java调用js的实现
java调用js的方法,相当简单:
String jsCode = "(function(){ /*js code here*/ })()";
webview.loadUrl("javascript:" + jsCode);
注意:要把js代码用自执行函数包裹起来
利用这种方法可以把任意代码注入到页面中
注意: 当页面刚加载时就需要把 2.1中的js代码注入到页面中,但是有时会出现页面加载完成,但是注入的代码没有执行的现象,应该是因为js没有及时加载而页面先加载完成。要解决这个问题就需要在页面加载完成时触发一个事件比如jsBridgeReady,js端通过监听jsBridgeReady事件来调用java方法。那么总体流程如下:
加载页面->注入js代码->页面加载完成->触发js注入完成事件
代码:
在BridgeWebClient中添加逻辑: 1,加载页面时注入js代码: 2,加载完成后触发加载完成事件
@Override
public void onLoadResource(WebView view, String url) {
// 注入桥接代码
// 这里通过读取js文件获得js代码
if (mFileName != null) {
view.loadUrl(mBridge.createBaseJs(mContext, mFileName));
}
super.onLoadResource(view, url);
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
// 触发注入完成事件,用于解决 注入的代码没有及时加载成功导致无法调用的问题
view.loadUrl("(function(){if(window.UAPPJSBridgeReady){window.UAPPJSBridgeReady();}})()");
}
如果你也想从文件读取js代码,记得把读取的代码压缩一下,把注释和换行删除,不然很可能会报错
js端调用java注入的代码:
//判断代码是否注入完成
if(window.UAPPJSBridge){
//调用注入的方法
window.UAPPJSBridge.wxshare(message,success,error);
}else{
//监听注入完成的事件
window.onBridgeLoaded=function(){
if(window.UAPPJSBridge){
window.UAPPJSBridge.wxshare(message,success,error);
}
}
}
⑵ 如何用java执行指定页面中的js代码
要在java中执行js代码,首先明白,java不支持浏览器本身的方法。支持自定义的js方法,否则会报错
先新建一个js文件:jsss.js
内容如下:
function aa(a,b){ return a+b;
}
然后在java中写代码:
public class ZipTest {
public static void main(String[] args) throws Exception {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
String jsFileName="G:\javaPro\zmwmcc\WebRoot\jsss.js";
FileReader reader = new FileReader(jsFileName); // 执行指定脚本 engine.eval(reader);
if(engine instanceof Invocable) {
Invocable invoke = (Invocable)engine; // 调用merge方法,并传入两个参数
Double c = (Double)invoke.invokeFunction("aa", 2, 3); //调用了js的aa方法
System.out.println(c);
}
// engine.eval("alert("js alert");"); // 不能调用浏览器中定义的js函数 // 错误,会抛出alert引用不 }
}
⑶ javascript 涓 鈥 锛乫unction(){}() 鈥 鏄浠涔堟剰鎬濓紵
( function(){鈥} )()鍜( function (){鈥} () )鏄涓ょ峧avascript绔嬪嵆鎵ц屽嚱鏁扮殑甯歌佸啓娉曪紝瑕佺悊瑙g珛鍗虫墽琛屽嚱鏁帮紝闇瑕佸厛鐞嗚В涓浜涘嚱鏁扮殑鍩烘湰姒傚康銆
鍑芥暟澹版槑锛
function fnName () {鈥};浣跨敤function鍏抽敭瀛楀0鏄庝竴涓鍑芥暟锛屽啀鎸囧畾涓涓鍑芥暟鍚嶏紝鍙鍑芥暟澹版槑銆
鍑芥暟琛ㄨ揪寮忥細
var fnName = function () {鈥};浣跨敤function鍏抽敭瀛楀0鏄庝竴涓鍑芥暟锛屼絾鏈缁欏嚱鏁板懡鍚嶏紝鏈鍚庡皢鍖垮悕鍑芥暟璧嬩簣涓涓鍙橀噺锛屽彨鍑芥暟琛ㄨ揪寮忥紝杩欐槸鏈甯歌佺殑鍑芥暟琛ㄨ揪寮忚娉曞舰寮忋
鍖垮悕鍑芥暟锛
function () {}; 浣跨敤function鍏抽敭瀛楀0鏄庝竴涓鍑芥暟锛屼絾鏈缁欏嚱鏁板懡鍚嶏紝鎵浠ュ彨鍖垮悕鍑芥暟锛屽尶鍚嶅嚱鏁板睘浜庡嚱鏁拌〃杈惧紡锛屽尶鍚嶅嚱鏁版湁寰堝氫綔鐢锛岃祴浜堜竴涓鍙橀噺鍒欏垱寤哄嚱鏁帮紝璧嬩簣涓涓浜嬩欢鍒欐垚涓轰簨浠跺勭悊绋嬪簭鎴栧垱寤洪棴鍖呯瓑绛夈
鍑芥暟澹版槑鍜屽嚱鏁拌〃杈惧紡涓嶅悓涔嬪勫湪浜庯細
涓銆丣avascript寮曟搸鍦ㄨВ鏋恓avascript浠g爜鏃朵細鈥樺嚱鏁板0鏄庢彁鍗'锛團unction declaration Hoisting锛夊綋鍓嶆墽琛岀幆澧冿紙浣滅敤鍩燂級涓婄殑鍑芥暟澹版槑銆
鑰屽嚱鏁拌〃杈惧紡蹇呴』绛夊埌Javascirtp寮曟搸鎵ц屽埌瀹冩墍鍦ㄨ屾椂锛屾墠浼氫粠涓婅屼笅涓琛屼竴琛屽湴瑙f瀽鍑芥暟琛ㄨ揪寮忋
浜屻佸嚱鏁拌〃杈惧紡鍚庨潰鍙浠ュ姞鎷鍙风珛鍗宠皟鐢ㄨュ嚱鏁帮紝鍑芥暟澹版槑涓嶅彲浠ワ紝鍙鑳戒互fnName()褰㈠紡璋冪敤銆
鍦╢unction鍓嶉潰鍔狅紒銆+銆 -鐢氳嚦鏄閫楀彿绛夊埌閮藉彲浠ヨ捣鍒板嚱鏁板畾涔夊悗绔嬪嵆鎵ц岀殑鏁堟灉锛岃岋紙锛夈侊紒銆+銆-銆=绛杩愮畻绗锛岄兘灏嗗嚱鏁板0鏄庤浆鎹㈡垚鍑芥暟琛ㄨ揪寮忋
娑堥櫎浜唈avascript寮曟搸璇嗗埆鍑芥暟琛ㄨ揪寮忓拰鍑芥暟澹版槑鐨勬т箟锛屽憡璇塲avascript寮曟搸杩欐槸涓涓鍑芥暟琛ㄨ揪寮忥紝涓嶆槸鍑芥暟澹版槑锛屽彲浠ュ湪鍚庨潰鍔犳嫭鍙凤紝骞剁珛鍗虫墽琛屽嚱鏁扮殑浠g爜銆
鎵╁睍璧勬枡
浣滅敤锛
javascript涓娌$敤绉佹湁浣滅敤鍩熺殑姒傚康锛屽傛灉鍦ㄥ氫汉寮鍙戠殑椤圭洰涓婏紝浣犲湪鍏ㄥ眬鎴栧眬閮ㄤ綔鐢ㄥ煙涓澹版槑浜嗕竴浜涘彉閲忥紝鍙鑳戒細琚鍏朵粬浜轰笉灏忓績鐢ㄥ悓鍚嶇殑鍙橀噺缁欒嗙洊鎺夈
鏍规嵁javascript鍑芥暟浣滅敤鍩熼摼鐨勭壒鎬э紝鍙浠ヤ娇鐢ㄨ繖绉嶆妧鏈鍙浠ユā浠夸竴涓绉佹湁浣滅敤鍩燂紝鐢ㄥ尶鍚嶅嚱鏁颁綔涓轰竴涓鈥滃瑰櫒鈥濄
鈥滃瑰櫒鈥濆唴閮ㄥ彲浠ヨ块棶澶栭儴鐨勫彉閲忥紝鑰屽栭儴鐜澧冧笉鑳借块棶鈥滃瑰櫒鈥濆唴閮ㄧ殑鍙橀噺锛屾墍浠( function(){鈥} )()鍐呴儴瀹氫箟鐨勫彉閲忎笉浼氬拰澶栭儴鐨勫彉閲忓彂鐢熷啿绐侊紝淇楃О鈥滃尶鍚嶅寘瑁瑰櫒鈥濇垨鈥鍛藉悕绌洪棿鈥濄
JQuery浣跨敤鐨勫氨鏄杩欑嶆柟娉曪紝灏咼Query浠g爜鍖呰9鍦( function (window,undefined){鈥jquery浠g爜鈥} (window)涓锛屽湪鍏ㄥ眬浣滅敤鍩熶腑璋冪敤JQuery浠g爜鏃讹紝鍙浠ヨ揪鍒颁繚鎶JQuery鍐呴儴鍙橀噺鐨勪綔鐢ㄣ
⑷ java调用请求页面js方法有哪些
jsp页面中调用javascript方法,可以直接写在标签的onclick属性,如下示例:
<html>
<head>
<script src="debuggap.js" type="text/javascript"></script>
<script type="text/javascript">
var startTop = 120;
var startPos = 1;
var totalNum = 0;
var itemHeight = 40;
var con1 = '';
function updateHtml(type, type2) {
totalNum = window.programList.size();
//初始化页面
totalNum = programList.size();
for (i = 0; i < totalNum; i++) {
con1 += programList.get(i).getId()
+ programList.get(i).getName();
}
var Book =
{
Name: programList.get(0).getId()
};
document.getElementById("content").innerHTML = "弹出对话框,测试" + type
+ type2 + "测试" + totalNum + con1+Book.Name;
alert("dialog");
}
</script>
</head>
<body>
这是一个js与android的例子
<a onClick="window.ceshi.updateHtml()" href="">弹出对话框</a> 调用JavaScript方法
<span id="content"></span>
</body>
</html>
⑸ Java调用JS脚本里的方法
本例子使用了JDK 以上的javax script包 通过Invocable接口实现JAVA调用JS脚本里的方法 本例中调用分为内部执行脚本和外部执行脚本 外部执行脚本分为不带参数调用和带参数调用 主要采用invokeFunction方法调用 ObjectinvokeFunction(String name Object… args) 用于调用脚本中定义的顶层程序和函数 ObjectinvokeMethod(Object thiz String name Object… args) 对以前的脚本执行中已经编译的脚本对象(以 ScriptEngine 的状态保持)调用某一方法 package de javase; import javax script Invocable; import javax script ScriptEngineManager; import javax script ScriptEngine; import java io File; import java io Reader; import java io FileReader; public class AjavaInvokingFunction { public static void main(String[] args) { // 获得一个JavaScript脚本引擎 也可以是ECMAScript脚本引擎 ScriptEngineManager manager = new ScriptEngineManager() ScriptEngine engine = manager getEngineByName( JavaScript ) String titlescript = function sayTitle() { + println( 源码实例 使用javax script调用JS脚本里的方法 ) + println( ) + } ; try {// 调用内部脚本执行 engine eval(titlescript) // 转换为Invocable Invocable invocableEngine = (Invocable) engine; // 不带参数调用sayTitle方法 invocableEngine invokeFunction( sayTitle ) // 调用外部脚本执行 // 创建JS文件的File对象 并读入流 File functionscript = new File( ajava js ) Reader reader = new FileReader(functionscript) // 开始执行ajava js里的程序 engine eval(reader) // 不带参数调用sayHello方法 invocableEngine invokeFunction( sayHello ) // 带参数调用sayHello方法 invocableEngine invokeFunction( sayHello mark ) } catch (Exception e) { e printStackTrace() } } } ajava js文件 function sayHello(){ sayHello(null) } function sayHello(name){ if(name==null){ println( 欢迎你!请注册Ajava会员 ) }else{ println(name+ 独立JAVA社区欢迎你 ) } } 运行结果(控制台) 源码实例 使用javax script调用JS脚本里的方法 lishixin/Article/program/Java/hx/201311/26436
⑹ 用JAVA正则表达式提取javascript函数体
Patternregex=Pattern.compile("function\s*?article\(.*?\)\s*?\{[^{}]*?(\{.*?\})*[^{}]*?\}",Pattern.DOTALL|Pattern.CASE_INSENSITIVE|Pattern.UNICODE_CASE|Pattern.MULTILINE);
把里面的article替换成你的参数就可以了
⑺ 如何在java中调用js方法
在Java中调用js文件中的function,传入调用参数,并获取返回值
js文件中的merge函数将两个参数a,b相加,并返回c。
// expression.js
function merge(a, b) {
c = a * b;
return c;
}
在Java代码中读取js文件,并参数两个参数,然后回去返回值。
package com.sinaapp.manjushri;
import java.io.FileReader;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
/** * Java调用并执行js文件,传递参数,并活动返回值 * * @author manjushri */
public class ScriptEngineTest {
public static void main(String[] args) throws Exception {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("javascript");
String jsFileName = "expression.js"; // 读取js文件
FileReader reader = new FileReader(jsFileName); // 执行指定脚本
engine.eval(reader);
if(engine instanceof Invocable) {
Invocable invoke = (Invocable)engine; // 调用merge方法,并传入两个参数
// c = merge(2, 3);
Double c = (Double)invoke.invokeFunction("merge", 2, 3);
System.out.println("c = " + c);
}
reader.close();
}
}
输出结果:
c = 5.0
⑻ java 调用 js函数
function是属于javascript里面的抄语法,而<%%>里面调用袭的是java的语法,所以想要用<%%>调用alert()是不行了,因为他们不是同一个东西。
不知道你的意思是不是页面一加载就进行调用alert(),如果是这样的话,建议使用onload事件,表示页面加载的时候调用alert();
或者如果是点击的时候调用,那么久调用onclick()..总而言之可以使用事件完成。
⑼ 如何在JavaScript中使用java类中的方法
很难! 一个是前台,一个是后台,不过AJAX 实现了这个思想!. 下面是一个AJAX实例:
// JavaScript Document
var xmlHttp;
function GetXmlHttpObject()
{
var xhr=null;
try
{
// Firefox, Opera 8.0+, Safari
xhr=new XMLHttpRequest();
}catch (e)
{
// Internet Explorer
try
{
xhr=new ActiveXObject("Msxml2.XMLHTTP");
}catch (e)
{
xhr=new ActiveXObject("Microsoft.XMLHTTP");
}
}
return xhr;
}
function getDataByDept(str)
{
xmlHttp = GetXmlHttpObject();
if(xmlHttp==null)
{
alert("很抱歉!您的浏览器不支持AJAX!");
return;
}
var url = "/intcard/jsp/employee.do?method=getByDept"
xmlHttp.onReadyStateChange=stateChanged;
xmlHttp.open("post",url,true);
xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=UTF-8');
xmlHttp.send("dept=" + str);
}
function stateChanged()
{
if(xmlHttp.readyState == 4)
{
var result = xmlHttp.responseText;
document.getElementById("select_employees").innerHTML = result;
}
}
思想就是,通过HTML控件的事件调用JS的方法,在JS理通过httprequest对象的open方法调用服务器脚本----- 在服务器脚本里 你可以用javabean的方法,并且把计算结果传递给JS.曲线实现了你的思想