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 与我交流
时间: 2024-10-11 20:51:17

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

webview调用javascript脚本无反应

最近遇到一个问题:在html中有一段javascript脚本定义了一个方法,在使用webview.loadUrl("javascript:方法名()")时方法未执行,后来 查资料发现是因为webview在加载html到页面是需要一定时间的虽然很短,如果html整个未加载完成会出现调用javascript的方法失败,提示找 不到方法定义对象的log信息.所以我们需要在页面完全加载完成后再回调webview.loadUrl("javascript:方法名()").这里可

Qt webview调用JavaScript 带参函数

void MainWindow::on_pushButtonShowMarker_clicked() { QString lat = "104.701681"; QString lon = "31.535617"; //ui->webViewMap->page()->mainFrame().evaluateJavaScript("addMarker()"); // double w=lat.toDouble(); // doub

Uncaught ReferenceError: is not defined

今天,遍历一个HashSet集合对象,想用链接绑定集合对象的值,通过POST方式提交到控制器.结果程序无反应,按F12键进入调试模式,谷歌总是提示Uncaught ReferenceError:   is not defined这个错误. 原来是虽然是传递的值,但是在函数传参的时候也要加引号,加上引号后就不会提示 Uncaught ReferenceError:   is not define 了. View : @using MajorConstruction.Helpers; @{ View

【转】WebView的JavaScript与本地代码三种交互方式

WebView的漏洞分析 漏洞产生的原因 最近在开发过程中遇到一个问题,就是 WebView 使用的时候,还是需要解决之前系统(4.2之前)导致的一个漏洞,虽然现在这个系统版本用户很少了,但是也不能忽视,关于这个漏洞,这里就不多做解释了,可能有的同学早就了解了,本来想写一篇文章详细介绍一下,但是网上的知识太多了,而且都很详细,就没弄了,这里大致简单明了的说几句: 漏洞产生的原因 这个漏洞导致的原因主要是因为Android中 WebView 中的 JS访问本地方法 的方式存在缺陷,我们做过交互的都

Android Webview 和Javascript交互,实现Android和JavaScript相互调用

在Android的开发过程中.遇到一个新需求.那就是让Java代码和Javascript代码进行交互.在IOS中实现起来很麻烦.而在Android中相对来说容易多了.Android对这种交互进行了很好的封装.我们可以很简单的用Java代码调用WebView中的js函数.也可以用WebView中的js来调用Android应用中的Java代码. 案例主要包含了: Html中调用Android方法 Android调用JS方法无参数 Android调用JS方法有参数 Android调用JS方法有参数且有

Android中和javascript交互报:android Uncaught ReferenceError:

可能原因如下: 1.HTML页面上的javascript写的有问题,可以先在HTML上调试排除语法等问题: 2.使用webView.loadUrl调用的时候字符串要拼写正确,尤其是传入参数时,格式可以如下: webView.loadUrl("javascript:showData('"+json+"')"); 3.调用的时候可能HTML页面还没有加载完毕,使用Handler的post方法里,例如: private Handler mHandler = new Han

javascript Uncaught ReferenceError: 方法名 is not defined

前言: 那天我犯了这样一个低级错误,如果按照这样下去,根本在这条路上走不远.错的太离谱,把代码拿出来自己笑笑,等摆脱菜鸟之名的时候再回来好好的告诉自己,都是这么过来的,原来以前我菜的这么离谱.. 错误起因不说了,真的不该这样子的.回顾一下故事,故事是这么发生的,在一个阳光明媚的下午,天空飘起来毛毛细雨,对面走来了一个婀娜多姿的美女,啪啪啪,哐当,耶,美女摔倒了,没有伸手,也没有回头,我径直的走了. <button onclick="test()">按钮</button

Android webview 退出关闭声音 网页调用javascript

关闭声音,目前没有好的办法,可以参考网络上的实用webview.reload(); @Override protected void onResume() { // TODO Auto-generated method stub mWebView.onResume(); if (commonDialog != null) { commonDialog.dismiss(); } super.onResume(); } @Override protected void onPause() { //

Android:WebView与Javascript交互(相互调用参数、传值)

Android中可以使用WebView加载网页,同时Android端的java代码可以与网页上的javascript代码之间相互调用. 效果图: (一)Android部分: 布局代码: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_widt