mirror of https://github.com/luileito/jsketch.git
132 lines
3.6 KiB
JavaScript
132 lines
3.6 KiB
JavaScript
/* eslint-env browser */
|
|
|
|
(function() {
|
|
var cache = [0], expando = 'data' + Date.now();
|
|
function data(elem) {
|
|
var cacheIndex = elem[expando],
|
|
nextCacheIndex = cache.length;
|
|
if (!cacheIndex) {
|
|
cacheIndex = elem[expando] = nextCacheIndex;
|
|
cache[cacheIndex] = {};
|
|
}
|
|
return cache[cacheIndex];
|
|
};
|
|
/**
|
|
* Add/Read private data to a DOM element.
|
|
* @global
|
|
* @method
|
|
* @param {Object} elem - DOM element to attach data to.
|
|
* @example
|
|
* var elem = document.getElementById('foo');
|
|
* // Attach private data to element:
|
|
* dataBind(elem).someName = { value: 42 };
|
|
* dataBind(elem)['other-name'] = { value: 43 };
|
|
* // Read private data from element:
|
|
* var some = dataBind(elem).someName;
|
|
* var other = dataBind(elem)['other-name'];
|
|
*/
|
|
window.dataBind = data;
|
|
})();
|
|
|
|
/**
|
|
* Event manager.
|
|
* @global
|
|
* @module Event
|
|
*/
|
|
window.Event = {
|
|
/**
|
|
* Add event to DOM element.
|
|
* @memberof module:Event
|
|
* @param {Object} elem - DOM element.
|
|
* @param {String} type - Event type.
|
|
* @param {Function} fn - Callback.
|
|
* @example
|
|
* Event.add(document.getElementById('foo'), 'click', function fooClick(evt) {
|
|
* // Element was clicked.
|
|
* });
|
|
*/
|
|
add: function(elem, type, fn) {
|
|
if (!elem) return false;
|
|
if (elem.addEventListener) { // W3C standard
|
|
elem.addEventListener(type, fn, false);
|
|
} else if (elem.attachEvent) { // Old IE versions
|
|
elem.attachEvent('on'+type, fn);
|
|
} else { // Really old browser
|
|
elem[type+fn] = function() {
|
|
fn(window.event);
|
|
};
|
|
}
|
|
},
|
|
/**
|
|
* Remove event from DOM element.
|
|
* @memberof module:Event
|
|
* @param {Object} elem - DOM element.
|
|
* @param {String} type - Event type.
|
|
* @param {Function} fn - Callback.
|
|
* @example
|
|
* // Assuming elemen had the `fooClick` function (see previous example):
|
|
* Event.remove(document.getElementById('foo'), 'click', fooClick);
|
|
*/
|
|
remove: function(elem, type, fn) {
|
|
if (!elem) return false;
|
|
if (elem.removeEventListener) { // W3C standard
|
|
elem.removeEventListener(type, fn, false);
|
|
} else if (elem.detachEvent) { // Old IE versions
|
|
elem.detachEvent('on'+type, fn);
|
|
} else { // Really old browser
|
|
elem[type+fn] = null;
|
|
}
|
|
},
|
|
/**
|
|
* Determine if an event is a "right click" event.
|
|
* @memberof module:Event
|
|
* @param {Object} ev - DOM event.
|
|
* @return {Boolean}
|
|
* @example
|
|
* // Assume this function is a click event listener.
|
|
* function clickHandler(evt) {
|
|
* alert(Event.isRightClick(evt));
|
|
* });
|
|
*/
|
|
isRightClick: function(ev) {
|
|
if (!ev) ev = window.event;
|
|
if (ev.which) return ev.which === 3;
|
|
else if (ev.button) return e.button === 2;
|
|
return false;
|
|
},
|
|
|
|
};
|
|
|
|
/**
|
|
* A handy method to (deep) extend an object.
|
|
* The input object is modified.
|
|
* @global
|
|
* @param {Object} myObj - Input object.
|
|
* @return {Object}
|
|
* @example
|
|
* var one = { foo:1, bar: { a:true, b:false } };
|
|
* var two = { bar: { a:false } };
|
|
* // In this case both `ext` and `one` will be the same object.
|
|
* var ext = deepExtend(one, two);
|
|
* // To create a fresh copy, pass in an empty object as first arg.
|
|
* var ext = deepExtend({}, one, two);
|
|
* // Now `ext` is `{ foo:1, bar: { a:false, b:false } }`
|
|
* // and `one` is left intact.
|
|
*/
|
|
window.deepExtend = function(myObj) {
|
|
myObj = myObj || {};
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
var obj = arguments[i];
|
|
for (var key in obj) {
|
|
if (obj.hasOwnProperty(key)) {
|
|
if (typeof obj[key] === 'object') {
|
|
myObj[key] = deepExtend(myObj[key], obj[key]);
|
|
} else {
|
|
myObj[key] = obj[key];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return myObj;
|
|
};
|