History.js para HTML5 - Hack necessário para não quebrar o IE7
Meu objetivo é oferecer suporte ao histórico do AJAX apenas para navegadores HTML5. No entanto, gostaria que meu site funcionasse com navegadores HTML4, mas sem histórico do AJAX.
Muitos dos exemplos do History.js incluem a seguinte verificação antes de executar qualquer operação:
if (!History.enabled) {
// History.js is disabled for this browser.
// This is because we can optionally choose to support HTML4 browsers or not.
return false;
}
Isso parece funcionar, exceto pelo fato de que navegadores mais antigos, como o IE7, não suportam JSON nativo e o plugin History.js requerJSON.parse
eJSON.stringify
.
A solução sugerida é incluir json2.js (ligação). Isso parece meio estranho para mim desde os navegadores HTML5 que suportampushState()
epopState()
também deve suportar JSON nativo. Além disso, eu não quero incluir ainda outra biblioteca que eu realmente não preciso. Minha solução é incluir condicionalmente o History.js da seguinte maneira:
var nativeJSON = (typeof JSON === 'object') && (typeof JSON.parse === 'function') && (typeof JSON.stringify === 'function');
if (nativeJSON) {
/// Include contents of: balupton-history.js-e84ad00\scripts\bundled\html5\jquery.history.js
} else {
window.History = { enabled: false };
}
Isso parece funcionar, mas parece um hack. Existe uma maneira melhor de fazer isso?
EDIT: 31/07/2012
Se eu não incluir o history.html4.js, ele ainda me causará um erro no IE7. Parece que incluir o json2.js é simplesmente um requisito deste plugin no momento. É provável que uma melhoria seja feita para verificar silenciosamente o suporte a JSON e desabilitar o plug-in, se não houver nenhum, mas, por enquanto, tenho uma solução alternativa. Aqui está um snippit do History.js:
/**
* History.js Core
* @author Benjamin Arthur Lupton <[email protected]>
* @copyright 2010-2011 Benjamin Arthur Lupton <[email protected]>
* @license New BSD License <http://creativecommons.org/licenses/BSD/>
*/
(function(window,undefined){
"use strict";
// ========================================================================
// Initialise
// Localise Globals
var
console = window.console||undefined, // Prevent a JSLint complain
document = window.document, // Make sure we are using the correct document
navigator = window.navigator, // Make sure we are using the correct navigator
sessionStorage = window.sessionStorage||false, // sessionStorage
setTimeout = window.setTimeout,
clearTimeout = window.clearTimeout,
setInterval = window.setInterval,
clearInterval = window.clearInterval,
JSON = window.JSON,
alert = window.alert,
History = window.History = window.History||{}, // Public History Object
history = window.history; // Old History Object
// MooTools Compatibility
JSON.stringify = JSON.stringify||JSON.encode;
JSON.parse = JSON.parse||JSON.decode;
Se window.JSON for indefinido, referencing window.JSON.stringify irá simplesmente causar um erro.