javascript Uncaught ReferenceError: myFunction is not defined at null:1 Android exception in webview

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/17633930/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-27 09:01:59  来源:igfitidea点击:

Uncaught ReferenceError: myFunction is not defined at null:1 Android exception in webview

javascriptandroidwebview

提问by Shantanu Banerjee

I am calling javascript function from an activity but I am getting Uncaught ReferenceError: myFunction is not defined at null:1error. Here is my files

我正在从活动中调用 javascript 函数,但Uncaught ReferenceError: myFunction is not defined at null:1出现错误。这是我的文件

MainActivity.java

主活动.java

package com.example.androidexample;

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.view.Menu;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        WebView webview = (WebView)this.findViewById(R.id.webView1);
        WebSettings webSettings = webview.getSettings();

        // Enable Javascript for interaction
        webSettings.setJavaScriptEnabled(true);

        // Make the zoom controls visible
        webSettings.setBuiltInZoomControls(true);

        // Allow for touching selecting/deselecting data series
        webview.requestFocusFromTouch();

        // Set the client
        webview.setWebViewClient(new WebViewClient());
        webview.setWebChromeClient(new WebChromeClient());


        //webview.loadUrl("file:///android_asset/test.html");

        /*String str = "<books>" +
                "<book title=\"A Tale of Two Cities\"/>" +
                "<book title=\"1984\"/>" +
                "</books>";*/




        webview.loadUrl("file:///android_asset/test.html");
        webview.loadUrl("javascript:myFunction()");
        //webview.loadUrl("javascript:myFunction("+str+")");

    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }    
}

test.html

测试.html

<html>
<body>
<script type="text/javascript" src="marknote.js"></script>
<script type="text/javascript">
function myFunction()
{
var str = '<books><book></book></books>';
var parser = new marknote.Parser();
var doc = parser.parse(str);

var bookEls = doc.getRootElement().getChildElements();

    for (var i=0; i<bookEls.length; i++) {
        var bookEl = bookEls[i];

        alert("Element name is " + bookEl.getName());
    }
}
</script>

</body>
</html>

I have seen this error occurred when I am using webview.loadUrl("javascript:myFunction()");. I want to pass a xml string from java and parse it into javascript. Please help me to find a solution.

我在使用webview.loadUrl("javascript:myFunction()");. 我想从 java 传递一个 xml 字符串并将其解析为 javascript。请帮我找到解决办法。

回答by AlexBcn

You should execute the javascript when the page is loaded

您应该在页面加载时执行 javascript

webview.setWebViewClient(new WebViewClient(){
    public void onPageFinished(WebView view, String url){   
        webview.loadUrl("javascript:myFunction()");
    }           
});

The code will be executed and will find your javascript function. The way you are doing now does not wait.

代码将被执行并找到您的 javascript 函数。你现在正在做的事情不会等待。

回答by Shantanu Banerjee

This one worked just need to change parameter set up sequence

这个工作只需要改变参数设置顺序

package com.example.androidexample;

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.view.Menu;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final WebView webview = (WebView)this.findViewById(R.id.webView1);
        WebSettings webSettings = webview.getSettings();

        // Enable Javascript for interaction
        webSettings.setJavaScriptEnabled(true);

        // Make the zoom controls visible
        webSettings.setBuiltInZoomControls(true);

        // Allow for touching selecting/deselecting data series
        webview.requestFocusFromTouch();

        // Set the client
//        webview.setWebViewClient(new WebViewClient());
//        webview.setWebChromeClient(new WebChromeClient());




        final String str = "<books>" +
                "<book title=\"A Tale of Two Cities\"/>" +
                "<book title=\"1984\"/>" +
                "</books>";



//        webview.loadUrl("file:///android_asset/test.html");

        webview.setWebChromeClient(new WebChromeClient());
        webview.setWebViewClient(new WebViewClient() 
        {

            public void onPageFinished(WebView view, String url)
            {
                webview.loadUrl("javascript:myFunction('"+str+"')");
            }
        }
            );
        webview.loadUrl("file:///android_asset/test.html");

    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }    
}