- (function(){
- /** 1.使用默认配置的缓存:存到localStorage中,缓存 1 小时.
- * $.ajax({
- * wsCache: true
- * })
- *
- * 2.自定义:
- * $.ajax({
- * wsCache: {
- * storageType: 'sessionStorage', //缓存到sessionStorage中
- * cacheKey: 'XXXX-cmd', // 自定义缓存key, 默认规则参考:genCacheKey(options)
- * exp: 10 * 60, // 缓存 10 分钟
- * version: '1.0.0' // 缓存版本号
- * }
- * });
- *
- * Reference:
- * 1.https://github.com/SaneMethod/jquery-ajax-localstorage-cache
- * 2.http://api.jquery.com/jQuery.ajaxPrefilter/
- * 3.http://api.jquery.com/jQuery.ajaxTransport/
- */
- var defaultExpires = 60 * 60; //exp: 60 * 60 expires in 1 hour.
- var defaultStorageType = 'localStorage';
- var wsCacheMap = {
- sessionStorage: new webStorageCache({
- storage: 'sessionStorage'
- }),
- localStorage: new WebStorageCache({
- storage: 'localStorage'
- })
- };
- function genCacheKey(options){
- return options.wsCache.cacheKey || options.url.replace(/jQuery.*/,'') + options.type.toUpperCase() + (options.data || '') + (options.wsCache.version || '1.0.0');
- };
- $.ajaxPrefilter(function(options) {
- if(options.wsCache) {
- var storageType = options.wsCache.storageType ? options.wsCache.storageType : defaultStorageType;
- var wsCache = wsCacheMap[storageType] || wsCacheMap[defaultStorageType];
- if(!wsCache.isSupported()) {
- return;
- }
- try {
- var data = options.data && JSON.parse(options.data);
- var wsCacheOptions = options.wsCache;
- var cacheKey = genCacheKey(options);
- var value = wsCache.get(cacheKey);
- if (!value){
- // If it not in the cache, we store the data, add success callback - normal callback will proceed
- if (options.success) {
- options.realsuccess = options.success;
- }
- options.success = function(data) {
- var exp = defaultExpires;
- if(typeof wsCacheOptions.exp === 'number') {
- exp = wsCacheOptions.exp;
- }
- try {
- // TODO :这里应该加上业务逻辑的判断这个请求是否真正成功的请求。
- wsCache.set(cacheKey, data, {exp: exp});
- } catch(e){
- console.log(e);
- }
- if (options.realsuccess) options.realsuccess(data);
- };
- }
- } catch (e) {
- console.error(e);
- }
- } else {
- return;
- }
- });
- /**
- * This function performs the fetch from cache portion of the functionality needed to cache ajax
- * calls and still fulfill the jqXHR Deferred Promise interface.
- * See also $.ajaxPrefilter
- * @method $.ajaxTransport
- * @params options {Object} Options for the ajax call, modified with ajax standard settings
- */
- $.ajaxTransport("+*", function(options){
- if (options.wsCache) {
- var storageType = options.wsCache.storageType ? options.wsCache.storageType : defaultStorageType;
- var wsCache = wsCacheMap[storageType] || wsCacheMap[defaultStorageType];
- if(!wsCache.isSupported()) {
- return;
- }
- var cacheKey = genCacheKey(options),
- value = wsCache.get(cacheKey);
- if (value){
- console.log('read from localStorage cacahe!!');
- return {
- send: function(headers, completeCallback) {
- var response = {};
- response['json'] = value;
- completeCallback(200, 'success', response, '');
- },
- abort: function() {
- console.log("Aborted ajax transport for json cache.");
- }
- };
- }
- }
- });
- })();
- //该片段来自于http://www.codesnippet.cn/detail/1408201513452.html
来源: http://www.codesnippet.cn/detail/1408201513452.html