Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Android 4.4.2(API 19)仿真器上生成未捕获TypeError和未捕获ReferenceError错误的WebView代码_Javascript_Android_Webview_Android Emulator_Mathjax - Fatal编程技术网

Javascript 在Android 4.4.2(API 19)仿真器上生成未捕获TypeError和未捕获ReferenceError错误的WebView代码

Javascript 在Android 4.4.2(API 19)仿真器上生成未捕获TypeError和未捕获ReferenceError错误的WebView代码,javascript,android,webview,android-emulator,mathjax,Javascript,Android,Webview,Android Emulator,Mathjax,在Android 4.4.2 KitKat(API 19)仿真器上运行时,我的代码有问题 当我在Android 4.3(API 18)仿真器上模拟我的项目时,它工作正常,并使用MathJax创建数学表达式: 但当我使用Android 4.4.2模拟器时,应用程序无法正常工作: 以下是我的项目代码: package com.testes.testesapp; import android.app.Activity; import android.graphics.Color; import

在Android 4.4.2 KitKat(API 19)仿真器上运行时,我的代码有问题

当我在Android 4.3(API 18)仿真器上模拟我的项目时,它工作正常,并使用MathJax创建数学表达式:

但当我使用Android 4.4.2模拟器时,应用程序无法正常工作:

以下是我的项目代码:

package com.testes.testesapp;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity implements View.OnClickListener {

    private int exampleIndex = 0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        WebView webView = (WebView) findViewById(R.id.webview);
        webView.getSettings().setJavaScriptEnabled(true);
        //webView.getSettings().setBuiltInZoomControls(true);
        webView.loadDataWithBaseURL("http://test", "<script type='text/x-mathjax-config'>"
                              + "MathJax.Hub.Config({ " 
                              + "showMathMenu: false, "
                              + "jax: ['input/TeX','output/HTML-CSS'], " // output/SVG
                              + "extensions: ['tex2jax.js','toMathML.js'], " 
                              + "TeX: { extensions: ['AMSmath.js','AMSsymbols.js',"
                              + "'noErrors.js','noUndefined.js'] }, "
                              // + "'SVG' : { blacker: 30, "
                              // + "styles: { path: { 'shape-rendering': 'crispEdges' } } } "
                              + "});</script>"
                              + "<script type='text/javascript' "
                              + "src='file:///android_asset/MathJax/MathJax.js'"
                              + "></script>"
                              + "<span id='math'></span>","text/html","utf-8","");
        EditText edit = (EditText) findViewById(R.id.edit);
        edit.setBackgroundColor(Color.LTGRAY);
        edit.setTextColor(Color.BLACK);
        edit.setText("");
        Button btnShow = (Button) findViewById(R.id.btnShow);
        btnShow.setOnClickListener(this);
        Button btnClear = (Button) findViewById(R.id.btnClear);
        btnClear.setOnClickListener(this);
        Button btnExample = (Button) findViewById(R.id.btnExample);
        btnExample.setOnClickListener(this);
    }

    private String doubleEscapeTeX(String s) {
        String t="";
        for (int i=0; i < s.length(); i++) {
            if (s.charAt(i) == '\'') t += '\\';
            if (s.charAt(i) != '\n') t += s.charAt(i);
            if (s.charAt(i) == '\\') t += "\\";
        }
        return t;
    }

    private String getExample(int index) {
        return getResources().getStringArray(R.array.tex_examples)[index];
    }

    public void onClick(View v) {
        if (v == findViewById(R.id.btnShow)) {
            WebView webView = (WebView) findViewById(R.id.webview);
            EditText edit = (EditText) findViewById(R.id.edit);
            webView.loadUrl("javascript:document.getElementById('math').innerHTML='\\\\["
                            + doubleEscapeTeX(edit.getText().toString()) + "\\\\]';");
            webView.loadUrl("javascript:MathJax.Hub.Queue(['Typeset',MathJax.Hub]);");
        }
        else if (v == findViewById(R.id.btnClear)) {
            WebView webView = (WebView) findViewById(R.id.webview);
            EditText edit = (EditText) findViewById(R.id.edit);
            edit.setText("");
            webView.loadUrl("javascript:document.getElementById('math').innerHTML='';");
        }
        else if (v == findViewById(R.id.btnExample)) {
            WebView webView = (WebView) findViewById(R.id.webview);
            EditText edit = (EditText) findViewById(R.id.edit);
            edit.setText(getExample(exampleIndex++));
            if (exampleIndex > getResources().getStringArray(R.array.tex_examples).length - 1) 
                exampleIndex=0;
            webView.loadUrl("javascript:document.getElementById('math').innerHTML='\\\\["
                            + doubleEscapeTeX(edit.getText().toString()) + "\\\\]';");
            webView.loadUrl("javascript:MathJax.Hub.Queue(['Typeset',MathJax.Hub]);");
        }
    }

}

我不知道如何解决这个问题,希望有人能帮我解决这个问题。谢谢。

当我将不同的javascript函数从主页移到一个单独的.js文件时,我遇到了同样的问题。由于某些原因,Android无法从Java中找到外部加载的JavaScript webview函数——只有主页中的函数。一旦我将函数从JS文件中移回,它立即开始工作

尝试直接在主HTML中创建这样的“代理”函数:

function proxy() {
    call_some_other_function_from_JS_file();
}

