// Load data tiles using the JQuery ajax function
L.TileLayer.Ajax = L.TileLayer.extend({
    _requests: [],
    _data: [],
    data: function () {
        for (var t in this._tiles) {
            var tile = this._tiles[t];
            if (!tile.processed) {
                this._data = this._data.concat(tile.datum);
                tile.processed = true;
            }
        }
        return this._data;
    },
    _addTile: function(tilePoint, container) {
        var tile = { datum: null, processed: false };
        this._tiles[tilePoint.x + ':' + tilePoint.y] = tile;
        this._loadTile(tile, tilePoint);
    },
    _loadTile: function (tile, tilePoint) {
        var layer = this;
        this._requests.push($.ajax({
            url: this.getTileUrl(tilePoint),
            dataType: 'json',
            success: function(datum) {
                tile.datum = datum;
                layer._tileLoaded();
            },
            error: function() {
                layer._tileLoaded();
            }
        }));
    },
    _resetCallback: function() {
        this._data = [];
        L.TileLayer.prototype._resetCallback.apply(this, arguments);
        for (var i in this._requests) {
            this._requests[i].abort(); 
        }
        this._requests = [];
    },
    _update: function() {
        if (this._map._panTransition && this._map._panTransition._inProgress) { return; }
        if (this._tilesToLoad < 0) this._tilesToLoad = 0;
        L.TileLayer.prototype._update.apply(this, arguments);
    }
});

L.TileLayer.GeoJSON = L.TileLayer.Ajax.extend({
    _geojson: {"type":"FeatureCollection","features":[]},
    initialize: function (url, options, geojsonOptions) {
        L.TileLayer.Ajax.prototype.initialize.call(this, url, options);
        this.geojsonLayer = new L.GeoJSON(this._geojson, geojsonOptions);
        this.geojsonOptions = geojsonOptions;
    },
    onAdd: function (map) {
        this._map = map;
        L.TileLayer.Ajax.prototype.onAdd.call(this, map);
        this.on('load', this._tilesLoaded);
        map.addLayer(this.geojsonLayer);
    },
    onRemove: function (map) {
        map.removeLayer(this.geojsonLayer);
        this.off('load', this._tilesLoaded);
        L.TileLayer.Ajax.prototype.onRemove.call(this, map);
    },
    data: function () {
        this._geojson.features = [];
        if (this.options.unique) {
            this._uniqueKeys = {};
        }
        var tileData = L.TileLayer.Ajax.prototype.data.call(this);
        for (var t in tileData) {
            var tileDatum = tileData[t];
            if (tileDatum && tileDatum.features) {

                // deduplicate features by using the string result of the unique function
                if (this.options.unique) {
                    for (var f in tileDatum.features) {
                        var featureKey = this.options.unique(tileDatum.features[f]);
                        if (this._uniqueKeys.hasOwnProperty(featureKey)) {
                            delete tileDatum.features[f];
                        }
                        else {
                            this._uniqueKeys[featureKey] = featureKey;
                        }
                    }
                }
                this._geojson.features =
                    this._geojson.features.concat(tileDatum.features);
            }
        }
        return this._geojson;
    },
    _resetCallback: function () {
        this._geojson.features = [];
        L.TileLayer.Ajax.prototype._resetCallback.apply(this, arguments);
    },
    _tilesLoaded: function (evt) {
        this.geojsonLayer.clearLayers().addData(this.data());
    }
});
@@ -623,25 +623,111 @@
  %7D,%0A    
-_loadTile
+// XMLHttpRequest handler; closure over the XHR object, the layer, and the tile%0A    _xhrHandler
 : functi
@@ -730,31 +730,32 @@
 nction (
-tile
+req, layer
 , tile
-Point
 ) %7B%0A    
@@ -762,173 +762,186 @@
     
-var layer = this;%0A        this._requests.push($.ajax(%7B%0A            url: this.getTileUrl(tilePoint),%0A            dataType: 'json',%0A            success: function(datum
+return function() %7B%0A            if (req.readyState != 4) %7B%0A                return;%0A            %7D%0A            var s = req.status;%0A            if ((s %3E= 200 && s %3C 300) %7C%7C s == 304
 ) %7B%0A
@@ -969,21 +969,44 @@
 datum = 
-datum
+JSON.parse(req.responseText)
 ;%0A      
@@ -1045,25 +1045,31 @@
            %7D
-,
+ else %7B
 %0A           
@@ -1073,89 +1073,393 @@
     
-error: function() %7B%0A                layer._tileLoaded();%0A            %7D%0A        %7D)
+    layer._tileLoaded();%0A            %7D%0A        %7D%0A    %7D,%0A    // Load the requested tile via AJAX%0A    _loadTile: function (tile, tilePoint) %7B%0A        var layer = this;%0A        var req = new XMLHttpRequest();%0A        this._requests.push(req);%0A        req.onreadystatechange = this._xhrHandler(req, layer, tile);%0A        req.open('GET', this.getTileUrl(tilePoint), true);%0A        req.send(
 );%0A 
@@ -1669,17 +1669,16 @@
 abort();
- 
 %0A       
@@ -4072,20 +4072,21 @@
 s.data());%0A    %7D%0A%7D);
+%0A

Remove JQuery dependency by coding XMLHttpRequest directly.