Android Webview - Uncaught ReferenceError в локальном исполнении JavaScript - PullRequest
0 голосов
/ 27 декабря 2018

Привет всем и спасибо за вашу помощь!

Я хочу создать приложение Android Webview, оно использует HTML + CSS + javascript без какой-либо библиотеки, кроме старшей.Он отлично работает в кросс-браузерном режиме, когда я пытаюсь использовать файлы на сервере.

Я хочу, чтобы как можно больше файлов работало локально на стороне клиента: HTML, CSS, все ресурсы (изображения) иКоды javascript находятся в приложении, оставляя только файлы php на сервере (логин, вход и т. д.).

К сожалению, когда я пробую свое приложение на Android, я получаю ошибки при определении функций javascript дляэкземпляр: 12-27 10: 04: 42.075 17798-17798 / com.wifcompanion.wifcompanion D / WiFCompanionConsole: Uncaught ReferenceError: BodyReset не определен - из строки 22 файла: ///android_asset/wifmobile.html

Моей первой интуицией было то, что файлы .js не были загружены должным образом.Поэтому я поместил весь код js прямо под тегом в wifmobile.html.Безрезультатно.

Более того, кажется, что некоторые функции найдены (например, NewSignIn (), когда я нажимаю на кнопку входа на первой странице), а другие нет (например, PopupSave (), чтофункция, вызываемая в NewSignIn ()).

Ближайший вопрос, который я мог бы найти по stackoverflow, здесь, но не имеет никакого ответа: JavaScript не работает с Android WebView, Uncaught ReferenceError

MainActivity:

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">&gt;&gt; Register</a>
<a onclick="GotoForgot();" class="things">&gt;&gt; Forgot your password?</a>
</div>
</div>
</body>
</html>`

1 Ответ

0 голосов
/ 21 января 2019

Это определенно ошибка в коде javascript .А именно, поскольку я использую старое устройство (планшет должен быть с начала 2010-х годов), веб-просмотр не совместим с Javascript ECMAScript 6 .Вместо этого вы должны убедиться, что ваш код соответствует Javascript ECMAScript 5 .

Это включает в себя (это основные ошибки, которые я обнаружил в своем коде):

1) Донне использовать объявление параметров по умолчанию в функциях.Вместо:

    function myFunction(myParam='hello'){
        ...
    }

Использование:

    function myFunction(myParam){
        myParam=myParam || 'hello';
        ...
    }

2) Ваши функции не должны содержать того же «имени» (с учетом регистра), что и идентификатор в вашем html.Например, не делайте этого:

    <a id="MyLink" onclick="MyLink();">My link</a>

Но сделайте это:

    <a id="MyLink" onclick="myLink();">My link</a>

3) Если, как и я, вы не чертовски профессионал, приготовьтесь протестировать каждую строкувашего кода, потому что даже некоторые простые вещи, такие как console.clear () не были совместимы.

Я отредактирую этот пост, когда найду более очевидные ошибки.

...