Wanna try the jQuery-friendly version?

(function() {

    var canvases  = document.getElementsByClassName('drawing-canvas');
    var clearBtns = document.getElementsByClassName('clear');
    var undoBtns  = document.getElementsByClassName('undo');
    var redoBtns  = document.getElementsByClassName('redo');
    var dataBtns  = document.getElementsByClassName('data');

    for (var i = 0; i < canvases.length; i++) {
      // Create closure so that we can user inner variables in a dedicated scope.
      (function(i) {

        var sketcher = new Sketchable(canvases[i]);

        clearBtns[i].addEventListener('click', function(e) {
          e.preventDefault();
          sketcher.clear();
          findOutput(e.target).innerHTML = '';
        });

        undoBtns[i].addEventListener('click', function(e) {
          e.preventDefault();
          sketcher.memento.undo();
        });

        redoBtns[i].addEventListener('click', function(e) {
          e.preventDefault();
          sketcher.memento.redo();
        });

        dataBtns[i].addEventListener('click', function(e) {
          e.preventDefault();
          var strokes = sketcher.strokes();
          var p = 'Drawing has '+ strokes.length +' strokes<br>';
          for (var i = 0; i < strokes.length; ++i) {
            p += '<strong>stroke ' + i + ':</strong> ';
            var stroke = strokes[i];
            for (var j = 0; j < stroke.length; ++j) {
              p += '(' + stroke[j][0] +','+ stroke[j][1] + ')';
            }
            p += '<br>';
          }
          findOutput(e.target).innerHTML = p;
        });

      })(i);
    }

    function findOutput(button) {
      return button.parentNode.parentNode.getElementsByClassName('drawing-data')[0];
    };

})();