android4.4 webview调用javascript出现Uncaught ReferenceError: is not define或者has no method

这几天用Nexus5 4.4.4系统做一个简单的手机设备号获取,然后调用javascript显示在网页里的功能,以前做过n多类似的程序,结果程序一运行啥问题都出来了,呵呵

[INFO:CONSOLE(1)] "Uncaught ReferenceError: is not define

 I/chromium(490): [INFO:CONSOLE(1)] "Uncaught SyntaxError: Unexpected token ILLEG

 [Android] Web Console: Uncaught TypeError: Object [object Object] has no method 'xxx'


总结来看就是上述问题,先看代码吧


demo.html

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title>

</head>


      <script>
      
      function getDeviceID(info){

		alert("设备号:"+info);    	
      	//document.write("设备号:"+info);
      	return "good.";
    	
      }
     
      </script>
        <body>       
            <a href="http://www.baidu.com" target="_blank">       
				href="http://www.baidu.com" 打开baidu      
            </a>     
            
            <br/>
             <br/>
              
            
           <a href="http://www.baidu.com/closeappwin" target="_blank">       
				href="http://www.baidu.com/closeappwin" 关闭浏览器closeappwin      
           </a>   
           
             <br/>
             <br/>
           
           
           <a href="new://www.sohu.com/" target="_blank">       
				href="new://www.sohu.com/"  在当前浏览器打开一个子浏览器new subwindow      
           </a>  
           
             <br/>
             <br/>
             
           
        </body>       
</html> 



看看我的android 代码如下:

	private void loadUrl(){
		String key="";
		String androidID="";
		try{
			androidID = Secure.getString(getContentResolver(),Secure.ANDROID_ID);
			Log.d(TAG, "androidID:"+androidID);

		}catch(Exception e){
			Log.e(TAG, "");
		}finally{
			String script=String.format("javascript:getDeviceID('"+androidID+"')");
			
			mWebview.evaluateJavascript(script, new ValueCallback<String>() {

				  @Override
				  public void onReceiveValue(String value) {
				      Log.d(TAG, "onReceiveValue value=" + value);
				      
				      if(value!=null){
				    	  flag_get_deviceid=true;
				      }
				  }});
			//mWebview.loadUrl("javascript:getDeviceID('maomao')");

		}
	}

当loadUrl方法在activity的oncreate方法里,mWebview.loadUrl("file:///android_asset/demo.html"); 执行之后调用loadUrl();

基本上就出现上面的错误了,我想是不是4.4的系统在写法上跟低版本不一样,还是用了2种调用方式:

mWebview.evaluateJavascript
mWebview.loadUrl("javascript:getDeviceID('maomao')");

那最后的判断就是一种可能: 调用getDeviceID 方法的时候,js没有加载完毕。

解决办法

	private class WebViewClientDemo extends WebViewClient {
		@Override
		public boolean shouldOverrideUrlLoading(WebView view, String url) {
			Log.d(TAG, " url:"+url);
			
			
			view.loadUrl(url);// 当打开新链接时,使用当前的 WebView,不会使用系统其他浏览器
			return true;
		}
		
		@Override
		  public void onPageFinished(WebView view, String url) {
		      super.onPageFinished(view, url);
		      //在这里执行你想调用的js函数
		      if(!flag_get_deviceid){
		    	  loadUrl();
		      }
		  }
	}

我们在 onPageFinished的时候,全部的js肯定都加载完毕了,这时候再执行loadUrl方法,就可以啦。


最后顺便提一下 webview.evaluateJavascript的好处,这个方法,可以把js函数的return结果获取到:

mWebview.evaluateJavascript(script, new ValueCallback<String>() {

				  @Override
				  public void onReceiveValue(String value) {
				      Log.d(TAG, "onReceiveValue value=" + value);
				      
				      if(value!=null){
				    	  flag_get_deviceid=true;
				      }
				  }});


  • 加入CSDN技术群:221057495 与我交流

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
如果在使用ECharts时出现"Uncaught ReferenceError: setData is not defined"错误,这通常是由于JavaScript函数没有正确加载导致的。请确保按照以下步骤检查和解决问题: 1. 确保你的HTML文件中正确引入了ECharts库。在HTML文件的<head>标签中添加以下代码,以引入ECharts库: ```html <script src="https://cdn.jsdelivr.net/npm/echarts@4.9.0/dist/echarts.min.js"></script> ``` 2. 确保在调用`evaluateJavascript()`方法之前,HTML文件已经加载完成。可以在WebView的`WebViewClient`中的`onPageFinished()`方法中执行JavaScript代码,以确保HTML文件已经加载完成。例如: ```java webView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); webView.evaluateJavascript("setData(" + getData() + ")", null); } }); ``` 3. 检查setData函数是否正确定义在HTML文件中,并确保没有拼写错误。在你的HTML文件中,确保有一个名为setData的JavaScript函数,用于接收数据并渲染图表。例如: ```html <script> function setData(data) { // 解析数据 var parsedData = JSON.parse(data); // 创建图表实例 var chart = echarts.init(document.getElementById('chart')); // 定义图表配置项 var option = { xAxis: {}, yAxis: {}, series: [{ type: 'line', data: parsedData }] }; // 使用配置项显示图表 chart.setOption(option); } </script> ``` 确保在调用`evaluateJavascript()`时,函数名和参数与HTML文件中的定义一致。 通过检查以上步骤,你可以解决"Uncaught ReferenceError: setData is not defined"错误,并成功在Android应用中使用ECharts显示图表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风口猪炒股指标

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值