Android WebView 使用loadUrl方法执行本地JavaScript
因为Android的WebView类没有像Qt里面的QWebFrame,有一个类似evaluateJavaScript的方法,所以一直以来我都以为Android没办法像Qt一样,可以在加载远程网页之后再注入本地的JavaScript在当前网页内部的JavaScript虚拟机中运行。而注入本地JavaScript的能力对编写一些Web&Native Hybird App还是很有帮助的。
刚好今天看了Android Developer的一篇文章:Introducing Android WebDriver,介绍了WebDriver的使用,发现WebDriver可以在某种程度上在Java端操作页面内的DOM树,所以很好奇它实现的机制。跟踪了一下源码发现,WebDriver是通过loadUrl方法将一段JavaScript注入已经加载的页面内执行,Url使用javascript schema,就是类似javascript:…code…这样的语句,再通过WebView对在JavaScript虚拟机内访问绑定的Java对象的支持,把DOM树的数据暴露给外部的Java代码,达成Java和JavaScript之间的互相通信。
既然WebView提供了这样的支持,在Android平台上基于WebView编写Hybird App就更容易了。
红心地瓜 10:22 上午 on 2月 24, 2012 固定链接 |
qt里面evaluteJavaScript是在页面加载还没开始排版的时候执行注入脚本的,android里面要怎么找到这个点呢?我看WebDriver的介绍里面是自己去下页面的,如果是用WebView加载页面,那在那里执行注入脚本,onPageFinished?好像没有一个比较合理的点,让应用介入。而且重load会加载到历史记录里面吧,跟qt的evaluateJavaScript还是不大一样
Roger 10:33 上午 on 2月 24, 2012 固定链接 |
WebView loadUrl方法执行本地JS是在页面加载结束后,Qt的其实也一样,QWebElement,QWebFrame一般也是加载页面结束后,加入本地对象到JS环境中,再运行本地JS脚本,构成hybird形式的App。
Fish 5:01 下午 on 11月 5, 2012 固定链接 |
在Webview添加一个WebviewChromeClient对象,在WebviewChromeClient类里面的OnTitleReceive()的时候调用本地js,时机刚刚好。
Daniel 2:28 下午 on 4月 4, 2014 固定链接 |
I have two questions:
1.Is there a chance to inject javcascript after all page including all resources are loaded?onPageFinished is not exact point.
2.I found that when the content was changed by injection will rolled back after some navigation and come back.It looks the webview load the original content ,how to make our update cached and let webview loaded from cache?
Appreciate for any ideas.