现在我正在使用这行代码来至少尝试阻止JavaScript
中webview
的弹出窗口:
webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
1)我不明白为什么我必须将其切换为“真实”它正在工作 2)在webview中是否有阻止弹出窗口的其他技术?
非常感谢帮助。
答案 0 :(得分:5)
我们处于等式的WebView
设置 一侧。
乍一看是一个明显的评论,但如果你 不需要 JavaScript
, 不启用 JavaScript
,那么您就不会获得JavaScript
弹出式广告。我假设您 DO 需要JavaScript
(请记住可能 XSS vulnerable)并且想要 您可以 禁用 不可避免的跟随的弹出窗口。
<强> INFO 强>:
WebViewClient。覆盖WebView
的此行为,例如所以链接在WebView
内打开。
WebChromeClient可让您处理Javascript's alert()
和其他功能
OP(1) setJavaScriptCanOpenWindowsAutomatically(true)
完成 通常 阻止 外部 事件处理程序 。
OP =原帖; O)。
这就是我设置正常webview
的方式:
WebView webView = (WebView) this.findViewById(R.id.webView1);//CustomWebView ?
WebSettings webView_settings = webView.getSettings();
//by setting a WebClient to catch javascript's console messages :
WebChromeClient webChromeClient = new WebChromeClient() {
public boolean onConsoleMessage(ConsoleMessage cm) {
Log.d(TAG, cm.message() + " -- From line "
+ cm.lineNumber() + " of "
+ cm.sourceId() );
return true;
}
});
webView_settings.setDomStorageEnabled(true);
WebViewClient webViewClient = new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
setTitle(view.getTitle());
//do your stuff ...
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith("file"))
{
// Keep local assets in this WebView.
return false;
}
}
});
//webView.setWebViewClient(new HelpClient(this));//
webView.setWebChromeClient(webChromeClient);
webView.setWebViewClient(webViewClient);
webView.clearCache(true);
webView.clearHistory();
webView_settings.setJavaScriptEnabled(true);//XSS vulnerable set to false ?
webView_settings.setJavaScriptCanOpenWindowsAutomatically(true);//set to false ?
webView.loadUrl("file:///android_asset/connect.php.html");//load something
来自@markproxy如果您展开WebChromeClient
,则可以覆盖其onJsAlert()
方法并阻止警报的内置处理程序。 当你在时,你可能想要阻止对confirm()
和prompt()
的调用:
WebChromeClient webChromeClient = new WebChromeClient() {
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
result.cancel();
return true;
}
@Override
public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
result.cancel();
return true;
}
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
result.cancel();
return true;
}
};
webView.setWebChromeClient(webChromeClient);
答案 1 :(得分:1)
您可以在WebChromeClient中尝试阻止弹出窗口(窗口):
@Override
public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
WebView newWebView = (WebView) LayoutInflater.from(view.getContext()).inflate(R.layout.webview_custom_view, null);
WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
transport.setWebView(newWebView);
resultMsg.sendToTarget();
return true;
}
对象newWebView应该添加到某个容器,如view.It从WebView创建窗口(弹出窗口)的示例。
答案 2 :(得分:1)
我必须这样做。覆盖WebChromeClient类中的onJSAlert()方法:
MyWebChromeClient myWebChromeClient = new MyWebChromeClient();
webView.setWebChromeClient(myWebChromeClient);
MyWebChromeClient 是一个自定义类,它继承 WebChromeClient
public class MyWebChromeClient extends WebChromeClient {
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result)
{
final JsResult finalRes = result;
new AlertDialog.Builder(view.getContext())
.setMessage(message)
.setPositiveButton(android.R.string.ok,
new AlertDialog.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which) {
finalRes.confirm();
}
})
.setCancelable(false)
.create()
.show();
return true;
}
}