gpt4 book ai didi

javascript - webview 不显示 javascript windows.open()

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:31:57 28 4
gpt4 key购买 nike

我有一个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 ;
}

我不能轻易改变它,如果负责我下载的页面的人会改变它,我想我的应用程序会失败得很惨......

我在 Activity 中的 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);

我的网络客户端:

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");
}

}

}

MyChrome 客户端:

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。

问题是,在极少数情况下它显示正常,但我不知道如何重现它,也不知道它是否真的显示在弹出窗口中。

我迷路了......而且非常沮丧......想着看一部糟糕的情景喜剧:(

编辑:实际上,也许 URL 毕竟不是那么正确......在 Firefox 中,URL 以“X<<<<”结尾,但在我的 Log.d() 输出中,它以“X%3C%3C%3C%”结尾3C"...我会调查是否可以更改...

编辑 2:不,什么都没做...URL 与 Firefox 中的相同...

最佳答案

首先,您需要在WebView 上进行以下设置:

WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
webSettings.setSupportMultipleWindows(true);

然后您需要附加一个覆盖 onCreateWindowWebChromeClient。您对该方法的实现可以创建一个新的 Web View ,并将其显示在对话框中:

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 View 设置为 resultMsg,将其发送到目标并返回 true,如 the API documentation 中所述.

关于javascript - webview 不显示 javascript windows.open(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9147875/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com