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.