HTML5 Series – Error Handling

One thing you can say for certain about writing code is at some point your going to write something that error’s. It may be picked up in code reviews, or by a tester, and then fixed but for certain as you are human at some point you will make a mistake. What’s important though is what happens after the mistake.

If your a C# developer then good news JavaScript has the same try, catch, finally functionality that C# has and it works in the same way.

Wrap you code that could error with a try statement and curly braces and following it add in a catch statement with the code that you want to execute in the event of an error. Finally if you want some code to execute either way after both, place this in the finally block.

try
{
    functionThatDoesntExists();
}
catch (err)
{
     alert(err.message);
}
finally
{
    //Code to execute at the end
}

Notice the catch section is passed a parameter and I am then alerting a property of this called message. The error parameter can be useful for debugging what actually went wrong and contains a few other parameters.

  • Description
  • Message
  • Name
  • Number
  • Stack

Sometimes you may also want to cause an error to be thrown. You may be asking why, but consider people calling your functions may in-fact pass values that are not valid. You could detect this and throw an error containing some useful information before there incorrect parameter values causes your code to error and a less helpful message given.

var err = new Error(1, "Oh dear, that's not going to work"); // First parameter is the error number, second is the message
throw err;
Advertisements

HTML5 Series – Web Storage

One of the best benefits of HTML5 particularly for Web Apps is the ability to store data locally within the users browser. This means in many places you can speed your Web App up by fetching data once and then retrieving it locally in the future, rather than going back to a server each time.

There are 2 types of storage available localStorage and sessionStorage. The simple difference is that localStorage doesn’t expire while sessionStorage expires at the end of the users session.

Both types store data in a key/value list and could not be simpler:

// local storage
localStorage.variableName = value;

// session storage
sessionStorage.variableName = value;

One thing to note though is you can only store text. If you want to store something more complex the simple solution is to convert it to and from JSON. E.g.

var myColours = [ 'red', 'blue', 'green', 'yellow'];

// Save to local storage
localStorage.colours = JSON.stringify(myColours)

// Retrieve from local storage
var retrievedColorus = JSON.parse(localStorage.colours);

HTML5 Series – Fonts

It’s an all to common story, designer designs a website hands it to a developer who then goes, “what kind of font is that?” and get’s the response of some completely unheard of name. The developer then try’s to explain what a web safe font is and they agree to use Arial.

With CSS3 custom fonts are now a reality. On the item you are styling you still set the font family in the same way but additionally in your CSS you specify a @font-face rule so the browser can find out what the font is. The @font-face rule should specify a name and the src of the font. e.g.

@font-face { 
     font-family: myFont;
     src: url('myFontFileName.ttf');
}

One point to note different browsers support different font type. Luckily though you can specify multiple sources for your font.

HTML5 Series – Grid

There was a time when an HTML page layout mainly consisted of tables, and lots of them. Tables went inside other tables and complex layouts were achieved through the use of colspans and rowspans. The only problem though was it was a mess.

By using tables the HTML mark-up was dictating the design/layout of the page and if you ever wanted to change anything it was a huge task to undertake. Since then the world has moved on and now most webpages consist mainly of div’s. But what if you did want to quite a rigid layout with columns and rows?

HTML5 introduces the Grid style through CSS. Your page can still consist mainly of div’s (or anything for that matter), but in your css you set a display property of grid (for now in IE it’s -ms-grid). You can then specify a grid-columns and grid-rows property to create a grid within your div.

Child items can be placed in grid cells through grid-row and grid-column properties in the CSS, and if you want something to span more than one cell you can use grid-row-span or grid-column-span.

If you’ve done any XMAL programming (WPF/Silverlight/Win8/Windows Phone) then this should all sound very similar to XMAL’s Grid control.

The example below creates something like this:

GRid

    <style>
            /* Set a grid with 3 columns and 2 rows */
            div {
                display: -ms-grid;
                -ms-grid-columns:200px 200px 200px;
                -ms-grid-rows:200px 200px;
            }

            /* Position the child div's in the grid */
            div:nth-child(1) {
                -ms-grid-row: 1;
                -ms-grid-column: 1;
            }
            div:nth-child(2) {
                -ms-grid-row: 2;
                -ms-grid-column: 1;
            }
            div:nth-child(3) {
                -ms-grid-row: 1;
                -ms-grid-column: 2;
                -ms-grid-row-span:2; /* The middle cell spans 2 rows */
            }
            div:nth-child(4) {
                -ms-grid-row: 1;
                -ms-grid-column: 3;
            }
            div:nth-child(5) {
                -ms-grid-row: 2;
                -ms-grid-column: 3;
            }

            /* Add a border to the cells */
            div>div {
                border: solid 1px black;               
            }
    </style>
    <div class="myGrid">
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
    </div>

