我想在我的WKWebView中显示JavaScript Alert。我已经实现了IWKUIDelegate及其方法RunJavaScriptAlertPanel,RunJavaScriptConfirmPanel。这些被称为JavaScript警报。我想知道如何处理这些按钮上的按钮和操作。
有没有办法可以为所有JavaScript警报编写通用的UIAlertView。例如下面我添加了errorAlert.AddButton(" OK");但实际上我不知道按钮和按钮标题的数量。还有如何处理completionHandler动作
[Export ("webView:runJavaScriptConfirmPanelWithMessage:initiatedByFrame:completionHandler:")]
public void RunJavaScriptConfirmPanel (WKWebView webView, String message, WKFrameInfo frame, Action<bool> completionHandler)
{
Console.WriteLine ("RunJavaScriptConfirmPanel");
UIAlertView errorAlert = new UIAlertView();
errorAlert.Title = "Alert";
errorAlert.Message = message;
errorAlert.AddButton("OK");
errorAlert.Show();
}
答案 0 :(得分:3)
我不确定你在哪里尝试处理动作,无论是在javascript中还是在应用程序中使用C#,所以我将尝试解决这两个问题。简短的回答是,让javascript处理它,如果需要,一旦从对话框中做出选择,就从javascript调用应用程序。
警示示例
public override void RunJavaScriptAlertPanel(WKWebView webView, string message, WKFrameInfo frame, Action completionHandler)
{
var alert = UIAlertController.Create("Alert", message, UIAlertControllerStyle.Alert);
alert.AddAction(UIAlertAction.Create("OK", UIAlertActionStyle.Default, null));
//Let javascript handle the OK click by passing the completionHandler to the controller
ViewController.PresentViewController(alert, true, completionHandler);
}
确认示例
public override void RunJavaScriptConfirmPanel(WKWebView webView, string message, WKFrameInfo frame, Action<bool> completionHandler)
{
var alert = UIAlertController.Create("Please confirm", message, UIAlertControllerStyle.Alert);
//Let javascript handle the OK click by passing the completionHandler to the controller
alert.AddAction(UIAlertAction.Create("OK", UIAlertActionStyle.Default, action => completionHandler(true)));
//Let javascript handle the Cancel click by passing the completionHandler to the controller
alert.AddAction(UIAlertAction.Create("Cancel", UIAlertActionStyle.Cancel, action => completionHandler(false)));
ViewController.PresentViewController(alert, true, null);
}
提示示例
public override void RunJavaScriptTextInputPanel(WKWebView webView, string prompt, string defaultText, WKFrameInfo frame, Action<string> completionHandler)
{
var alert = UIAlertController.Create("Prompt", prompt, UIAlertControllerStyle.Alert);
alert.AddTextField(textfield => { textfield.Placeholder = defaultText; });
alert.AddAction(UIAlertAction.Create("OK", UIAlertActionStyle.Default, action => completionHandler(alert.TextFields[0].Text)));
alert.AddAction(UIAlertAction.Create("Cancel", UIAlertActionStyle.Cancel, action => completionHandler(null)));
ViewController.PresentViewController(alert, true, null);
}
这样就为您提供了一个如何将按钮单击回到javascript的示例。如果你想让javascript进行回调,你需要通过WKScriptMessageHandler
的子类来注册脚本处理程序。这里有一个基本的例子https://forums.xamarin.com/discussion/41777/wkwebview-caching-not-working
就像注释一样,UIAlertView
已被弃用。您可能希望开始使用UIAlertController
。见https://stackoverflow.com/a/32690371/5606840。如果要访问视图控制器以显示警报,请在初始化时将其传递到WKUIDelegate
类。
修改的
扩展如何在javascript中处理结果
alert('This is an alert');
webview将暂停javascript线程并调用RunJavaScriptAlertPanel
。单击确定按钮后,它将在webview中回调completionHandler,其余的javascript代码将执行。
if (confirm('Do you want to confirm this?')) {
//Do some code here when the user clicks ok
} else {
//Do other code here when the user clicks cancel
}
与警报示例一样,当javascript遇到确认方法时,它会调用RunJavaScriptConfirmPanel
。然后,您可以显示包含通过消息传递的文本的对话框,以及“确定”和“取消”按钮。根据单击的按钮,该方法会将true或false推送回webview,并允许其余的javascript代码通过完成处理程序执行。