Giter Site home page Giter Site logo

leaflet.contextmenu's Introduction

Leaflet.contextmenu

CDNJS npm Bower

A context menu for Leaflet. See the demo.

Now supporting Leaflet 1.0

Usage

The context menu is implemented as a map interaction handler. To use the plugin include the script and enable using the map contextmenu option.

var map = L.map('map', {
	contextmenu: true,
    contextmenuWidth: 140,
	contextmenuItems: [{
	    text: 'Show coordinates',
	    callback: showCoordinates
	}, {
	    text: 'Center map here',
	    callback: centerMap
	}, '-', {
	    text: 'Zoom in',
	    icon: 'images/zoom-in.png',
	    callback: zoomIn
	}, {
	    text: 'Zoom out',
	    icon: 'images/zoom-out.png',
	    callback: zoomOut
	}]
});


function showCoordinates (e) {
	alert(e.latlng);
}

function centerMap (e) {
	map.panTo(e.latlng);
}

function zoomIn (e) {
	map.zoomIn();
}

function zoomOut (e) {
	map.zoomOut();
}

The context menu mixin allows markers and vector features to extend the map context menu with their own menu items. In addition to the menu item options available for the map context menu marker's also accept an index option that specifies where the menu item should be inserted relative to the existing map menu items.

L.marker(ll, {
    contextmenu: true,
    contextmenuItems: [{
        text: 'Marker item',
        index: 0
    }, {
        separator: true,
        index: 1
    }]
}).addTo(map);

All Options

Map Context Menu Options

Option Type Default Description
contextmenu Bool false Enables the context menu.
contextmenuWidth Number undefined If defined sets the context menu width, if undefined the menu will be sized by the maximum width of its menu items.
contextmenuAnchor L.Point/Array undefined An offset applied to the click point to control the context menu position.
contextmenuItems Array [] Specification for the context menu items. See following options for individual menu items. A separator may also be added with a dash character '-'.

Menu Item Options

Option Type Default Description
text String undefined The label to use for the menu item (required).
icon String undefined Url for a 16x16px icon to display to the left of the label.
retinaIcon String undefined Url for a retina-sized version (32x32px) icon to display to the left of the label.
iconCls String undefined A CSS class which sets the background image for the icon (exclusive of the icon option).
retinaIconCls String undefined A CSS class which sets the background image for a retina version of the icon (exclusive of the retinaIcon option).
callback Function undefined A callback function to be invoked when the menu item is clicked. The callback is passed an object with properties identifying the location the menu was opened at: latlng, layerPoint and containerPoint.
context Object The map The scope the callback will be executed in.
disabled Bool false If true the menu item will initially be in a disabled state and will not respond to click events.
separator Bool undefined If true a separator will be created instead of a menu item.
hideOnSelect Bool true If true the context menu will be automatically hidden when a menu item is selected

Mixin Options

Option Type Default Description
contextmenu Bool false Enables the context menu.
contextmenuItems Array [] Specification for the context menu items.
contextmenuInheritItems Bool true If true (the default) the feature menu items are displayed in addition to the map's context menu items.

Methods

A reference to the map's context menu can be obtained through the map variable e.g. map.contextmenu.

showAt(L.Point/L.LatLng, [data])

Opens the map's context menu at the specified point. data is an optional hash of key/value pairs that will be included on the map's contextmenu.show event.

hide()

Hides the map's context menu if showing.

addItem(options)

Adds a new menu item to the context menu.

insertItem(options, index)

Adds a new menu item to the context menu at the specified index. If the index is invalid the menu item will be appended to the menu.

removeItem(HTMLElement/index)

Removes a menu item.

removeAllItems()

Removes all menu items.

setDisabled(HTMLElement/index, disabled)

Set's the disabled state of a menu item.

isVisible()

Returns true if the context menu is currently visible.

Mixin Methods

The following methods are available on supported layer types when using the context menu mixin.

bindContextMenu(contextMenuOptions)

