聲明:基於android studio平台,php語言搭建服務器
目錄:
六、java跟JavaScript相互調用常見問題及解決辦法
1、Uncaught ReferenceError: functionName is not defined
一、JavaScript腳本語言沒有反應
問題描述:
webview加載本地html文件,html文件中常常包含很多js腳本代碼,例如某個按鈕的點擊事件,但是js代碼將不起作用;
解決辦法:
java代碼在用webview加載html文件之前先對webview進行設置,讓webview可以支持js代碼:
WebSettings webSettings = webViMain.getSettings();
webSettings.setJavaScriptEnabled(true);
二、alert無法彈出
問題描述:
webview加載本地html文件,html中的js文件包含alert彈出框代碼,但是webview無法彈出alert;
解決辦法:
在java代碼中添加下面這句:
webViMain.setWebChromeClient(new WebChromeClient() {});
三、html頁面之間不能跳轉
問題描述:
webview加載本地html文件,想在html文件中實現跳轉到另一個html文件(代碼如下),html代碼本身沒問題,文件路徑也是對的,但是跳轉失敗,顯示文件不存在或被刪除...
window.location.href="my_life.html";
解決辦法:
之所以不能實現html文件之間的跳轉是因為上面那句跳轉界面的代碼只能在瀏覽器中才能被支持,可以為webview設置如下代碼,相當於賦予webview代理瀏覽器的功能:
webViMain.setWebViewClient(new WebViewClient() {});
四、屏幕縮放沒有達到預期效果
問題描述:
webview加載本地html文件,html文件中是支持縮放的(代碼如下),但是在手機運行程序的時候不支持縮放頁面;
<meta name="viewport" content="width=device-width, initial-scale=1.0 user-scalable=yes">
解決辦法:
手機不能縮放是因為雖然html已經支持縮放了,但是webview仍然需要進行設置,讓其支持html頁面進行縮放:
WebSettings webSettings = webViMain.getSettings();
webSettings.setUseWideViewPort(true); //設置縮放后不會變形
webSettings.setBuiltInZoomControls(true); //設置可以縮放
五、使用$.ajax()跨域訪問服務器的時候沒反應
問題描述:
webview加載本地html文件,html文件需要訪問服務器(代碼如下),代碼本身沒問題,但是訪問失敗,沒有反應
$.ajax({
url: "http://suqhhhh.imwork.net:57037/App&Php_Dmo/login.php",
data: {
username: $("#username").val(),
password: $("#password").val(),
},
type: "POST",
timeout: 36000,
dataType: "text",
success: function(data, textStatus) {
if (data == "登錄成功") {
window.location.href = "my_life.html"; //在原窗口加載新頁面
//window.open("my_life.html"); //在新窗口加載新頁面
} else {
alert(textStatus + ":" + data);
}
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
alert("error:" + textStatus);
}
});
解決辦法:
這里訪問服務器涉及到跨域訪問,需要在服務器代碼添加header,讓外部代碼可以進行跨域訪問,否則得不到訪問權限:
<?php
// 指定允許其他域名訪問
header('Access-Control-Allow-Origin:*');
六、java跟JavaScript相互調用常見問題及解決辦法
1、Uncaught ReferenceError: functionName is not defined
問題描述:
webview加載本地html文件,程序運行不起來,報錯:
Uncaught ReferenceError: functionName is not defined...
解決辦法:
問題出現原因,網頁的js代碼沒有加載完成,就調用了js方法。解決方法是在網頁加載完成之后調用js方法:
webViMain.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
//在這里執行你想調用的js函數
}
});
2、安全限制問題
問題描述:
如果只在4.2版本以上的機器出問題,那么就是系統處於安全限制的問題了。Android文檔這樣說的:
Caution: If you’ve set your targetSdkVersion to 17 or higher, you must add the @JavascriptInterface annotation to any method that you want available your web page code (the method must also be public). If you do not provide the annotation, then the method will not accessible by your web page when running on Android 4.2 or higher.
中文大意為:
警告:如果你的程序目標平台是17或者是更高,你必須要在暴露給網頁可調用的方法(這個方法必須是公開的)加上@JavascriptInterface注釋。如果你不這樣做的話,在4.2以以后的平台上,網頁無法訪問到你的方法。
解決辦法:
將targetSdkVersion設置成17或更高,引入@JavascriptInterface注釋
待補充。。。