问题描述
我有一个 WebView
在其中显示我无法控制的网页内容.内容显示正常,但有链接会产生一个弹出窗口.执行此操作的 javascript 函数如下所示:
I have a WebView
in which i display web content which i have no control over. The content displays fine, but have links which spawn a popup window. The javascript function that does that looks like this:
function getEntry(id) {
var win = window.open('', 'Booking',
'resizable=yes,scrollbars=yes,status=no,width=500,height=400');
win.document.location = '/some/url/1-' + id ;
}
我不能轻易改变这一点,如果负责我下载的页面的人会改变它,我想我的应用程序会惨遭失败......
I can't easily change this, and if the people responsible for the page i download would change it, i guess my app would fail miserably...
我在活动中的 WebView
设置如下所示:
My WebView
setup in the activity looks like this:
_webview = new WebView(this);
setContentView(_webview);
final Activity activity = this;
_chromeClient = new MyChromeClient();
_webview.setWebChromeClient(_chromeClient);
//I experimented with changing user agent, in case that would have any effect, it didn't...
_webview.getSettings().setUserAgentString("Mozilla/5.0 (Windows NT 5.1; rv:9.0.1) Gecko/20100101 Firefox/9.0.1");
_webview.setWebViewClient(new MyWebViewClient());
_webview.getSettings().setJavaScriptEnabled(true);
_webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
_webview.getSettings().setSupportZoom(true);
_webview.getSettings().setBuiltInZoomControls(true);
_webview.getSettings().setDomStorageEnabled(true);
//Cache settings...
_webview.getSettings().setAppCacheMaxSize(1024*1024*8);
_webview.getSettings().setAppCachePath("/data/data/com.your.package.appname/cache");
_webview.getSettings().setAllowFileAccess(true);
_webview.getSettings().setAppCacheEnabled(true);
MyWebClient:
MyWebClient:
private class MyWebViewClient extends WebViewClient {
@Override
public void onLoadResource(WebView view, String url) {
Log.d("MyWebViewClient",url);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
showProgressDiag();
Log.d("MyWebViewClient","shouldOverride... : " + url);
view.loadUrl(url);
return true;
}
@Override
public void onPageFinished(WebView view, String url){
hideProgressDiag();
}
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
if(failingUrl.equals("file:///android_asset/html/error.html")){
hideProgressDiag();
Toast.makeText(_context, "Error! Check internet connection, or try again later...", Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(_context, failingUrl, Toast.LENGTH_SHORT).show();
view.loadUrl("file:///android_asset/html/error.html");
}
}
}
MyChromeClient:
MyChromeClient:
private class MyChromeClient extends WebChromeClient{
@Override
public void onProgressChanged(WebView view, int progress) {
Pdiag.setProgress(progress * 100);
}
}
当单击指向 javascript 函数的链接之一时,所有发生的事情都是 WebView
变为灰色,而无需通过 shouldOverrideUrlLoading()
.当我按下返回键时,应用程序退出,这意味着 WebView
的导航历史记录中没有任何内容.有时什么也没有发生,但是 shouldOverrideUrlLoading()
do run 并且从 Log.d()
我可以看到正确的 URL弹出窗口已提供给 WebView.
When clicking one of the links that points to the javascript function all that happens is that the WebView
turns grey, without going through shouldOverrideUrlLoading()
. When i hit the back key the app exits, meaning that nothing was placed in the nav history of the WebView
. Sometimes nothing happens, but then the shouldOverrideUrlLoading()
do run and from a Log.d()
i can see that the correct URL for the popup has been given to the WebView.
问题是,在极少数情况下它显示得很好,但我不知道如何重现它,它是否真的显示在弹出窗口中.
The thing is, on very rare occasions it shows up fine, but i have no clue how to reproduce it, and wether it actually shows in a popup.
我迷路了...而且很沮丧...想看一部糟糕的情景喜剧 :(
I'm lost... And quite frustrated... Thinking of watching a bad sitcom instead :(
实际上,也许 URL 并不完全正确……在 Firefox 中,URL 以X<<<<"结尾但在我的 Log.d() 输出中,它以X%3C%3C%3C%3C"结尾...我会调查是否可以更改...
Actually, maybe the URL wasn't all that correct after all... In Firefox the URL ends with "X<<<<" but in my Log.d() output it ends with "X%3C%3C%3C%3C"... I'll investigate if i could change that...
编辑 2:不,没有做任何事情...该 URL 与 Firefox 中的相同...
EDIT 2: Nope, didn't do anything... The URL is identical to the one in Firefox...
推荐答案
首先,你需要在你的WebView
上进行如下设置:
First of all, you need to set the following settings on your WebView
:
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
webSettings.setSupportMultipleWindows(true);
然后您需要附加一个覆盖 onCreateWindow
的 WebChromeClient
.您对该方法的实现可以创建一个新的 Web 视图,并将其显示在对话框中:
Then you need to attach a WebChromeClient
that overrides onCreateWindow
. Your implementation of this method can create a new web view, and display it inside a dialog:
webView.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
WebView newWebView = new WebView(MyActivity.this);
WebSettings webSettings = newWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
// Other configuration comes here, such as setting the WebViewClient
final Dialog dialog = new Dialog(MyActivity.this);
dialog.setContentView(newWebView);
dialog.show();
newWebView.setWebChromeClient(new WebChromeClient() {
@Override
public void onCloseWindow(WebView window) {
dialog.dismiss();
}
});
((WebView.WebViewTransport)resultMsg.obj).setWebView(newWebView);
resultMsg.sendToTarget();
return true;
}
});
不要忘记将新的 web 视图设置为 resultMsg
,将其发送到其目标并返回 true,如 API 文档.
Don't forget to set the new web view to the resultMsg
, send it to its target and return true, as mentioned in the API documentation.
这篇关于webview 不显示 javascript windows.open()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!