webview 不显示 javascript windows.open()
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/9147875/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
webview don't display javascript windows.open()
提问by mickey
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:
我有一个WebView
我无法控制的网页内容。内容显示正常,但有产生弹出窗口的链接。执行此操作的 javascript 函数如下所示:
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...
我不能轻易改变这一点,如果负责我下载的页面的人会改变它,我想我的应用程序会惨遭失败......
My WebView
setup in the activity looks like this:
我WebView
在活动中的设置如下所示:
_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:
我的网页客户端:
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:
我的Chrome客户端:
private class MyChromeClient extends WebChromeClient{
@Override
public void onProgressChanged(WebView view, int progress) {
Pdiag.setProgress(progress * 100);
}
}
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 runand from a Log.d()
i can see that the correct URL for the popup has been given to the WebView.
当单击指向 javascript 函数的链接之一时,所有发生的事情都是WebView
变成灰色,而不是通过shouldOverrideUrlLoading()
. 当我按下后退键时,应用程序退出,这意味着WebView
. 有时什么也没有发生,但随后shouldOverrideUrlLoading()
运行并从Log.d()
我可以看到弹出窗口的正确 URL 已提供给 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 :(
我迷路了......而且很沮丧......想看一部糟糕的情景喜剧:(
EDIT: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...
编辑:实际上,也许 URL 毕竟不是那么正确......在 Firefox 中,URL 以“X<<<<”结尾,但在我的 Log.d() 输出中,它以“X%3C%3C%”结尾3C%3C”...我会调查我是否可以改变它...
EDIT 2:Nope, didn't do anything... The URL is identical to the one in Firefox...
编辑 2:不,没有做任何事情...... URL 与 Firefox 中的 URL 相同......
回答by Samuel Peter
First of all, you need to set the following settings on your WebView
:
首先,您需要对您的 进行以下设置WebView
:
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
webSettings.setSupportMultipleWindows(true);
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:
然后你需要附加一个WebChromeClient
覆盖onCreateWindow
. 您对这个方法的实现可以创建一个新的 web 视图,并将它显示在一个对话框中:
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;
}
});
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.
不要忘记将新的 Web 视图设置为resultMsg
,将其发送到其目标并返回 true,如API 文档中所述。
回答by Darpan
Please check with adding this -
请检查添加这个 -
getSettings().setSupportMultipleWindows(true);