history.adapter.dojo.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. /**
  2. * History.js Dojo Adapter
  3. *
  4. * Essentially the same as the native adapter but uses dojo/ready for the dom load callback.
  5. *
  6. * @author Benjamin Arthur Lupton <contact@balupton.com>
  7. * @copyright 2010-2011 Benjamin Arthur Lupton <contact@balupton.com>
  8. * @license New BSD License <http://creativecommons.org/licenses/BSD/>
  9. */
  10. // Closure
  11. (function(window,undefined){
  12. "use strict";
  13. // Localise Globals
  14. var History = window.History = window.History||{},
  15. require = window.require;
  16. // Check Existence
  17. if ( typeof History.Adapter !== 'undefined' ) {
  18. throw new Error('History.js Adapter has already been loaded...');
  19. }
  20. // Add the Adapter
  21. History.Adapter = {
  22. /**
  23. * History.Adapter.handlers[uid][eventName] = Array
  24. */
  25. handlers: {},
  26. /**
  27. * History.Adapter._uid
  28. * The current element unique identifier
  29. */
  30. _uid: 1,
  31. /**
  32. * History.Adapter.uid(element)
  33. * @param {Element} element
  34. * @return {String} uid
  35. */
  36. uid: function(element){
  37. return element._uid || (element._uid = History.Adapter._uid++);
  38. },
  39. /**
  40. * History.Adapter.bind(el,event,callback)
  41. * @param {Element} element
  42. * @param {String} eventName - custom and standard events
  43. * @param {Function} callback
  44. * @return
  45. */
  46. bind: function(element,eventName,callback){
  47. // Prepare
  48. var uid = History.Adapter.uid(element);
  49. // Apply Listener
  50. History.Adapter.handlers[uid] = History.Adapter.handlers[uid] || {};
  51. History.Adapter.handlers[uid][eventName] = History.Adapter.handlers[uid][eventName] || [];
  52. History.Adapter.handlers[uid][eventName].push(callback);
  53. // Bind Global Listener
  54. element['on'+eventName] = (function(element,eventName){
  55. return function(event){
  56. History.Adapter.trigger(element,eventName,event);
  57. };
  58. })(element,eventName);
  59. },
  60. /**
  61. * History.Adapter.trigger(el,event)
  62. * @param {Element} element
  63. * @param {String} eventName - custom and standard events
  64. * @param {Object} event - a object of event data
  65. * @return
  66. */
  67. trigger: function(element,eventName,event){
  68. // Prepare
  69. event = event || {};
  70. var uid = History.Adapter.uid(element),
  71. i,n;
  72. // Apply Listener
  73. History.Adapter.handlers[uid] = History.Adapter.handlers[uid] || {};
  74. History.Adapter.handlers[uid][eventName] = History.Adapter.handlers[uid][eventName] || [];
  75. // Fire Listeners
  76. for ( i=0,n=History.Adapter.handlers[uid][eventName].length; i<n; ++i ) {
  77. History.Adapter.handlers[uid][eventName][i].apply(this,[event]);
  78. }
  79. },
  80. /**
  81. * History.Adapter.extractEventData(key,event,extra)
  82. * @param {String} key - key for the event data to extract
  83. * @param {String} event - custom and standard events
  84. * @return {mixed}
  85. */
  86. extractEventData: function(key,event){
  87. var result = (event && event[key]) || undefined;
  88. return result;
  89. },
  90. /**
  91. * History.Adapter.onDomLoad(callback)
  92. * @param {Function} callback
  93. * @return
  94. */
  95. onDomLoad: function(callback) {
  96. require(["dojo/ready"], function(ready) {
  97. ready(callback);
  98. });
  99. }
  100. };
  101. // Try to Initialise History
  102. if ( typeof History.init !== 'undefined' ) {
  103. History.init();
  104. }
  105. })(window);