iOS端
使用的控件為WKWebView
螟蝙,攔截事件在WKUIDelegate
中進(jìn)行處理。
//MARK: - 網(wǎng)頁(yè)UI代理(WKWebView阻止了js的alert事件)
extension GDCloudViewController: WKUIDelegate {
// 監(jiān)聽通過JS調(diào)用警告框
func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void) {
let alert = UIAlertController(title: nil, message: message, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "確定", style: .default, handler: { (action) in
completionHandler()
}))
self.present(alert, animated: true, completion: nil)
}
// 監(jiān)聽通過JS調(diào)用提示框
func webView(_ webView: WKWebView, runJavaScriptConfirmPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (Bool) -> Void) {
let alert = UIAlertController(title: nil, message: message, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "取消", style: .default, handler: { (action) in
completionHandler(false)
}))
alert.addAction(UIAlertAction(title: "確定", style: .default, handler: { (action) in
completionHandler(true)
}))
self.present(alert, animated: true, completion: nil)
}
// 監(jiān)聽JS調(diào)用輸入框
func webView(_ webView: WKWebView, runJavaScriptTextInputPanelWithPrompt prompt: String, defaultText: String?, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (String?) -> Void) {
let alert = UIAlertController(title: nil, message: prompt, preferredStyle: .alert)
alert.addTextField { (textField) in
textField.text = defaultText
}
alert.addAction(UIAlertAction(title: "取消", style: .default, handler: { (action) in
completionHandler(nil)
}))
alert.addAction(UIAlertAction(title: "確定", style: .default, handler: { (action) in
completionHandler(alert.textFields?[0].text)
}))
self.present(alert, animated: true, completion: nil)
}
}
Android端
安卓需要先開啟JS支持webView.getSettings().setJavaScriptEnabled(true);
具體代理事件處理如下所示:
webView.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {
AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());
builder.setTitle("")
.setMessage(message)
.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
result.confirm();
}
})
.setCancelable(false)
.create()
.show();
return true;
}
@Override
public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) {
AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());
builder.setTitle("")
.setMessage(message)
.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
result.confirm();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
result.cancel();
}
})
.setCancelable(false)
.create()
.show();
return true;
}
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, final JsPromptResult result) {
final EditText et = new EditText(view.getContext());
AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());
builder.setTitle("")
.setMessage(message)
.setView(et)
.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
result.confirm(et.getText().toString());
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
result.cancel();
}
})
.setCancelable(false)
.create()
.show();
return true;
}
});
HTML代碼
<!DOCTYPE html>
<html>
<head>
<title>JS測(cè)試</title>
<meta charset="utf-8">
<script type="text/javascript">
function toast_alert(){
alert("彈窗");
changeValue("");
}
function toast_confirm(){
var result = confirm("確定要退出嗎副瀑?");
if (result) {
changeValue("確定");
} else {
changeValue("取消");
}
}
function toast_prompt(){
var result = prompt("請(qǐng)輸入", "");
if (result) {
changeValue(result);
} else if (result === "") {
changeValue("沒有輸入內(nèi)容");
} else {
changeValue("取消");
}
}
function changeValue(value) {
document.getElementsByClassName("content")[0].innerHTML = value;
}
</script>
</head>
<body>
<button onclick="toast_alert()">點(diǎn)擊彈窗alert</button>
<br/>
<button onclick="toast_confirm()">點(diǎn)擊彈窗confirm</button>
<br/>
<button onclick="toast_prompt()">點(diǎn)擊彈窗prompt</button>
<br/>
<p class="content"></p>
</body>
</body>
</html>