NewsNing
NewsNing
  • 发布:2015-08-27 11:05
  • 更新:2015-08-27 18:03
  • 阅读:1701

【webview外网问题】这里写下自己的一点东西

分类:HTML5+

本人遇到一个问题,就是取到外网页面中js的变量,开始了坑路

2015-08-27 11:05 负责人:无 分享
已邀请:
NewsNing

NewsNing (作者) - 天行键

第一种:想在webview中执行js代码来实现把js变量保存在本地

				one.loadURL(no2Src);//one是我新建的一个webview,no2Src是一个外网		  
				plus.storage.clear();//清空数据  
				alert(plus.storage.getLength());//因为清空了数据  所以显示0				  
				var js = "plus.storage.setItem('yy','123123123123');";				  
				one.evalJS(js);//执行  
				alert(plus.storage.getLength());//这里还是显示0				  
				alert(plus.storage.getItem('yy'));//数据也为空				  
				//方法失败
NewsNing

NewsNing (作者) - 天行键

第二种:在webview中执行window.localStorage的原生js代码

				one.loadURL(no2Src);//one是我新建的一个webview,no2Src是一个外网		  
				window.localStorage.clear();//清空数据  
				alert(window.localStorage.length);//因为清空了数据  所以显示0				  
				var js = "window.localStorage.setItem('tt', '1100');";				  
				one.evalJS(js);//执行  
				alert(window.localStorage.length);//这里还是显示0				  
				alert(window.localStorage.getItem('tt'));//数据也为空				  
				//方法失败
NewsNing

NewsNing (作者) - 天行键

第三种:脑洞大开,向webview里面的添加代码<script src="xxxxxx/mui.min.js"></script>
然后去调用plus去执行保存的代码

plus.storage.clear();//清空数据  
            alert(plus.storage.getLength());//因为清空了数据  所以显示0  
              
            var addjs = "var script = document.createElement('script');script.src = 'http://firday.sinaapp.com/coolwin/mui.min.js';document.querySelector('head').appendChild(script);";//需要添加<script>标签  
			//console.log(addjs);  
			var js = "var script1 = document.createElement('script');script1.innerHTML=\"mui.plusReady(function() {plus.storage.setItem(\'yy\',\'123123123123\');});\";document.querySelector('head').appendChild(script1);";  
			//var js ="<script>mui.plusReady(function() {alert('xxx');});<\/script>";//需要执行的js代码  
			   
			one.evalJS(addjs);//向webview插入添加script标签的代码  
			one.evalJS(js);//执行代码  
			  
			  
			alert(plus.storage.getLength());//显示0     
			//又失败
NewsNing

NewsNing (作者) - 天行键

我就日了

NewsNing

NewsNing (作者) - 天行键

现在还有2种想法:1:脑洞打开,在第三种基础上发送参数到自己的服务器,然后取到值。2:用原生的方法调用返回值。

这2种方式暂时木有尝试

chender

chender - 与人为善

基本功不扎实啊,evalJS是异步的,所以马上取值肯定是空,你setTimeout试一下

  • NewsNing (作者)

    好,我去试试,忘了蔗渣


    2015-08-27 13:02

NewsNing

NewsNing (作者) - 天行键

用经过一顿折腾,改善了一下第三种方法

			plus.storage.clear();//清空数据  
            alert(plus.storage.getLength()+"  "+plus.storage.getItem('qwe'));//因为清空了数据  所以显示 0 null               
            var addjs = "var script = document.createElement('script');script.src = 'http://firday.sinaapp.com/coolwin/mui.min.js';document.querySelector('head').appendChild(script);";//需要添加<script>标签  
			  
			var js = "var script1 = document.createElement('script');script1.innerHTML=\"plus.storage.setItem('qwe','ddd');\";document.querySelector('head').appendChild(script1);";//需要执行的<scriptb>标签  
			   
			one.evalJS(addjs);//向webview插入添加script标签的代码  
			one.evalJS(js);//执行代码  
     
			alert(plus.storage.getLength()+"  "+plus.storage.getItem('qwe'));  //0 ddd  
			//既然提示了0个长度,却又为什么可以找到'qwe'这个key的值?

我有点奇怪

NewsNing

NewsNing (作者) - 天行键

成功啦!

plus.storage.clear();//清空数据  
            alert(plus.storage.getLength()+"  "+plus.storage.getItem('qwe'));//因为清空了数据  所以显示 0 null               
            var addjs = "var script = document.createElement('script');script.src = 'http://firday.sinaapp.com/coolwin/mui.min.js';document.querySelector('head').appendChild(script);";//需要添加<script>标签  
			   
			var js = "var script1 = document.createElement('script');script1.innerHTML=\"plus.storage.setItem('qwe','ddd');\";document.querySelector('head').appendChild(script1);";//需要执行的<scriptb>标签  
			   
			one.evalJS(addjs);//向webview插入添加script标签的代码  
			one.evalJS(js);//执行代码  
   			setTimeout(function(){  
   				alert(plus.storage.getLength()+"  "+plus.storage.getItem('qwe'));  //1 ddd  
   			},300);//娃哈哈,忘了异步得延迟了。现在能够显示 1 ddd,这比逼是极好的  
			  
			//成功调用   感谢大家

感谢@chender 提醒

hilongjw

hilongjw - cov

异步问题,你这样这是在理想网速下,如果超过0.3s没加载完成呢。可以写一个callback来触发

  • NewsNing (作者)

    @3553 具体怎么实现呢


    2015-08-27 17:54

chender

chender - 与人为善

这个和网速没关系,和手机性能有关系;
你要在baidu里面注入的那一段js代码里面再加一句:plus.webview.parent().evalJs("xxxx")通知父页面

该问题目前已经被锁定, 无法添加新回复