Binds a context menu to the feature the method is called on.

unbindContextMenu()

Unbinds the context menu previously bound to the feature with the bindContextMenu() method.

GeoJSON Data

To use the context menu with GeoJSON data it's necessary to use one of the GeoJSON layer's pointToLayer or onEachFeature methods.

Point Data

var jsonLayer = L.geoJson(jsonData, {
	pointToLayer: function (data, latLng) {
	    var marker = new L.Marker(latLng, {
	        contextmenu: true,
	        contextmenuItems: [{
	            text: 'Marker item'
	        }]
        });
	    return marker;
	}
 }).addTo(map);

Other Types

var jsonLayer = L.geoJson(jsonData, {
	onEachFeature: function (feature, layer) {
        layer.bindContextMenu({
            contextmenu: true,
	        contextmenuItems: [{
	            text: 'Marker item'
	        }]
        });
	}
 }).addTo(map);

Events

The following events are triggered on the map:

contextmenu.show

Fired when the context menu is shown. If the context menu was shown in response to a map contextmenu event the event object will extend MouseEvent.

Property Type Description
contextmenu Map.ContextMenu The context menu.
relatedTarget L.Marker/L.Path/undefined If the context menu was opened for a map feature this property will contain a reference to that feature.

contextmenu.hide

Fired when the context menu is hidden.

Property Type Description
contextmenu Map.ContextMenu The context menu.

contextmenu.select

Fired when a context menu item is selected.

Property Type Description
contextmenu Map.ContextMenu The context menu.
el HTMLElement The context menu item element that was selected.

contextmenu.additem

Fired when a menu item is added to the context menu.

Property Type Description
contextmenu Map.ContextMenu The context menu.
el HTMLElement The context menu item element.
index Number The index at which the menu item was added.

contextmenu.removeitem

Fired when a menu item is removed from the context menu.

Property Type Description
contextmenu Map.ContextMenu The context menu.
el HTMLElement The context menu item element.

contextmenu.enableitem

Fired when a menu item is enabled.

Property Type Description
contextmenu Map.ContextMenu The context menu.
el HTMLElement The context menu item element.

contextmenu.disableitem

Fired when a menu item is disabled.

Property Type Description
contextmenu Map.ContextMenu The context menu.
el HTMLElement The context menu item element.

Development

Edit files in src/. To build the files in dist/, run:

npm install
npm run build

License

This software is released under the MIT licence. Icons used in the example are from http://glyphicons.com.

leaflet.contextmenu's People

Contributors

adimitrov avatar aparshin avatar aratcliffe avatar buma avatar fbonzon avatar jelhan avatar kennynaoh avatar nnseva avatar rmlanman avatar w8r avatar wattnpapa avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

leaflet.contextmenu's Issues

publish to npm

Please, consider publishing your plugin to npm by addign a UMD header and package.json. If you are too busy at the moment, I can create a PR with these changes

Using Leaflet Contextmenu with mapbox ?

Hi ,
i want to use context menu with mapbox , i have already included a <script> tag linking to the plugin’s JavaScript source file and a tag for its CSS ,
but it did't work.
Thanks in advance.
Sehli

Context menu in polygon

Hi everyone

I've tried to use context menu plugin on a polygon but it seems it doesn't work.

Is it any kind of bug or it's a feature that is not included? It would be nice to have it.

Thansk!

Bower support?

Any chance you would make a tag for known release version and put this into bower repository?

Looks like a nice library, would use!

Example for the angular directive not working

I am using the leaflet angular directive for my project. I noticed the example for it which as created 16 days ago. I try to follow the code in the example but it didn't work. I then tried the example and it gives error.

Pass original 'contextmenu' event to item's callback