这对我有用。我肯定有办法找到这些函数,因为我在iOS上没有这个问题。如果你知道更好的方法,请有人评论。

我也遇到了这个问题

以下是我的解决方案:

  • 更改您的基本URLhttp://test“
    ”http://test/“
  • 将此代码
    webView.loadUrl(…)
    更改为
    webView.evaluateJavascript(…)。特别是对于要加载innerHTML的代码。别忘了添加anotation
    @TargetApi(Build.VERSION\u CODES.KITKAT)
    ,因为它只适用于Android 4.4及以上版本
  • 切勿将
    webView.loadWithBaseUrl(..)
    放在与
    webView.loadUrl(..)
    相同的过程中。因为如果
    webView.loadUrl(…)
    webView.loadWithBaseUrl(…)
    完成之前加载,它将引发如上所述的错误 对于数字3,您的代码已经符合此要求(因为在您的代码中,
    webView.loadUrl(..)
    执行已通过使用
    OnClick
    事件与
    webView.loadWithBaseUrl(..)
    分开。因此,请不要注意它

    <> P>但是如果你的应用程序需要在一个事件中加载它们,考虑使用这个代码将它们分开: `

    private void initiateWebView(){
    webViewEquationDisplay.setWebViewClient(新的WebViewClient(){
    @凌驾
    公共void onPageFinished(WebView视图,字符串url){
    super.onPageFinished(视图、url);
    if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.KITKAT){
    loadUrlKitKat(等式SYMBOLFINAL+等式BEDISPLAYDFINAL);
    }
    否则{
    webViewEquationDisplay.loadUrl(“javascript:document.getElementById('math')。innerHTML='``+equationToBeDisplayedFinal+'`;”);
    }
    webviewequalationdisplay.loadUrl(“javascript:MathJax.Hub.Queue(['Typeset',MathJax.Hub]);”;
    }
    });
    最终字符串mathJaxOfflineUrl=”file:///android_asset/MathJax/MathJax.js";            
    webViewEquationDisplay.loadDataWithBaseURL(“http://bar/", ""
    +“MathJax.Hub.Config({”
    +showMathMenu:错误
    +“jax:['input/ascimath','output/HTML-CSS'],”
    +“扩展:['asciimath2jax.js'],”
    +AsciiMath:{fixphi:true,useMathMLspacing:true,displaystyle:false,小数点:\“\”}
    +"});"
    +“,”文本/html“,”utf-8“,”);
    }
    @TargetApi(Build.VERSION\u code.KITKAT)
    私有void loadUrlKitKat(字符串参数){
    webViewEquationDisplay.evaluateJavascript(“javascript:document.getElementById('math')。innerHTML='`+param+“`';”,null);
    }
    
    `

    祝你好运

    webview.evaluateJavascript(“javascript:document.getElementById('math')。innerHTML=”
    “+doubleEscapeTeX(questn)+“
    ”;”,null)

    loadUrl(“javascript:MathJax.Hub.Queue(['Typeset',MathJax.Hub]);”


    这是api 19或更高版本的解决方案

    这是KitKat问题的最佳答案!谢谢,Dimas什么是“等式SYMBOLFinal”在代码中提到?找出这个问题,解决它。使用:-如果应用程序的目标是棒棒糖或更高,默认的web视图行为是完全拒绝混合内容。由于mobile connect要求在标题充实期间使用HTTP,我们需要更宽松的安全设置。如果(Build.VERSION.SDK_INT>=Build.VERSION_code.LOLLIPOP){webView.getSettings().setMixedContentMode(WebSettings.MIXED_‌内容兼容性‌Y_模式);}
    function proxy() {
        call_some_other_function_from_JS_file();
    }
    
    private void initiateWebView(){
    
        webViewEquationDisplay.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
    
                if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
                    loadUrlKitKat(equationSymbolFinal+equationToBeDisplayedFinal);
                }
                else{
                    webViewEquationDisplay.loadUrl("javascript:document.getElementById('math').innerHTML='<font color=\"yellow\">`"+equationToBeDisplayedFinal+"`</font>';");
                }
    
                webViewEquationDisplay.loadUrl("javascript:MathJax.Hub.Queue(['Typeset',MathJax.Hub]);");
            }
        });
    
        final String mathJaxOfflineUrl = "file:///android_asset/MathJax/MathJax.js";            
        webViewEquationDisplay.loadDataWithBaseURL("http://bar/", "<script type='text/x-mathjax-config'>"
                +"MathJax.Hub.Config({ " 
                    +"showMathMenu: false, "
                    +"jax: ['input/AsciiMath','output/HTML-CSS'], "
                    +"extensions: ['asciimath2jax.js'], " 
                    +"AsciiMath: { fixphi: true, useMathMLspacing: true, displaystyle: false, decimalsign: \".\" }, "
                  +"});</script>"
                +"<script type='text/javascript' "
                  +"src='"+mathJaxOfflineUrl+"'"
                  +"></script><span id='math'></span>","text/html","utf-8","");
    }
    
    
    @TargetApi(Build.VERSION_CODES.KITKAT)
    private void loadUrlKitKat(String param){
        webViewEquationDisplay.evaluateJavascript("javascript:document.getElementById('math').innerHTML='<font color=\"#97FD97\">`"+param+"`</font>';",null);
    }