themes-wordpress/libretto/js/touche.js
2018-02-27 14:27:44 +11:00

94 lines
2 KiB
JavaScript

/* global jQuery:true */
(function() {
'use strict';
var isTouch = 'ontouchstart' in window || 'msmaxtouchpoints' in window.navigator;
function Touche(nodes) {
// Doing this allows the developer to omit the `new` keyword from their calls to Touche
if ( ! (this instanceof Touche)) {
return new Touche( nodes );
}
if ( ! nodes) {
throw new Error( 'No DOM elements passed into Touche' );
}
this.nodes = nodes;
return this;
}
// Our own event handler
Touche.prototype.on = function(event, fn) {
var touchend, nodes = this.nodes,
len = nodes.length,
ev;
if (isTouch && event === 'click') {
touchend = true;
}
ev = function(el, event, fn) {
var called, once = function() {
if ( ! called && (called = true)) {
fn.apply( this, arguments );
}
};
el.addEventListener( event, once, false );
if (touchend) {
el.addEventListener( 'touchend', once, false );
}
};
// NodeList or just a Node?
if (len) {
while (len--) {
ev( nodes[len], event, fn );
}
} else {
ev( nodes, event, fn );
}
return this;
};
// Expose Touche
window.Touche = Touche;
// Has the developer used jQuery?
if (window.jQuery && isTouch) {
var originalOnMethod = jQuery.fn.on,
originalOffMethod = jQuery.fn.off;
var replaceEventName = function (event) {
if (event.slice( 0, 5 ) == 'click') {
return event.replace( 'click', 'touchend' );
}
return event;
}
// Change event type and re-apply .on() method
jQuery.fn.on = function() {
// arguments[0] is the event name if provided
if (typeof arguments[0] === "string") {
arguments[0] = replaceEventName( arguments[0] );
}
originalOnMethod.apply( this, arguments );
return this;
};
// Change event type and re-apply .off() method
jQuery.fn.off = function() {
// arguments[0] is the event name if provided
if (typeof arguments[0] === "string") {
arguments[0] = replaceEventName( arguments[0] );
}
originalOffMethod.apply( this, arguments );
return this;
};
}
})();