I use context menu mixin on my own layer (it extends L.TileLayer, but it's not important). My layer fires contextmenu event, which includes some additional information about click location.

I want to get access to this information in callback of context menu item. Maybe, it can be original contextmenu event in callback attributes or something like that...

What do you thing about this improvement? I can make PR if you agree with it in general...

How create item with delete L.Marker(owner context menu)?

I have

        this._positionMarker = L.marker([location.Y, location.X],{
                                      title: 'Результат поиска',
                                      contextmenu: true,
                                      contextmenuItems: [{
                                          text: 'Delete',
                                          callback: function(e) {map.removeLayer(this._positionMarker)}
                                         }
                                      ]
        }).bindPopup(location.Label).addTo(this._map);

and after push on "Delete" error:

                        Cannot read property '_leaflet_id' of undefined

Submenu suport

Is there any way/suggestion how to dinamicly add submenu items?

Multi-Level Menu

Hi there,
Is it possible to create multi-level menus?
Or are you planning to implement this soon?

Context menu keeping items on multiple clicks

If I attach the context menu to markers, and I click on multiple markers, the list of items on the context menu gets longer each time.

I fixed the issue by placing this line:
this._map.contextmenu.removeAllItems();
in _showContextMenu()

maybe not the best fix, but thought I'd share.

Issues with Internet Explorer and leaflet1.0: Clicks in contextmenu registered as map clicks - nothing happens

Hi there,

while using the leaflet.contextmenu with leaflet 0.7.x and internet explorer (version 11.545.10586.0) and Microsoft edge works perfect,
it does not register any menu selection when using leaflet1.0 instead. The contextmenu opens as normal but clicking a menu item gets registered as a click onto the map and therefore nothing happens.

I used the demo code (http://aratcliffe.github.io/Leaflet.contextmenu/examples/index.html) and just replaced the reference to the leaflet.js file to point to leaflet1.0.0.
I tried rc1 and rc3.

Plugin crashes if it's loaded but the contextmenu options aren't included

If you create your map with options but don't include the contextmenu options, the plugin will crash because it cannot find length of null.

I fixed it by changing the addInitHook to this:

L.Map.addInitHook(function () {
if (this.options.contextmenu) {
this.addHandler('contextmenu', L.Map.ContextMenu);
}
});

ContextMenu "on the way"

Hi there,

first of all thanks for this amazing plugin, it has been able to give me an incredible workflow in my web application. Is it possible to add the event by calling a method, like this:

marker.bindcontextmenu([{text:"", callback: "", context}]);

(or something to work around the initialization of the object)

thank you for the attention, best regards,

Renato Duarte.

command to enable/disable the entire context menu

Hi - lovely plugin. I'd like to be able to disable an entire context menu at will - i.e. I'd like a map with a custom context-menu, but then to have a javascript call that will disable the entire context menu and allow fallthrough to the browser's standard contextmenu. Is this possible? I don't see an obvious call there in the source code. Maybe there's a way to do it.

(The reason is that I'd like to add a keyboard shortcut to allow users to fallthrough to the default contextmenu when they want to. On firefox holding shift does this, but not other browsers.)

Double tapping required to trigger action

I'm developing an apache cordova app for android mobile devices.

The issue is that I have to tap one time to "select" the item in the context menu (item's background turns gray), and then tap once more to trigger the action associated to the "selected" item.

The behaviour should be tapping only one time to trigger the action, right?

Testing on the computer on chrome works ok (I think it triggers a "click", not a "tap")

Problem with building on Windows

I'm using this plugin in a bigger solution and want to build it automatically as a part of general build process. Unfortunately, our main OS is Windows, and it's not possible to run command npm run build from native Windows environment because of missing cat command.

Is it possible to write OS independent build script? Maybe grunt or gulp build systems can be used...

Extend ContextMenu

Hi,

I'm trying to add nested menus to your awesome plugin.

Instead of changing the original code, I'm trying to extend it as follow:

L.Map.ContextMenuExtender = L.Map.ContextMenu.extend({ })

I would like to override certain methods such as _showContextMenu for instance. My idea, is that my overrided methods would be called instead of the original ones.

But I can't find a way of doing it.

Thanks in advance for the help.

Tom

Ignore context menus on controls

Recently I am on a project where there is a need to show the context menu on map, however when clicking on a control (L.Control) there should display no menu. Are there any suggested ways to achieve that? Thanks!

How to access the target element on the callback?

Given the code:

success: function( data, textStatus, jQxhr ){
                    //alert("Point of interest inserted.");
                    marker = new L.marker([lat,lng],{
                        title:"marker"+storage.length,
                        contextmenu: true,
                        contextmenuItems: [{
                            text: 'Edit Marker',
                            icon: 'images/edit.png',
                            callback: openPopup,
                            index: 0
                        }, {
                            separator: true,
                            index: 1
                        }]}).bindPopup("marker"+storage.length);
(...)

function openPopup (e) {

}

Is it possible to know which marker was selected in the function openPopup()?

Is there a way to show other items in contextmenu

More of a question than an issue but, Is there a way to show other items in contextmenu besides just text like a simple select box for example.

I've tried

var map = L.map('map', {
    contextmenu: true,
    contextmenuWidth: 140,
    contextmenuItems: [{
        text: 'Show coordinates',
        callback: showCoordinates
    }, {
        text: 'Center map here',
        callback: centerMap
    }, '-', {
        text: 'Zoom in',
        icon: 'images/zoom-in.png',
        callback: zoomIn
    }, {
        text: 'Zoom out',
        icon: 'images/zoom-out.png',
        callback: zoomOut
    }, {
        text: "<select><option value='volvo'>Volvo</option><option value='saab'>Saab</option></select>",
        icon: 'images/zoom-out.png',
        callback: zoomOut]
}); 

Problem is when I click on the select box the contextmenu instantly closes

What object is the context menu attached to?

Is there a way to find which object owns the context menu? I have 50+ markers on my map image and I want to know which of these markers the user clicked on when he selects an item on the context menu.

Context Menu on Paths

Could you please let me know that we can use the context menu on paths?
It is working on 'map', but not ok with 'paths'. I used angular-leaflet-directive. Thanks

setDisabled(index, disabled)

I have created 5 contextmenu items for a marker which does not inherit the map menu and they behave as expected apart from not being able to be enabled.

They are assigned indexes in the following fashion and are initially disabled:

contextmenu: true,
contextmenuInheritItems: false,
contextmenuItems = [{
text: editAddressText,
callback: showEditAddress,
icon: "../images/editaddress.png",
disabled: true,
index: 10
},
... etc

When they are conditionally enabled the following code executes without erroring but the items stay disabled:

for (i = 10; i < 15; i++) {
map.contextmenu.setDisabled(i,false);
}

Any ideas?

GeoJSON layer support

It would be nice to have also opportunity to add context menu for features come from geojson. Something like:

L.geoJson(json,{
  ...
  onEachFeature: function (feature, layer) {
    layer.contextmenu = true;
    layer.contextmenuItems = [
      ...
    ];
});

Doesn´t work over a polygon layer

When any polygon (GeoJSON) layer is switched on I am not able to open context menu by right-click. Outside a layer or when layer is switched off it works great. Any idea? Thanks

Different Context Menu for Map and Markers.

I am not sure if this is a issue or not, but not sure how to solve the problem.

I have 2 context menu's. One for the map and one for marker. I need the context menu to have different values.
The Map Context Menu has 2 values:

  1. Add beacon 2. Add Cube
    The Marker Context Menu has 3 Values:
  2. Edit 2. Deactive 3. Remove.

The Problem is the when i click on the Marker Context menu I get value from map and marker Context menu as below:

  1. Edit
  2. Deactivate
  3. Remove
  4. Add Beacon
    5, Add Marker

Below is the code:

    var map, cm;
    var Markers = new Array();
    var mapMinZoom = 0;
    var mapMaxZoom = 5;

    $(document).ready(function () {

        //base Tile Layer
        var base = L.tileLayer('{z}/{x}/{y}.png', {
            minZoom: mapMinZoom, maxZoom: mapMaxZoom,
            //bounds: mapBounds,
            attribution: 'Rendered with <a href="http://www.maptiler.com/">MapTiler</a>',
            noWrap: true
        });

        //Adding Beacon Layer 

        var markerLayer = new L.LayerGroup();
      //  L.Marker.include(L.Mixin.ContextMenu);

        //Adding Base Maps
        var map = L.map('map', {
            maxZoom: mapMaxZoom,
            minZoom: mapMinZoom,
            layers: [base, markerLayer],
            contextmenu: true,
            contextmenuWidth: 140,
            contextmenuItems: [{
                text: 'Add beacon',
                callback: addBeacon,
                index: 0
                }, {
                text: 'Add Cube',
                callback: addCube,
                index: 1
                }],
            crs: L.CRS.Simple
        }).setView([0, 0], mapMaxZoom);

        //For Raster Images
         var mapBounds = new L.LatLngBounds(
         map.unproject([0, 3328], mapMaxZoom),
         map.unproject([4864, 0], mapMaxZoom));

         map.fitBounds(mapBounds);



      // var markerLayer = new L.LayerGroup();

       var baseLayers = {
           "BaseMap": base
       };

       var overlays = {
           "Beacons": markerLayer
       };

       L.control.layers(baseLayers, overlays).addTo(map);

        //On Zoom Change Icon Size
       map.on('zoomend', changeIconBasedOnZoom);

        //Callback functions to Add Beacons
       function addBeacon(e) {
           var beaconID = guid();
           var markerType = 'beacon';
           var markerStatus = 'provisioned';
           var zoomedIcon = getIconBasedOnZoom(markerType, markerStatus);

           var beacon = new L.marker(e.latlng, {
               id: beaconID,
               icon: zoomedIcon,
               draggable: 'true',
               type: markerType,
               status: markerStatus,
               contextmenu: 'true',
               hideOnSelect: 'true',
               contextmenuItems: [{
                   text: 'Edit Beacon',
                   index: 0
               }, {
                   separator: true,
                   index: 1
               }, {
                   text: 'Deactivate Beacon',
                   index: 2

               }, {
                   separator: true,
                   index: 3
               }, {
                   text: 'Remove Beacon',
                   index: 4   
               }]
           });

           Markers.push(beacon);
           markerLayer.addLayer(beacon);
       }

        //Callback functions to Add Cube
       function addCube(e) {
           var cubeID = guid();
           var markerType = 'cube';
           var markerStatus = 'provisioned';
           var zoomedIcon = getIconBasedOnZoom(markerType, markerStatus);

           var cube = new L.marker(e.latlng, {
               id: cubeID,
               icon: zoomedIcon,
               draggable: 'true',
               type: markerType,
               status: markerStatus,
               contextmenu: 'true',
               hideOnSelect: 'true',
               contextmenuItems: [{
                   text: 'Edit Cube',
                   index: 0
               }, {
                   separator: true,
                   index: 1
               }, {
                   text: 'Deactivate Cude',
                   index: 2

               }, {
                   separator: true,
                   index: 3
               }, {
                   text: 'Remove Cube',
                   index: 4
               }]
           });

           Markers.push(cube);
           markerLayer.addLayer(cube);

       }

Mobile support

Is there some mobile support planned?

E.g. long pressing could open the context menu

iconCls with fontawesome

Hello,

Instead of using an image, I would like to use to fontawesome icon set.
Is that possible?

For example zoom-in and zoom-out iconClass:

I use the following code:

map.contextmenu.addItem({text: 'Show coordinates', iconCls: 'fa-thumb-tack', callback: showCoordinates});
map.contextmenu.addItem({text: 'Center map here', iconCls: 'fa-map-marker', callback: centerMap});

I am using Leaflet v0.7.1 with font-awesome v4.0.3

leaflet_contextmenu_iconcls

leaflet 1.X compatibility

When i use context menu with leaflet 1.0.0.beta1 the context appear, but disappear when i move the mouse

Help please, run ajax from context menu

Hello,

function runAjax (id) {
console.log(id);
}

callback: runAjax (id)

So then we reload page, it every time run all callback from all markers.

Thank you.

Select menu item by text

First of all: thanks for creating this plugin! It has proven to be very useful.
Up until now, I have only used static menus with a fixed number of items that are always enabled. However, now I need items to (dis)appear dynamically. Therefore I need to use the functions removeItem() and setDisabled(), but I don't see how or where to get a HTMLElement parameter to select the item. Should I have saved these when creating the menu? This seems cumbersome to me.
I cannot use the index because menu items get inserted in random ways, depending on program state.
Or am I missing something? (I'm not a very experienced js programmer (yet...)).
Is there no way to select items by name (item text)? That would make things really easy.

Menu placement on touch devices

Hello,
I believe there is a usability issue with where the contextual menu is placed when long pressing on a touch device.

Quite often, I find myself using the thumb finger to invoke that menu, and when it is only populated with a few entries, the place it popped up at is "hidden" in view and you don't immediately notice it.

May I suggest you move it a bit higher in the viewport if possible?

Adding Menus to existing layers

Is it possible to add a context menu to an already existing layer?

While the following is possible for the map its not working with layers like polyline (there failing at L.Map.ContextMenu.L.Handler.extend._createItems line 177).

mapMenu = new L.Map.ContextMenu(map)
mapMenu.addItem { text: 'Neues Feld', callback: () -> alert('Feld erstellen...') }
mapMenu.addHooks()

For polylines I'm doing the following which works:

polygon.options.contextmenu = true
polygon.options.contextmenuItems = [{ text: "gach", callback: () -> alert("gach") }]
polygon._initContextMenu()

Is that the only way to add and enable a context menu on something other than a map? It shouldn't be.

Update NPM-version

I included leafelt-contextmenu in my project and after a long search i found out, that the new changes/commits arent't yet at npm available. I know i can donload it form github and build i myself, but wouldn't it be useful to update ?
I wanted to use relatedTarget.

Console error

We're soon to go into production and want to remove this console error:

leaflet.contextmenu.js:7 Uncaught TypeError: Cannot read property 'length' of undefined

Which occurs whenever the contextmenu is invoked with a right click. It doesn't seem to cause any problems in operation though.

bad behaviour of contextmenu callback for geoJSON layer objects

Hi,
I try to give different link on a contextmenu depending of which JSON element was right clicked.
Here is a fiddle for this bug:
http://jsfiddle.net/jdembdr/y97k2n2z/embedded/result/

The same property (name 'A') appears in my callback for every element when I try to initialize a contextmenu during the onEachFeature processing of the GeoJSON layer building step.

var controlLayer = L.control.layers();
controlLayer.addOverlay(L.geoJson(docks_json, {onEachFeature: addContextLayer}),'Docks');
function addContextLayer(feature, layer) {
    if (feature.properties && feature.properties.name) {
        var contextMenuItems = [{
            text: 'dock name',
            callback: function(e){alert(feature.properties.name)},
        },];
        this["contextmenu"]=true;
        this["contextmenuItems"]=contextMenuItems;
        this["contextmenuInheritItems"]=false;
    }
}

ie . feature.properties.name is the same for every element when callback is called.

I don't know very well JS so maybe is it just a misunderstanding of the langage, but if you could help me, It would be great !

Attach Context Menu after loading polygon

Is it possible to attach context menu after we load the polygon?
Because I need to set the title and function after i know the location(longitude,latitude) of the click event

Modify existing mixin menu

I'm trying to modify an existing context menu that was bound to a polygon. From what I read, it looks like access is always through the map's context menu. When doing an operation like AddItem, how do I direct the add to the polygon's context menu and not the maps?

Sorry for posting this here, as it may not be an issue. Probably my lack of understanding.

Thanks, Scott Alden ([email protected])

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.