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.

questionAnswers(2)

yourAnswerToTheQuestion