在metro应用中,“alert”的替代方案是什么?

时间:2012-11-30 20:09:07

标签: javascript html5 microsoft-metro winjs

我在Windows 8 vs 2012上创建了我的第一个应用程序,它运行良好。但是,当我试图用JavaScript这样说“helloworld”时:

alert("Hello World");

我收到错误:

Unhandled exception at line 21,
 column 13 in ms-appx://1af489cf-bac6-419b-8542-fdc18bdd2747/default.html

0x800a1391 - JavaScript runtime error: 'alert' is undefined

如果alert已过时,有什么替代方案?

3 个答案:

答案 0 :(得分:12)

您应该使用Windows.UI.Popups.MessageDialog

(new Windows.UI.Popups.MessageDialog("Content", "Title")).showAsync().done();

但是,你应该知道:

  • 这是阻止,就像熟悉的提醒
  • 一样
  • 因为它没有阻止你可能会尝试向他们展示多个消息框;这是不允许的。

我回答了另一个问题here。这是允许您呼叫警报并在飞行中有多条消息的代码:

(function () {
    var alertsToShow = [];
    var dialogVisible = false;

    function showPendingAlerts() {
        if (dialogVisible || !alertsToShow.length) {
            return;
        }

        dialogVisible = true;
        (new Windows.UI.Popups.MessageDialog(alertsToShow.shift())).showAsync().done(function () {
            dialogVisible = false;
            showPendingAlerts();
        })
    }
    window.alert = function (message) {
        if (window.console && window.console.log) {
            window.console.log(message);
        }

        alertsToShow.push(message);
        showPendingAlerts();
    }
})();

答案 1 :(得分:2)

请记住,alert不是JavaScript函数,它是一个浏览器(主机)函数,因此,它在非浏览器环境中不可用。

This link告诉您执行以下操作

  • 使用触发事件window.external.notify("message");

  • 替换所有警报功能
  • 在webview中使用scriptnotify事件来获取该消息。

  • 显示地铁自己的对话框:MessageDialog

答案 2 :(得分:0)

javascript:

 (function () {

  window.alert = function (message) {
      window.external.notify( message);
  }
//do some test
alert("a");
alert("b");
alert("c");
window.setInterval(function () {
    alert("e");
    alert("f");
}, 5000);
window.setInterval(function () { 
    alert("d");
    alert("2");
}, 10000);
 })();

C#:

  //register ScriptNotify event
  webView2.ScriptNotify += webView2_ScriptNotify;

async void webView2_ScriptNotify(object sender, NotifyEventArgs e)
    {
        MSG.Alert(e.Value);
    }


public class MSG
{
    static List<string> messages = new List<string>();


    public static void Alert(string message)
    {

        messages.Add(message);
        if (messages.Count == 1)
        {
              Show(messages.First());
        }

    }

    private static async Task Show(string message)
    {
        MessageDialog md = new MessageDialog(message, "Title");

        md.Commands.Add(
           new UICommand("OK", new UICommandInvokedHandler((cmd) =>
           {
               messages.RemoveAt(0);

           })));



        await md.ShowAsync();

        while (messages.Count > 0)
        {

            await Show(messages.First());
        }

    }

}