History.js dla HTML5 - Hack potrzebny do nie złamania IE7

Moim celem jest obsługa historii AJAX tylko dla przeglądarek HTML5. Chciałbym jednak, aby moja witryna działała z przeglądarkami HTML4, ale bez historii AJAX.

Wiele przykładów History.js zawiera następujące sprawdzenie przed wykonaniem jakichkolwiek operacji:

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

Wydaje się, że działa, z wyjątkiem faktu, że starsza przeglądarka, taka jak IE7, nie obsługuje natywnego JSON, a wtyczka History.js wymagaJSON.parse iJSON.stringify.

Sugerowanym rozwiązaniem jest włączenie json2.js (połączyć). Wydaje mi się to dziwne, odkąd przeglądarki HTML5 obsługująpushState() ipopState() powinien również obsługiwać rodzimy JSON. Nie chcę też włączać kolejnej biblioteki, której tak naprawdę nie potrzebuję. Moim rozwiązaniem jest warunkowe dołączenie History.js w następujący sposób:

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

Wydaje się, że to działa, ale czuje się jak włamanie. Czy jest lepszy sposób, aby to zrobić?

EDYTUJ: 31.07.2012

Jeśli nie dołączę history.html4.js, nadal powoduje to błąd w IE7. Wygląda na to, że włączenie json2.js jest w tej chwili wymogiem tej wtyczki. Prawdopodobnie udałoby się poprawić cicho, aby sprawdzić obsługę JSON i wyłączyć wtyczkę, jeśli jej nie ma, ale na razie mam obejście. Oto fragment z 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;

Jeśli window.JSON jest niezdefiniowane, odwołanie do window.JSON.stringify spowoduje po prostu błąd.

questionAnswers(2)

yourAnswerToTheQuestion