2

I created my first app on Windows 8 vs 2012 and it runs and works fine. But when I try to say "helloworld" from JavaScript like this:

alert("Hello World");

I get an error:

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

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

What is the alternative if alert is obsolete?

KatieK
  • 13,586
  • 17
  • 76
  • 90
Smartboy
  • 986
  • 6
  • 22
  • 37

3 Answers3

12

You should use Windows.UI.Popups.MessageDialog:

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

However, you should be aware that:

  • This is not blocking like the familiar alert
  • Because it's not blocking you may try to show them multiple messages boxes; this isn't allow.

I answered another question like this here. Here's the code to allow you to call alert, and have multiple messages in flight:

(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();
    }
})();
Community
  • 1
  • 1
Dominic Hopton
  • 7,262
  • 1
  • 22
  • 29
  • Nice solution! one note though - there's a reason showing an alert is an asynchronous operation: so you can still do stuff. So if you want to show the user an alert, but still do some processing in the background, you can definitely use the ShowAsync, and handle the "done" yourself. – Guy Apr 06 '15 at 21:51
2

Remember that alert is not a JavaScript function, it's a browser (host) function, therefore, it's not available in non browser environments.

This link tells you to do the following

  • Replace all alert functions with firing an event window.external.notify("message");

  • Use scriptnotify event in webview to get that message.

  • Show metro own dialog: MessageDialog

Ruan Mendes
  • 90,375
  • 31
  • 153
  • 217
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());
        }

    }

}
moses
  • 11