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.曲線實現了你的思想