私の目標は、HTML5ブラウザーでのみAJAX履歴をサポートすることです。ただし、自分のサイトを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;
}
JSON.parse
これは、IE7などの古いブラウザーがネイティブJSONをサポートしておらず、History.jsプラグインがとを必要とするという事実を除いては機能しているように見えますJSON.stringify
。
推奨される解決策は、json2.js(リンク)を含めることです。ネイティブJSONをサポートpushState()
し、サポートする必要があるHTML5ブラウザーなので、これは私にはちょっと奇妙に思えます。popState()
また、本当に必要のない別のライブラリを含めたくありません。私の解決策は、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 };
}
これはうまくいくようですが、ハックのように感じます。これを行うためのより良い方法はありますか?
編集:2012年7月31日
history.html4.jsを含めない場合でも、IE7でエラーが発生します。json2.jsを含めることは、現時点ではこのプラグインの要件にすぎないようです。JSONサポートをサイレントにチェックし、プラグインがない場合はプラグインを無効にするように改善することもできますが、今のところ回避策があります。これがHistory.jsからの抜粋です:
/**
* History.js Core
* @author Benjamin Arthur Lupton <contact@balupton.com>
* @copyright 2010-2011 Benjamin Arthur Lupton <contact@balupton.com>
* @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を参照すると、単にエラーが発生します。