It’s also worth noting that the column/row sizes can be specified using fractions rather than fixed sizes. e.g. The following will produce a grid 600px wide where the middle column is twice the width of the other 2.

    <style>
            /* Set a grid with 3 columns and 2 rows */
            div {
                display: -ms-grid;
                width:600px;
                -ms-grid-columns:1fr 2fr 1fr;
                -ms-grid-rows:200px 200px;
            }
    </style>

For another great example check out this hands on page from Microsoft Hands on: CSS3 Grid

HTML5 Series – Location

Being able to get a users location opens up some great functionality especially when used on mobile devices that could be anywhere. HTML5 makes it really easy to capture the users latitude and longitude in just a couple of lines of JavaScript.

What’s important to remember though is the user always has the option of denying your request for their location so error handling is very important.

First you need to check to see if the device actually support geolocation by doing navigator.geolocation

            if (navigator.geolocation) {
                // success code to go here
            } else {
                alert("location not supported");
            }

Next we need to call navigator.geolocation.getCurrentPosition to get the current location. As capturing a location isn’t something that happens instantly (first the browser will check with the user that this is ok and then it may take a few seconds for the device to actually work out the location) you need to provide a function that will be called when the location has been established.

After that accessing the location is easy just look at the coords.latitude and cords.longitude properties on the object that was returned to your callback function.

    <script>
        function getLocation() {
            if (navigator.geolocation) {
                navigator.geolocation.getCurrentPosition(function (location) {
                    document.getElementById("latitude").innerText = location.coords.latitude;
                    document.getElementById("longitude").innerText = location.coords.longitude;
                }, function (error) {
                    alert(error.code);
                });
            } else {
                alert("location not supported");
            }
        }
    </script>


    Latitude: <span id="latitude"></span>
    Logitude: <span id="longitude"></span>

    <button onclick="getLocation();">Get location</button>

HTML5 Series – Video

Like Audio embedding Video in an HTML5 web page is really simple to do and has a very similar syntax.

The video tag can contain multiple source tags to specify videos in different formats as not all browsers support the same ones, and some text to be displayed if the browser does not support any. The video tag can also have a controls element specified to instruct the browser to display controls for the playback.

<video controls>
    <source src="URL of video.mp4" type="video/mp4">
    <source src="URL of alternate video.ogg" type="video/ogg">
    Your browser doesn't support viodes
</video>

You can also set the following tags:

autoplay Specifies that the video should begin playback immediately
loop Sets the video to repeat
muted Mutes the audio on playback
poster Specifies an image to be shown what the video is downloading
preload Specifies if an how the video should be loaded when the page loads

It is also possible to control a videos playback through JavaScript. You can reload the element, play and pause that track.

var v = document.getElementById("myVideo");
v.play();
v.pause();
v.load();

HTML5 Series – Audio

Traditionally if you wanted Audio on your page you would embed it in a Flash object. But when Steve Jobs declared that the iPhone would never support Flash or any other plug in’s, there was suddenly a demand that browsers would need to support this natively and in a consistent way between browsers.

In HTML5 we can do this using the Audio tag. e.g.

<audio controls>
     <source src="url of the file" type="audio/mp3">
     Your browser doesn't support audio.
</audio>

The above example demonstrates setting the file source for the audio with the source tag, the controls tag tells the browser to show audio controls and there is also some text that will be displayed if the browser doesn’t support audio.

It is also possible to set multiple source tags to reference different file formats as not all browsers support the same ones. Alternatively when setting just one source, a src tag can be placed on the actual audio node rather than as a child element.

Other settings which could be set include:

autoplay – determines if the file should start playing on the page load
loop – specifies that the file should repeat when it’s finished
preload – instructs the browser to start downloading the audio file when the page has loaded

HTML5 Series – Columns

I’m not sure I’ve ever needed to add columns where text flows from one into the other, but if your doing Windows 8 development where you would want a sideways scroll rather than vertical this could be quite useful.

To create columns using CSS3 you simply set the columns property to either the number of columns you want or the width each columns should be. e.g. This would produce 4 columns.

<style type="text/css">
        div {
            columns: 4;
        }
</style>

There are a couple other properties that are also quite useful when using columns.

Column-Gap Specifies the size of the gap between columns
Column-Fill Can either be set to auto where columns are filled sequentially and have different lengths, or balance in which case the text will be balanced so each column is even. The default is balance.

HTML5 Series – Flexbox

If you’ve ever done any WPF, Silverlight, Windows Phone or Windows 8 development using xmal then you will appreciate how good it is to have controls like the StackPanel and Grid, and that HTML is rather lacking in its layout functionality. True you can produce most layouts but it just seems needlessely harder.

