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 просто вызовет ошибку.