Android Webview - 本地 javascript 执行中未捕获的 ReferenceError
Android Webview - Uncaught ReferenceError in local javascript execution
大家好,感谢您的帮助!
我想构建一个 Android Webview 应用程序,它使用 HTML + CSS + javascript 除了 highcharts 之外没有任何库。当我尝试使用服务器上的文件时,它在跨浏览器上运行良好。
我希望在客户端本地拥有尽可能多的文件 运行:HTML、CSS、所有资产(图像)和 javascript 代码都是在应用程序中,仅在服务器上保留 php 个文件(登录、登录等)。
不幸的是,当我在 Android 上试用我的应用程序时,我的 javascript 函数定义出现错误,例如:
12-27 10:04:42.075 17798-17798/com.wifcompanion.wifcompanion D/WiFCompanionConsole: Uncaught ReferenceError: BodyReset is not defined -- 来自 file:///android_asset/wifmobile.[= 的第 22 行47=]
我的第一直觉是 .js 文件没有正确加载。所以我把所有的js代码直接放在了wifmobile.html中的标签下。无果。
另外,好像找到了一些函数(比如点击首页登录按钮时的NewSignIn()),还有一些没有(比如PopupSave(),这是在NewSignIn中调用的函数) ()).
我能在 Whosebug 上找到的最接近的问题在这里,但没有任何答案:
JavaScript not working with android WebView, Uncaught ReferenceError
主要活动:
package com.wifcompanion.wifcompanion;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.annotation.TargetApi;
import android.util.Log;
import android.webkit.ConsoleMessage;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class MainActivity extends AppCompatActivity {
private WebView m_webview = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load layout
setContentView(R.layout.activity_main);
// Create WebView
m_webview = new WebView(this);
// Add WebView to Activity
m_webview = (WebView) findViewById(R.id.webviewWIF);
m_webview.setWebChromeClient(new WebChromeClient());
m_webview.loadUrl("file:///android_asset/wifmobile.html");
//Logcat and console
m_webview.setWebChromeClient(new WebChromeClient() {
public boolean onConsoleMessage(ConsoleMessage cm) {
Log.d("WiFCompanionConsole", cm.message() + " -- From line "
+ cm.lineNumber() + " of "
+ cm.sourceId() );
return true;
}
});
// Reload the old WebView content
if (savedInstanceState != null) {
m_webview.restoreState(savedInstanceState);
}
// Create the WebView
else {
m_webview.getSettings().setJavaScriptEnabled(true);
int currentapiVersion = android.os.Build.VERSION.SDK_INT;
if (currentapiVersion >= android.os.Build.VERSION_CODES.JELLY_BEAN) {
fixNewAndroid(m_webview);
}
}
}
// Save the state of the web view when the screen is rotated.
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
m_webview.saveState(outState);
}
@TargetApi(16)
protected void fixNewAndroid(WebView webView) {
try {
webView.getSettings().setAllowUniversalAccessFromFileURLs(true);
} catch (NullPointerException e) {
}
}
}
wifmobile.html
<!DOCTYPE html>
<html>
<head>
<!-- Title -->
<title>World in Flames Companion</title>
<!-- Include meta tag to ensure proper rendering and touch zooming -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="manifest" href="manifest.json">
<!-- icon -->
<link rel="icon" href="img/icon/favicon.ico" />
<link rel="icon" type="image/png" href="img/icon/wiflogo48.png" />
<!-- jQuery library -->
<!--<script src="js/jquery-1.11.1.min.js"></script>-->
<!-- Highharts -->
<script src="https://code.highcharts.com/highcharts.js"></script>
<!-- WIF scripts -->
<script src="solifnav.js"></script>
<script src="solif.js"></script>
<script src="soliffal.js"></script>
<script src="solifsetup.js"></script>
<script src="solifpartisans.js"></script>
<script src="solifflow.js"></script>
<script src="solifcards.js"></script>
<script src="solifdiplo.js"></script>
<script src="solifbenefits.js"></script>
<script src="solifvichy.js"></script>
<script src="solifinternal.js"></script>
<script src="solifgamemanagement.js"></script>
<script src="solifbuild.js"></script>
<script src="solifhelper.js"></script>
<script src="solifdatabase.js"></script>
<script src="solifintel.js"></script>
<script src="solifstats.js"></script>
<script src="solifcivilwar.js"></script>
<script src="solifvp.js"></script>
<!-- Scenario specifics -->
<script src="solifscenario4.js"></script>
<!-- Stylehseet -->
<link rel="stylesheet" href="wifmobile.css">
<!-- Fonts -->
<link href="https://fonts.googleapis.com/css?family=Anton|Russo+One|Fanwood+Text|UnifrakturCook:700" rel="stylesheet">
</head>
<body onclick="BodyReset(event);" onkeydown="BodyKeydown(event);">
<!-- Login / registration / forgotpassword page-->
<div id="signin">
<div class="banner"><img src="img/icon/wiflogo.png" style="max-width:75%;" /></div>
<div id="login">
<input type="text" name="login-username" id="login-username" placeholder="User name" autocomplete="username">
<input type="password" name="login-password" id="login-password" placeholder="Password" autocomplete="current-password">
<a onclick="NewSignIn();" id="NewSignInButton">Login</a>
<a onclick="GotoRegister();" class="things">>> Register</a>
<a onclick="GotoForgot();" class="things">>> Forgot your password?</a>
</div>
</div>
</body>
</html>`
这绝对是javascript代码中的一个错误。也就是说,由于我使用的是旧设备(平板电脑必须是 2010 年初的),webview 不符合 Javascript ECMAScript 6。相反,您应该确保您的代码符合 Javascript ECMAScript 5。
这包括(这些是我在代码中发现的主要错误):
1) 不要在函数中使用默认参数声明。而不是:
function myFunction(myParam='hello'){
...
}
使用:
function myFunction(myParam){
myParam=myParam || 'hello';
...
}
2) 您的函数不应与 html 中的 id 保持相同的 "name"(区分大小写)。例如不要这样做:
<a id="MyLink" onclick="MyLink();">My link</a>
但是这样做:
<a id="MyLink" onclick="myLink();">My link</a>
3) 如果像我一样,你不是该死的专家,请准备好测试你代码的每一行,因为即使像 console.clear() 这样简单的东西也不合规。
我会编辑这个 post,因为我发现了一些更明显的错误。
大家好,感谢您的帮助!
我想构建一个 Android Webview 应用程序,它使用 HTML + CSS + javascript 除了 highcharts 之外没有任何库。当我尝试使用服务器上的文件时,它在跨浏览器上运行良好。
我希望在客户端本地拥有尽可能多的文件 运行:HTML、CSS、所有资产(图像)和 javascript 代码都是在应用程序中,仅在服务器上保留 php 个文件(登录、登录等)。
不幸的是,当我在 Android 上试用我的应用程序时,我的 javascript 函数定义出现错误,例如: 12-27 10:04:42.075 17798-17798/com.wifcompanion.wifcompanion D/WiFCompanionConsole: Uncaught ReferenceError: BodyReset is not defined -- 来自 file:///android_asset/wifmobile.[= 的第 22 行47=]
我的第一直觉是 .js 文件没有正确加载。所以我把所有的js代码直接放在了wifmobile.html中的标签下。无果。
另外,好像找到了一些函数(比如点击首页登录按钮时的NewSignIn()),还有一些没有(比如PopupSave(),这是在NewSignIn中调用的函数) ()).
我能在 Whosebug 上找到的最接近的问题在这里,但没有任何答案: JavaScript not working with android WebView, Uncaught ReferenceError
主要活动:
package com.wifcompanion.wifcompanion;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.annotation.TargetApi;
import android.util.Log;
import android.webkit.ConsoleMessage;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class MainActivity extends AppCompatActivity {
private WebView m_webview = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load layout
setContentView(R.layout.activity_main);
// Create WebView
m_webview = new WebView(this);
// Add WebView to Activity
m_webview = (WebView) findViewById(R.id.webviewWIF);
m_webview.setWebChromeClient(new WebChromeClient());
m_webview.loadUrl("file:///android_asset/wifmobile.html");
//Logcat and console
m_webview.setWebChromeClient(new WebChromeClient() {
public boolean onConsoleMessage(ConsoleMessage cm) {
Log.d("WiFCompanionConsole", cm.message() + " -- From line "
+ cm.lineNumber() + " of "
+ cm.sourceId() );
return true;
}
});
// Reload the old WebView content
if (savedInstanceState != null) {
m_webview.restoreState(savedInstanceState);
}
// Create the WebView
else {
m_webview.getSettings().setJavaScriptEnabled(true);
int currentapiVersion = android.os.Build.VERSION.SDK_INT;
if (currentapiVersion >= android.os.Build.VERSION_CODES.JELLY_BEAN) {
fixNewAndroid(m_webview);
}
}
}
// Save the state of the web view when the screen is rotated.
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
m_webview.saveState(outState);
}
@TargetApi(16)
protected void fixNewAndroid(WebView webView) {
try {
webView.getSettings().setAllowUniversalAccessFromFileURLs(true);
} catch (NullPointerException e) {
}
}
}
wifmobile.html
<!DOCTYPE html>
<html>
<head>
<!-- Title -->
<title>World in Flames Companion</title>
<!-- Include meta tag to ensure proper rendering and touch zooming -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="manifest" href="manifest.json">
<!-- icon -->
<link rel="icon" href="img/icon/favicon.ico" />
<link rel="icon" type="image/png" href="img/icon/wiflogo48.png" />
<!-- jQuery library -->
<!--<script src="js/jquery-1.11.1.min.js"></script>-->
<!-- Highharts -->
<script src="https://code.highcharts.com/highcharts.js"></script>
<!-- WIF scripts -->
<script src="solifnav.js"></script>
<script src="solif.js"></script>
<script src="soliffal.js"></script>
<script src="solifsetup.js"></script>
<script src="solifpartisans.js"></script>
<script src="solifflow.js"></script>
<script src="solifcards.js"></script>
<script src="solifdiplo.js"></script>
<script src="solifbenefits.js"></script>
<script src="solifvichy.js"></script>
<script src="solifinternal.js"></script>
<script src="solifgamemanagement.js"></script>
<script src="solifbuild.js"></script>
<script src="solifhelper.js"></script>
<script src="solifdatabase.js"></script>
<script src="solifintel.js"></script>
<script src="solifstats.js"></script>
<script src="solifcivilwar.js"></script>
<script src="solifvp.js"></script>
<!-- Scenario specifics -->
<script src="solifscenario4.js"></script>
<!-- Stylehseet -->
<link rel="stylesheet" href="wifmobile.css">
<!-- Fonts -->
<link href="https://fonts.googleapis.com/css?family=Anton|Russo+One|Fanwood+Text|UnifrakturCook:700" rel="stylesheet">
</head>
<body onclick="BodyReset(event);" onkeydown="BodyKeydown(event);">
<!-- Login / registration / forgotpassword page-->
<div id="signin">
<div class="banner"><img src="img/icon/wiflogo.png" style="max-width:75%;" /></div>
<div id="login">
<input type="text" name="login-username" id="login-username" placeholder="User name" autocomplete="username">
<input type="password" name="login-password" id="login-password" placeholder="Password" autocomplete="current-password">
<a onclick="NewSignIn();" id="NewSignInButton">Login</a>
<a onclick="GotoRegister();" class="things">>> Register</a>
<a onclick="GotoForgot();" class="things">>> Forgot your password?</a>
</div>
</div>
</body>
</html>`
这绝对是javascript代码中的一个错误。也就是说,由于我使用的是旧设备(平板电脑必须是 2010 年初的),webview 不符合 Javascript ECMAScript 6。相反,您应该确保您的代码符合 Javascript ECMAScript 5。
这包括(这些是我在代码中发现的主要错误):
1) 不要在函数中使用默认参数声明。而不是:
function myFunction(myParam='hello'){
...
}
使用:
function myFunction(myParam){
myParam=myParam || 'hello';
...
}
2) 您的函数不应与 html 中的 id 保持相同的 "name"(区分大小写)。例如不要这样做:
<a id="MyLink" onclick="MyLink();">My link</a>
但是这样做:
<a id="MyLink" onclick="myLink();">My link</a>
3) 如果像我一样,你不是该死的专家,请准备好测试你代码的每一行,因为即使像 console.clear() 这样简单的东西也不合规。
我会编辑这个 post,因为我发现了一些更明显的错误。