history.adapter.native.js 3.0 KB

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