Thankfully HTML5 improves on this situation by introducing some new CSS properties.
The first is flexbox. When you define a div as a flexbox you can set its containing items to either space themselves out evenly, or you can set ratio values on each item to say how big it should be compared to the other items in the flexbox and they will stretch to fill the flebox.

Examples
In this example the flexbox is set to distributive which means the containing items will keep there size but distribute themselves evenly in the flexbox.

The key CSS is where the class example 1 sets the display to -ms-flexbox which makes example 1 div a flexbox container, and -ms-flex-pack: distribute, which set the flex mode to distribute the containing items evenly.

    <style type="text/css">
        .Example1 {
            display:-ms-flexbox;
            -ms-flex-pack:distribute;
            width:400px;
            border:solid 1px black;
        }
        .Example1 div:nth-child(1) {
            background-color: red;
            min-width:80px;
            min-height:80px;
        }
        .Example1 div:nth-child(2) {
            background-color: green;
            min-width:80px;
            min-height:80px;
        }
        .Example1 div:nth-child(3) {
            background-color: blue;
            min-width:80px;
            min-height:80px;
        }

    </style>
 <div class="Example1">
        <div></div>
        <div></div>
        <div></div>
    </div>

Flexbox-Distribute

In the next example the containing items have had ratios set so that the second item is twice the width of the first and the third remains at a fixed size.

The key CSS to look at here is on the child div’s styles where it says -ms-flex: 1 or -ms-flex: 2.

    
    <style type="text/css">
        .Example2 {
            display:-ms-flexbox;
            width:400px;
            border:solid 1px black;
        }
        .Example2 div {
            min-width: 80px;
            min-height: 80px;
        }
        .Example2 div:nth-child(1) {
            background-color: red;
            -ms-flex: 1 0 auto;
        }
        .Example2 div:nth-child(2) {
            background-color: green;
            -ms-flex: 2 0 auto;
        }
        .Example2 div:nth-child(3) {
            background-color: blue;
            min-width:80px;
        }
    </style>
    
    <div class="Example2">
        <div></div>
        <div></div>
        <div></div>
    </div>

Flexbox-Ratios

The third example shows how these techniques also work vertically as well as horizontally. See -ms-flex-direction:column on the containing div style.

    <style type="text/css">
        .Example3 {
            display:-ms-flexbox;
            -ms-flex-direction:column;
            width:400px;
            border:solid 1px black;
        }
        .Example3 div {
            min-width: 80px;
            min-height: 80px;
        }
        .Example3 div:nth-child(1) {
            background-color: red;
            -ms-flex: 1 0 auto;
        }
        .Example3 div:nth-child(2) {
            background-color: green;
            -ms-flex: 2 0 auto;
        }
        .Example3 div:nth-child(3) {
            background-color: blue;
            min-width:80px;
        }
    </style>
    <div class="Example3">
        <div></div>
        <div></div>
        <div></div>
    </div>

Flexbox-Verticle

Lastly in the fourth example I’ve shown how items can be set to wrap when they fill up a line with -ms-flex-wrap:wrap;

    <style type="text/css">
        .Example4 {
            display:-ms-flexbox;
            -ms-flex-wrap:wrap;
            width:400px;
            border:solid 1px black;
        }
        .Example4 div {
            min-width: 80px;
            min-height: 80px;
        }
        .Example4 div:nth-child(1) {
            background-color: red;
        }
        .Example4 div:nth-child(2) {
            background-color: green;
        }
        .Example4 div:nth-child(3) {
            background-color: blue;
        }
        .Example4 div:nth-child(4) {
            background-color: yellow;
        }
        .Example4 div:nth-child(5) {
            background-color: orange;
        }
        .Example4 div:nth-child(6) {
            background-color: violet;
        }
    </style>
    <div class="Example4">
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
    </div>

Flexbox-Wrap

HTML5 Series – Forms

Forms haven’t really changed in functionality since they were first invented, but with HTML5 the browser is going to add a lot of the functionality you’ve previously been hand coding through JavaScript/jQuery.

HTML5 now supports things like setting a field to be required or adding some html text that disappears when you click in the field. Some of the new tags include:

  • required – Determines if the field must be filled in
  • placeholder – Text to be displayed before the user enters a value
  • autofocus – Default the curser to the field with this set
  • pattern – A regex expression to validate the field
  • min / max – Specify the min and max values that can be entered

For more visit theĀ HTML5 form attributes page on W3Schools

There are also new input types that will restrict the data that can be entered and the way the field is renderedĀ such as:

  • colour
  • date
  • datetime
  • email
  • month
  • number
  • range
  • search
  • tel
  • time
  • url
  • week

For more view is the HTML5 form input types page on W3Schools