Maps with Leaflet, TopoJSON

A really good article that teach to use leaflet to show map.
http://blog.webkid.io/maps-with-leaflet-and-topojson/
Below is my note of this article

<!DOCTYPE html>  
<html>  
<head>  
  <meta charset="UTF-8">
  <title>maps with leaflet & topojson</title>
  <link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.7.3/leaflet.css" />
  <style>
    html,body,#worldmap{
      height:100%;
    }
  </style>
</head>  
<body>  
  <div id="worldmap"></div>  

  <script src="http://cdn.leafletjs.com/leaflet-0.7.3/leaflet.js"></script>
  <script>
  // create a map object and set the view to the coordinates 24.875224031804528,121.53076171875 with a zoom of 9
  var map = L.map('worldmap').setView([24.875224031804528,121.53076171875], 9);
  </script>
</body>  
</html>  
You will get a blank full screen leaflet map. (nothing show in the map) In leaflet [tutorial](http://leafletjs.com/examples/quick-start.html), their is a map with streets show up in background.
L.tileLayer('http://{s}.tiles.mapbox.com/v3/MapID/{z}/{x}/{y}.png', {
    attribution: 'Map data © [OpenStreetMap](http://openstreetmap.org) contributors, [CC-BY-SA](http://creativecommons.org/licenses/by-sa/2.0/), Imagery © [Mapbox](http://mapbox.com)',
    maxZoom: 18
}).addTo(map);
This code in tutorial is the reason for it. It add a overlayer(openstreetmap) to map through a service called mapbox. But, in our case, we don't need this overlayer, just keep it blank first. And load a topoJson in next step.
<script src="http://d3js.org/topojson.v1.min.js"></script>  
<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
Leaflet do not know about topoJson, so we need to convert it to geoJson in the browser. Use the code below to extend leaflet class.
L.TopoJSON = L.GeoJSON.extend({  
  addData: function(jsonData) {    
    if (jsonData.type === "Topology") {
      for (key in jsonData.objects) {
        geojson = topojson.feature(jsonData, jsonData.objects[key]);
        L.GeoJSON.prototype.addData.call(this, geojson);
      }
    }    
    else {
      L.GeoJSON.prototype.addData.call(this, jsonData);
    }
  }  
});
// Copyright (c) 2013 Ryan Clark
Then we can Load the data and set up some interactive function for each layer in topoJson.
var topoLayer = new L.TopoJSON();

$.getJSON('data/countries.topo.json')
  .done(addTopoData);

function addTopoData(topoData){  
  topoLayer.addData(topoData);
  topoLayer.addTo(map);
  topoLayer.eachLayer(handleLayer);
}

function handleLayer(layer){  
  layer.setStyle({
    fillColor : '#D5E3FF',
    fillOpacity: 1,
    color:'#555',
    weight:1,
    opacity:0.5
  });

  layer.on({
    mouseover: enterLayer,
    mouseout: leaveLayer
  });
}

function enterLayer(){  
  var countryName = this.feature.properties.name;
  //get the properties in topoJson
  console.log(countryName);

  this.bringToFront();
  this.setStyle({
    weight:2,
    opacity: 1
  });
}

function leaveLayer(){  
  this.bringToBack();
  this.setStyle({
    weight:1,
    opacity:.5
  });
}