mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
122 lines
3.1 KiB
JavaScript
122 lines
3.1 KiB
JavaScript
|
/**
|
||
|
* History.js Dojo Adapter
|
||
|
*
|
||
|
* Essentially the same as the native adapter but uses dojo/ready for the dom load callback.
|
||
|
*
|
||
|
* @author Benjamin Arthur Lupton <contact@balupton.com>
|
||
|
* @copyright 2010-2011 Benjamin Arthur Lupton <contact@balupton.com>
|
||
|
* @license New BSD License <http://creativecommons.org/licenses/BSD/>
|
||
|
*/
|
||
|
|
||
|
// Closure
|
||
|
(function(window,undefined){
|
||
|
"use strict";
|
||
|
|
||
|
// Localise Globals
|
||
|
var History = window.History = window.History||{},
|
||
|
require = window.require;
|
||
|
|
||
|
// Check Existence
|
||
|
if ( typeof History.Adapter !== 'undefined' ) {
|
||
|
throw new Error('History.js Adapter has already been loaded...');
|
||
|
}
|
||
|
|
||
|
// Add the Adapter
|
||
|
History.Adapter = {
|
||
|
/**
|
||
|
* History.Adapter.handlers[uid][eventName] = Array
|
||
|
*/
|
||
|
handlers: {},
|
||
|
|
||
|
/**
|
||
|
* History.Adapter._uid
|
||
|
* The current element unique identifier
|
||
|
*/
|
||
|
_uid: 1,
|
||
|
|
||
|
/**
|
||
|
* History.Adapter.uid(element)
|
||
|
* @param {Element} element
|
||
|
* @return {String} uid
|
||
|
*/
|
||
|
uid: function(element){
|
||
|
return element._uid || (element._uid = History.Adapter._uid++);
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* History.Adapter.bind(el,event,callback)
|
||
|
* @param {Element} element
|
||
|
* @param {String} eventName - custom and standard events
|
||
|
* @param {Function} callback
|
||
|
* @return
|
||
|
*/
|
||
|
bind: function(element,eventName,callback){
|
||
|
// Prepare
|
||
|
var uid = History.Adapter.uid(element);
|
||
|
|
||
|
// Apply Listener
|
||
|
History.Adapter.handlers[uid] = History.Adapter.handlers[uid] || {};
|
||
|
History.Adapter.handlers[uid][eventName] = History.Adapter.handlers[uid][eventName] || [];
|
||
|
History.Adapter.handlers[uid][eventName].push(callback);
|
||
|
|
||
|
// Bind Global Listener
|
||
|
element['on'+eventName] = (function(element,eventName){
|
||
|
return function(event){
|
||
|
History.Adapter.trigger(element,eventName,event);
|
||
|
};
|
||
|
})(element,eventName);
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* History.Adapter.trigger(el,event)
|
||
|
* @param {Element} element
|
||
|
* @param {String} eventName - custom and standard events
|
||
|
* @param {Object} event - a object of event data
|
||
|
* @return
|
||
|
*/
|
||
|
trigger: function(element,eventName,event){
|
||
|
// Prepare
|
||
|
event = event || {};
|
||
|
var uid = History.Adapter.uid(element),
|
||
|
i,n;
|
||
|
|
||
|
// Apply Listener
|
||
|
History.Adapter.handlers[uid] = History.Adapter.handlers[uid] || {};
|
||
|
History.Adapter.handlers[uid][eventName] = History.Adapter.handlers[uid][eventName] || [];
|
||
|
|
||
|
// Fire Listeners
|
||
|
for ( i=0,n=History.Adapter.handlers[uid][eventName].length; i<n; ++i ) {
|
||
|
History.Adapter.handlers[uid][eventName][i].apply(this,[event]);
|
||
|
}
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* History.Adapter.extractEventData(key,event,extra)
|
||
|
* @param {String} key - key for the event data to extract
|
||
|
* @param {String} event - custom and standard events
|
||
|
* @return {mixed}
|
||
|
*/
|
||
|
extractEventData: function(key,event){
|
||
|
var result = (event && event[key]) || undefined;
|
||
|
return result;
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* History.Adapter.onDomLoad(callback)
|
||
|
* @param {Function} callback
|
||
|
* @return
|
||
|
*/
|
||
|
onDomLoad: function(callback) {
|
||
|
require(["dojo/ready"], function(ready) {
|
||
|
ready(callback);
|
||
|
});
|
||
|
}
|
||
|
};
|
||
|
|
||
|
// Try to Initialise History
|
||
|
if ( typeof History.init !== 'undefined' ) {
|
||
|
History.init();
|
||
|
}
|
||
|
|
||
|
})(window);
|