History.js для HTML5 - хак не должен сломать IE7

Моя цель - поддерживать историю AJAX только для браузеров HTML5. Однако я хотел бы, чтобы мой сайт работал с браузерами HTML4, но без истории AJAX.

Многие из примеров History.js включают следующую проверку перед выполнением каких-либо операций:

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;
}

Казалось бы, это работает, за исключением того факта, что старые браузеры, такие как IE7, не поддерживают нативный JSON, а плагин History.js требуетJSON.parse а такжеJSON.stringify.

Предлагаемое решение - включить json2.js (ссылка на сайт). Это кажется мне странным, так как браузеры HTML5, которые поддерживаютpushState() а такжеpopState() также должен поддерживать нативный JSON. Кроме того, я не хочу включать еще одну библиотеку, которая мне действительно не нужна. Мое решение состоит в том, чтобы условно включить History.js следующим образом:

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 };
}

Кажется, это работает, но похоже на взлом. Есть лучший способ сделать это?

EDIT: 7/31/2012

Если я не включу history.html4.js, он все равно выдаст мне ошибку в IE7. Похоже, что включение json2.js на данный момент является просто требованием этого плагина. Вероятно, можно было бы сделать усовершенствование, чтобы молча проверить поддержку JSON и отключить плагин, если его нет, но сейчас у меня есть обходной путь. Вот фрагмент из 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;

Если window.JSON не определен, ссылка на window.JSON.stringify просто вызовет ошибку.

Ответы на вопрос(2)

Ваш ответ на вопрос