79 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
| /**
 | |
|  * jQuery history event v0.1
 | |
|  * Copyright (c) 2008 Tom Rodenberg <tarodenberg gmail com>
 | |
|  * Licensed under the GPL (http://www.gnu.org/licenses/gpl.html) license.
 | |
|  */
 | |
| (function($) {
 | |
|     var currentHash, previousNav, timer, hashTrim = /^.*#/;
 | |
| 
 | |
|     var msie = {
 | |
|         iframe: null,
 | |
|         getDoc: function() {
 | |
|             return msie.iframe.contentWindow.document;
 | |
|         },
 | |
|         getHash: function() {
 | |
|             return msie.getDoc().location.hash;
 | |
|         },
 | |
|         setHash: function(hash) {
 | |
|             var d = msie.getDoc();
 | |
|             d.open();
 | |
|             d.close();
 | |
|             d.location.hash = hash;
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     var historycheck = function() {
 | |
|         var hash = msie.iframe ? msie.getHash() : location.hash;
 | |
|         if (hash != currentHash) {
 | |
|             currentHash = hash;
 | |
|             if (msie.iframe) {
 | |
|                 location.hash = currentHash;
 | |
|             }
 | |
|             var current = $.history.getCurrent();
 | |
|             $.event.trigger('history', [current, previousNav]);
 | |
|             previousNav = current;
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     $.history = {
 | |
|         add: function(hash) {
 | |
|             hash = '#' + hash.replace(hashTrim, '');
 | |
|             if (currentHash != hash) {
 | |
|                 var previous = $.history.getCurrent();
 | |
|                 location.hash = currentHash = hash;
 | |
|                 if (msie.iframe) {
 | |
|                     msie.setHash(currentHash);
 | |
|                 }
 | |
|                 $.event.trigger('historyadd', [$.history.getCurrent(), previous]);
 | |
|             }
 | |
|             if (!timer) {
 | |
|                 timer = setInterval(historycheck, 100);
 | |
|             }
 | |
|         },
 | |
|         getCurrent: function() {
 | |
|             if (currentHash) {
 | |
|               return currentHash.replace(hashTrim, '');
 | |
|             } else { 
 | |
|               return ""; 
 | |
|             }
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     $.fn.history = function(fn) {
 | |
|         $(this).bind('history', fn);
 | |
|     };
 | |
| 
 | |
|     $.fn.historyadd = function(fn) {
 | |
|         $(this).bind('historyadd', fn);
 | |
|     };
 | |
| 
 | |
|     $(function() {
 | |
|         currentHash = location.hash;
 | |
|         if ($.browser.msie) {
 | |
|             msie.iframe = $('<iframe style="display:none" src="javascript:false;"></iframe>').prependTo('body')[0];
 | |
|             msie.setHash(currentHash);
 | |
|             currentHash = msie.getHash();
 | |
|         }
 | |
|     });
 | |
| })(jQuery);
 |