将javascript注入WebChromeClient
Posted
技术标签:
【中文标题】将javascript注入WebChromeClient【英文标题】:Inject javascript into WebChromeClient 【发布时间】:2013-10-29 21:36:59 【问题描述】:我知道,您可以将 javascript 注入 android WebView。我已经这样做了。但是,我加载了一个 html5/javascript 网络应用程序(不是我自己的,所以我无法访问代码)并且我需要注入额外的 javascript。但是这个 Web 应用程序在标准 WebView 中不能正常工作。原因大概是:
“默认情况下,WebView 不提供类似浏览器的小部件,不启用 JavaScript 并且忽略网页错误。”http://developer.android.com/reference/android/webkit/WebView.html
所以,我启用了 Javascript,但这可能是因为它忽略了网页错误。然而,在普通的 Chrome 浏览器中,一切正常,没有任何问题。
虽然我已经启用了很多东西,但 webview 不起作用:
webView = (WebView) findViewById( R.id.webView );
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setPluginState(PluginState.ON);
webView.getSettings().setDomStorageEnabled(true);
webView.setBackgroundColor(0x00000000);
webView.setWebChromeClient( new WebChromeClient() );
webView.setWebViewClient( new WebViewListener() );
CookieManager.getInstance().setAcceptCookie(true);
那么,是否有可能将 javascript 注入到普通的 WebChromeClient 中? 或者你有什么其他的猜测我可以启用或注入 webview 吗?
【问题讨论】:
你需要解释它到底是怎么不工作的。 另见***.com/a/6475858/32453 这可能有助于拨打您的电话github.com/cprcrack/VideoEnabledWebView 【参考方案1】:首先,您需要使用从 WebViewClient 派生的类来设置 WebViewClient:
WebView webview = new WebView();
webview.setWebViewClient(new WebClient());
webview.loadUrl("***.com");
然后在 WebClient 中,您等待页面加载(onPageFinished)。然后你 loadUrl("javascript:[your javascript here]").
public class WebClient extends WebViewClient
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
view.loadUrl(url);
return true;
@Override
public void onPageFinished(WebView view, String url)
// Obvious next step is: document.forms[0].submit()
view.loadUrl("javascript:document.forms[0].q.value='[android]'");
【讨论】:
谢谢。如果您查看我上面的代码,您会发现我已经完全做到了这一点。但是,它不起作用,因为 webview 不是完全兼容的浏览器。我的问题也是:“将 javascript 注入 WebChromeClient”而不是 WebViewClient。也许你应该先阅读我的问题。因此-1【参考方案2】:记得要执行不同的 JavaScript 相关任务,因此需要启用一堆选项,甚至设置浏览器类型......这是那些配置选项:
webView.setWebChromeClient(webChromeClient);
webView.setWebViewClient(new InsideWebViewClient(getBaseContext(), webView));
WebSettings settings = webView.getSettings();
settings.setAllowUniversalAccessFromFileURLs(true);
settings.setBuiltInZoomControls(false);
settings.setUseWideViewPort(true);
settings.setJavaScriptEnabled(true);
settings.setSupportMultipleWindows(true);
settings.setJavaScriptCanOpenWindowsAutomatically(true);
settings.setLoadsImagesAutomatically(true);
settings.setDomStorageEnabled(true);
settings.setLoadWithOverviewMode(true);
settings.setMediaPlaybackRequiresUserGesture(false);
// Call private class InsideWebViewClient
settings.setPluginState(WebSettings.PluginState.ON);
settings.setAllowFileAccess(true);
// settings.setUserAgentString("Mozilla/5.0");
settings.setUserAgentString("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.1 Safari/537.36");
// webView.setInitialScale(50);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
if (0 != (getApplicationContext().getApplicationInfo().flags &= ApplicationInfo.FLAG_DEBUGGABLE))
webView.setWebContentsDebuggingEnabled(true);
供参考,与以下相同的基本内容一起使用: https://github.com/cprcrack/VideoEnabledWebView/blob/01c7f758a409fabbc501cdf24efdf5b77400280f/app/src/main/java/name/cpr/ExampleActivity.java
【讨论】:
以上是关于将javascript注入WebChromeClient的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript 通过JavaScript通过ID将HTML注入对象
如何使用jquery将javascript代码注入iframe头部