forked from caiorogerio/HashNav
-
Notifications
You must be signed in to change notification settings - Fork 0
/
hashnav.js
52 lines (45 loc) · 1.57 KB
/
hashnav.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
/*
* Project: HashNav
* Description: Organize function handlers for navigation by location hash
* Author: Caio Rogerio http://github.com/caiorogerio
* Verion: 0.1
*/
(function(){
'use strict';
function HashNav(handlers) {
jQuery(window)
// escuta o evento de alteração de hash
.on('hashchange', function(evt){
// regexp que trata hash da página (tirando # e / no inicio) e quebra em array
var hash = location.hash.replace(/^#\/?/,'').split(/\//),
// variável temporária para armazenar subitens do objeto de handlers
handlersObj = handlers,
depth;
function getArguments(depth) {
var args = hash.slice( depth );
return args.length === 1 && !args[0] ? [] : args;
}
// itera nos subitens do hash
jQuery.each(hash, function(i, name) {
// verifica se o subitem existe no subnível corrente
if( name in handlersObj ) {
// dispara metodo _default caso exista
handlersObj._default && handlersObj._default.call && handlersObj._default.apply( this, getArguments( i ) );
// navega no nível adentro desejado
handlersObj = handlersObj[ name ];
// grava profundidade encontrada em uma váriavel externa
depth = i;
}
// caso o nível seja uma fuñção sai da iteração
if( handlersObj.call ) return false;
});
if( handlersObj._default && handlersObj._default.call ) {
handlersObj._default.apply( this, getArguments( depth + 1 ) );
}
return handlersObj.call && handlersObj.apply( this, getArguments( depth + 1 ) );
});
jQuery(function(){
jQuery(window).trigger('hashchange');
});
}
}