<!DOCTYPE html>
<html>
  <head>
    <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.3/leaflet.css" data-require="leaflet@0.7.3" data-semver="0.7.3" />
    <link rel="stylesheet" href="style.css" />
  </head>
  <body>
    <div id="map"></div>
    <script type="text/javascript" src="https://code.jquery.com/jquery-2.1.3.min.js"></script>
    <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.3/leaflet.js" data-require="leaflet@0.7.3" data-semver="0.7.3"></script>
    <script type="text/javascript" src="L.CustomMarker.js"></script>
    <script type="text/javascript" src="script.js"></script>
  </body>
</html>
var map = L.map('map', {
  'center': [0, 0],
  'zoom': 1,
  'layers': [
    L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
      'attribution': 'Map data &copy; OpenStreetMap contributors'
    })
  ]
});

var customMarker = L.customMarker([0,0]).addTo(map);

/*$.getJSON(url, function (geojson) {
  L.geoJson(geojson, {
    style: function (feature) {
      return {
        'weight': 1,
        'color': 'black',
        'fillColor': 'yellow'
      }
    }
  }).addTo(map);
});*/
body {
  margin: 0;
}
html, body, #map {
  height: 100%;
}
L.CustomMarker = L.Marker.extend({
  onAdd: function (map) {
    this.on('click', this.clickHandler);
    L.Marker.prototype.onAdd.call(this, map);
  },
  onRemove: function (map) {
    this.off('click', this.clickHandler);
    L.Marker.prototype.onRemove.call(this, map);
  },
  clickHandler: function (e) {
    $.getJSON('data.json', function (data) {
      e.target.bindPopup(data.myProperty);
      e.target.openPopup();
    }, this);
  }
});

L.customMarker = function (latLng, options) {
  return new L.CustomMarker(latLng, options);
}
{
  "myProperty": "myValue"
}