mirror of
https://github.com/blasten/turn.js.git
synced 2025-05-01 07:16:38 +08:00
165 lines
2.9 KiB
JavaScript
165 lines
2.9 KiB
JavaScript
/**
|
|
* hash.js
|
|
*
|
|
* Copyright (C) 2012 Emmanuel Garcia
|
|
* MIT Licensed
|
|
*
|
|
* ****************************************
|
|
*
|
|
* Hash.pushState(true);
|
|
*
|
|
* Hash.on('/page/([0-9]+)$',
|
|
* {yep: function(path, parts) { }, nop: function() { }},
|
|
* 'Page $1');
|
|
*
|
|
* Hash.go('/page/1');
|
|
**/
|
|
|
|
(function() {
|
|
|
|
'use strict';
|
|
|
|
var hashes = {},
|
|
regexp = {},
|
|
history = [],
|
|
freq = 100,
|
|
num = 0,
|
|
pushState = false,
|
|
timer = null,
|
|
currentUrl = null,
|
|
|
|
freeze = function(obj) {
|
|
if (Object.freeze) return Object.freeze(obj);
|
|
return obj;
|
|
},
|
|
|
|
getHashParts = function() {
|
|
return window.location.href.split('#');
|
|
},
|
|
|
|
startTimer = function() {
|
|
|
|
if (!timer)
|
|
timer = setInterval(function() {
|
|
if (num>0 && currentUrl!=window.location.href) {
|
|
currentUrl = window.location.href;
|
|
window.Hash.check();
|
|
}
|
|
}, freq);
|
|
|
|
},
|
|
|
|
stopTimer = function() {
|
|
|
|
if (timer) {
|
|
clearInterval(timer);
|
|
timer = null;
|
|
}
|
|
|
|
};
|
|
|
|
window.Hash = freeze({
|
|
|
|
pushState: function(yes) {
|
|
|
|
if (window.history && window.history.pushState)
|
|
pushState = yes;
|
|
|
|
return this;
|
|
},
|
|
|
|
fragment: function() {
|
|
|
|
var hash = getHashParts();
|
|
return (pushState) ?
|
|
window.location.pathname + ((hash[1]) ? '#' + hash[1] : '')
|
|
: hash[1] || '';
|
|
|
|
},
|
|
|
|
get: function(path, params) {
|
|
|
|
var p, fragment = '', parameters = [];
|
|
|
|
for(p in params) {
|
|
if (!Object.prototype.hasOwnProperty(p))
|
|
continue;
|
|
parameters.push(encodeURIComponent(p) + '=' + encodeURIComponent(params[p]));
|
|
}
|
|
|
|
if (parameters.length>0)
|
|
parameters = '?' + parameters.join('&');
|
|
|
|
return (pushState) ? path + parameters :
|
|
getHashParts()[0] + '#' + path + parameters;
|
|
|
|
},
|
|
|
|
go: function(hash, params) {
|
|
|
|
if (this.fragment()!=hash) {
|
|
var to = this.get(hash, params);
|
|
|
|
if (pushState)
|
|
window.history.pushState(null, document.title, to);
|
|
else
|
|
window.location.href = to;
|
|
}
|
|
|
|
return this;
|
|
},
|
|
|
|
update: function () {
|
|
|
|
currentUrl = window.location.href;
|
|
return this;
|
|
|
|
},
|
|
|
|
on: function(hash, callback, title) {
|
|
|
|
if (!hashes[hash])
|
|
hashes[hash] = {title: title, listeners: []};
|
|
|
|
hashes[hash].listeners.push(callback);
|
|
num++;
|
|
startTimer();
|
|
|
|
return this;
|
|
},
|
|
|
|
check: function() {
|
|
|
|
var i,
|
|
hash,
|
|
parts,
|
|
fragment = this.fragment();
|
|
|
|
|
|
for (hash in hashes) {
|
|
if (!Object.prototype.hasOwnProperty.call(hashes, hash))
|
|
continue;
|
|
|
|
hashes[hash].regexp = hashes[hash].regexp || new RegExp(hash);
|
|
|
|
if ((parts = hashes[hash].regexp.exec(fragment))) {
|
|
if (hashes[hash].title)
|
|
document.title = hashes[hash].title;
|
|
|
|
for (i = 0; i<hashes[hash].listeners.length; i++)
|
|
if (hashes[hash].listeners[i].yep)
|
|
hashes[hash].listeners[i].yep(fragment, parts);
|
|
} else {
|
|
for (i = 0; i<hashes[hash].listeners.length; i++)
|
|
if (hashes[hash].listeners[i].nop)
|
|
hashes[hash].listeners[i].nop(fragment);
|
|
}
|
|
|
|
}
|
|
|
|
return this;
|
|
}
|
|
});
|
|
|
|
})();
|