jQuery Microdata

·

The Microdata DOM API allows JavaScript programs to read and write data embedded in HTML as Microdata. However, browsers never fully supported the API, and are dropping any native support that did exist. I've written a jQuery plugin that provides equivalent functions and makes them easier to use.

Microdata DOM API

As specified by the W3C Working Group, document.getItems(itemtype) returns a collection of all the elements with an itemscope attribute in the current document that have the given itemtype attribute.

Each itemscope element has a properties object that provides access to all of the element's itemprop descendants (either contained directly or referenced elsewhere in the document using the itemref attribute).

properties[itemprop] returns a list of all the nodes that represent the given property.

.getValues() returns an array of values from that list of nodes.

.itemValue gets and sets the value of an individual node.

These methods and properties allow the program to access all the Microdata nodes and values in the document. However, in order to provide this flexibility, the DOM API can be quite long-winded when reading the value of a single property, which is most often what's needed. For example:

var artists = document.getItems('http://schema.org/MusicGroup');
var albumTitle = artists[0].properties['album'][0].properties['name'][0].itemValue;

jQuery Microdata

jQuery Microdata's items() method mimics document.getItems() but can be used with any element as the root:

$('#artists').items('http://schema.org/MusicGroup');

As jQuery methods apply to the set of all matched elements, the interface is simplified, as we can avoid specifying an index when there's only one matched element:

var artists = $('#artists').items('http://schema.org/MusicGroup');
var albumTitle = artists.eq(0).property('album').property('name').value();

The same value method, with an argument, is used to set values:

var artist = $('#artists').items('http://schema.org/MusicGroup').eq(0);
artist.property('name').value('The Beatles');
artist.property('album').property('name').value('Revolver');

The values() method returns the values of all the matched elements as an array:

var titles = $('#artists').items('http://schema.org/MusicGroup')
    .property('album').property('name').values();

jQuery Things

As a convenience method for reading and writing single properties of an item, the microdata() method (equivalent to jQuery's data() method, but working with data stored as microdata rather than in data-* attributes) can be used to either read a single property (one argument), set a single property (two arguments), or set multiple properties (first argument as an object):

$('#artists').items('http://schema.org/MusicAlbum').each(function() {
    var album = $(this);

    // get a value
    var title = album.microdata('name');

    // set a value
    album.microdata('url', 'https://www.google.com/search?q=' + title);

    // set multiple values
    album.microdata({
        name: 'Revolver',
        datePublished: '1966'
    });

    // get all the properties as a data object
    var data = album.microdata();
}

jQuery Microdata is available via GitHub.