有没有人获得最基本的Javascript API,如prompt()和confirm()在UWP WebView中工作?它们没有实现并不奇怪,但是真的没有办法在应用程序中支持它们吗?如果是真的,那真是太疯狂......
在你提问之前,我们已经有太多的HTML / Javascript来重写它只是为了一个新的Windows应用程序。无论如何,认为我们应该这样做是愚蠢的。
最大的问题是,当我们等待用户阅读对话框时,无法暂停Javascript线程。以下是我尝试过的一些事情:
如果真的不可能,微软是否计划很快添加它? Android,macOS和iOS Web视图都支持这些基本API;一块蛋糕。
答案 0 :(得分:0)
真的没有办法在UWP WebView中实现confirm()和prompt()吗?
如果您需要接收从WebView托管的脚本发送的应用代码中的通知和数据,则需要处理ScriptNotify
事件。
ScriptNotify:这适用于alert(),但我们无法返回结果,例如confirm()。
如您所知,confirm()
方法可能效果不佳。但您可以在UWP应用中使用MessageDialog
作为解决方法来获得相同的效果。例如:
HTML
<button id="btnConfirm" onclick="confirmBox('sure to delete?')">click me to confirm</button>
<script type="text/javascript">
function confirmBox(message) {
window.external.notify('typeConfirm:' + message);
}
</script>
C#代码背后
private async void WebView_ScriptNotify(object sender, NotifyEventArgs e)
{
Windows.UI.Popups.MessageDialog dialog;
string[] messageArray = e.Value.Split(':');
string message;
string type;
if (messageArray.Length > 1)
{
message = messageArray[1];
type = messageArray[0];
}
else
{
message = e.Value;
type = "typeAlert";
}
dialog = new Windows.UI.Popups.MessageDialog(message);
Debug.WriteLine("type=" + type + " ,message=" + message);
if (type.Equals("typeConfirm"))
{
dialog.Commands.Add(new UICommand("Yes"));
dialog.Commands.Add(new UICommand("Cancel"));
dialog.DefaultCommandIndex = 0;
dialog.CancelCommandIndex = 1;
}
var result = await dialog.ShowAsync();
if (result.Label.Equals("Yes"))
{
// do something you want, maybe invoke a script
//await webView1.InvokeScriptAsync("eval", new string[] { functionString });
}
else
{
// do something you want, maybe invoke a script
//await webView1.InvokeScriptAsync("eval", new string[] { functionString });
}
}
在你提问之前,我们已经有太多的HTML / Javascript来重写它只是为了一个新的Windows应用程序
如果你担心这个使用上面的解决方法,我担心没有别的办法。
如果真的不可能,微软是否计划很快添加它?
很抱歉,我们无法确定将来是否可以实施某项功能,但您可以尝试将自己的功能发布到user voice。无论如何,似乎不建议使用confirm()
中托管的WebView
。如果有条件,您可以考虑将HTML / JavaScript转换为UWP应用程序的其他方法。有关详细信息,请查看此similar thread。
答案 1 :(得分:0)
Javascript / Typescript 的解决方案。 将适用于 UWP 应用,而不适用于 Edge/IE。
async function confirm(title: string, message: string | null): Promise<boolean> {
const UI = window['Windows'].UI;
const dialog = new UI.Popups.MessageDialog(message, title);
const yes = new UI.Popups.UICommand("Yes");
yes.id = 0;
const no = new UI.Popups.UICommand("No");
yes.id = 1;
dialog.commands.push(yes);
dialog.commands.push(no);
dialog.defaultCommandIndex = 0;
dialog.cancelCommandIndex = 1;
const result = await dialog.showAsync();
return result.id === yes.id;
}