sessionStorage数据不会保留在另一个或新选项卡中

时间:2017-01-31 23:15:02

标签: javascript session-storage

我正在使用sessionStorage获取一些数据,并能够使用它来创建链接并将其附加到页面。

(function() {

  var rep_info = document.getElementById('rep-info'),
        session = sessionStorage.getItem('ngStorage-getRepInfo'),
        obj = JSON.parse(session),
        vanity_name = obj.profile.data.vanityName,
        your_URL = 'https://foo.com/';

  console.log(obj.profile.data.vanityName);
  rep_info.insertAdjacentHTML('afterbegin', '<a href="' + your_URL + vanity_name + '">foo.com/' + vanity_name + '</a>');

})();

但是,如果我复制并粘贴包含上述脚本的页面的URL,则不会触发。相反,我得到了这个错误。

Uncaught TypeError: Cannot read property 'profile' of null

但是当我刷新时,脚本会激活。

我应该提到这个页面/网站是通过用户身份验证来访问的,即用户名&amp;密码。

我发现了这个solution,但我无法弄清楚如何实现它。

提前致谢!

更新2-1-2017  我包括了我引用的库和我尝试用来解决我的问题,它就在模块之后。

var LocalStoreManager = (function() {
        function LocalStoreManager() {
            var _this = this;
            this.syncKeys = [];
            this.reservedKeys = ['sync_keys', 'addToSyncKeys', 'removeFromSyncKeys',
                'getSessionStorage', 'setSessionStorage', 'addToSessionStorage', 'removeFromSessionStorage', 'clearAllSessionsStorage', 'raiseDBEvent'
            ];
            this.sessionStorageTransferHandler = function(event) {
                if (!event.newValue)
                    return;
                if (event.key == 'getSessionStorage') {
                    if (sessionStorage.length) {
                        localStorage.setItem('setSessionStorage', JSON.stringify(sessionStorage));
                        localStorage.removeItem('setSessionStorage');
                    }
                } else if (event.key == 'setSessionStorage') {
                    if (!_this.syncKeys.length)
                        _this.loadSyncKeys();
                    var data = JSON.parse(event.newValue);
                    for (var key in data) {
                        if (_this.syncKeysContains(key))
                            sessionStorage.setItem(key, data[key]);
                    }
                } else if (event.key == 'addToSessionStorage') {
                    var data = JSON.parse(event.newValue);
                    _this.addToSessionStorageHelper(data["data"], data["key"]);
                } else if (event.key == 'removeFromSessionStorage') {
                    _this.removeFromSessionStorageHelper(event.newValue);
                } else if (event.key == 'clearAllSessionsStorage' && sessionStorage.length) {
                    _this.clearInstanceSessionStorage();
                } else if (event.key == 'addToSyncKeys') {
                    _this.addToSyncKeysHelper(event.newValue);
                } else if (event.key == 'removeFromSyncKeys') {
                    _this.removeFromSyncKeysHelper(event.newValue);
                }
            };
        }
        //Todo: Implement EventListeners for the various event operations and a SessionStorageEvent for specific data keys
        LocalStoreManager.prototype.initialiseStorageSyncListener = function() {
            if (LocalStoreManager.syncListenerInitialised == true)
                return;
            LocalStoreManager.syncListenerInitialised = true;
            window.addEventListener("storage", this.sessionStorageTransferHandler, false);
            this.syncSessionStorage();
        };
        LocalStoreManager.prototype.deinitialiseStorageSyncListener = function() {
            window.removeEventListener("storage", this.sessionStorageTransferHandler, false);
            LocalStoreManager.syncListenerInitialised = false;
        };
        LocalStoreManager.prototype.syncSessionStorage = function() {
            localStorage.setItem('getSessionStorage', '_dummy');
            localStorage.removeItem('getSessionStorage');
        };
        LocalStoreManager.prototype.clearAllStorage = function() {
            this.clearAllSessionsStorage();
            this.clearLocalStorage();
        };
        LocalStoreManager.prototype.clearAllSessionsStorage = function() {
            this.clearInstanceSessionStorage();
            localStorage.removeItem(LocalStoreManager.DBKEY_SYNC_KEYS);
            localStorage.setItem('clearAllSessionsStorage', '_dummy');
            localStorage.removeItem('clearAllSessionsStorage');
        };
        LocalStoreManager.prototype.clearInstanceSessionStorage = function() {
            sessionStorage.clear();
            this.syncKeys = [];
        };
        LocalStoreManager.prototype.clearLocalStorage = function() {
            localStorage.clear();
        };
        LocalStoreManager.prototype.addToSessionStorage = function(data, key) {
            this.addToSessionStorageHelper(data, key);
            this.addToSyncKeysBackup(key);
            localStorage.setItem('addToSessionStorage', JSON.stringify({ key: key, data: data }));
            localStorage.removeItem('addToSessionStorage');
        };
        LocalStoreManager.prototype.addToSessionStorageHelper = function(data, key) {
            this.addToSyncKeysHelper(key);
            sessionStorage.setItem(key, data);
        };
        LocalStoreManager.prototype.removeFromSessionStorage = function(keyToRemove) {
            this.removeFromSessionStorageHelper(keyToRemove);
            this.removeFromSyncKeysBackup(keyToRemove);
            localStorage.setItem('removeFromSessionStorage', keyToRemove);
            localStorage.removeItem('removeFromSessionStorage');
        };
        LocalStoreManager.prototype.removeFromSessionStorageHelper = function(keyToRemove) {
            sessionStorage.removeItem(keyToRemove);
            this.removeFromSyncKeysHelper(keyToRemove);
        };
        LocalStoreManager.prototype.testForInvalidKeys = function(key) {
            if (!key)
                throw new Error("key cannot be empty");
            if (this.reservedKeys.some(function(x) {
                    return x == key;
                }))
                throw new Error("The storage key \"" + key + "\" is reserved and cannot be used. Please use a different key");
        };
        LocalStoreManager.prototype.syncKeysContains = function(key) {
            return this.syncKeys.some(function(x) {
                return x == key;
            });
        };
        LocalStoreManager.prototype.loadSyncKeys = function() {
            if (this.syncKeys.length)
                return;
            this.syncKeys = this.getSyncKeysFromStorage();
        };
        LocalStoreManager.prototype.getSyncKeysFromStorage = function(defaultValue) {
            if (defaultValue === void 0) { defaultValue = []; }
            var data = localStorage.getItem(LocalStoreManager.DBKEY_SYNC_KEYS);
            if (data == null)
                return defaultValue;
            else
                return JSON.parse(data);
        };
        LocalStoreManager.prototype.addToSyncKeys = function(key) {
            this.addToSyncKeysHelper(key);
            this.addToSyncKeysBackup(key);
            localStorage.setItem('addToSyncKeys', key);
            localStorage.removeItem('addToSyncKeys');
        };
        LocalStoreManager.prototype.addToSyncKeysBackup = function(key) {
            var storedSyncKeys = this.getSyncKeysFromStorage();
            if (!storedSyncKeys.some(function(x) {
                    return x == key;
                })) {
                storedSyncKeys.push(key);
                localStorage.setItem(LocalStoreManager.DBKEY_SYNC_KEYS, JSON.stringify(storedSyncKeys));
            }
        };
        LocalStoreManager.prototype.removeFromSyncKeysBackup = function(key) {
            var storedSyncKeys = this.getSyncKeysFromStorage();
            var index = storedSyncKeys.indexOf(key);
            if (index > -1) {
                storedSyncKeys.splice(index, 1);
                localStorage.setItem(LocalStoreManager.DBKEY_SYNC_KEYS, JSON.stringify(storedSyncKeys));
            }
        };
        LocalStoreManager.prototype.addToSyncKeysHelper = function(key) {
            if (!this.syncKeysContains(key))
                this.syncKeys.push(key);
        };
        LocalStoreManager.prototype.removeFromSyncKeys = function(key) {
            this.removeFromSyncKeysHelper(key);
            this.removeFromSyncKeysBackup(key);
            localStorage.setItem('removeFromSyncKeys', key);
            localStorage.removeItem('removeFromSyncKeys');
        };
        LocalStoreManager.prototype.removeFromSyncKeysHelper = function(key) {
            var index = this.syncKeys.indexOf(key);
            if (index > -1) {
                this.syncKeys.splice(index, 1);
            }
        };
        LocalStoreManager.prototype.saveSessionData = function(data, key) {
            if (key === void 0) { key = LocalStoreManager.DBKEY_USER_DATA; }
            this.testForInvalidKeys(key);
            this.removeFromSyncKeys(key);
            localStorage.removeItem(key);
            sessionStorage.setItem(key, data);
        };
        LocalStoreManager.prototype.saveSyncedSessionData = function(data, key) {
            if (key === void 0) { key = LocalStoreManager.DBKEY_USER_DATA; }
            this.testForInvalidKeys(key);
            localStorage.removeItem(key);
            this.addToSessionStorage(data, key);
        };
        LocalStoreManager.prototype.savePermanentData = function(data, key) {
            if (key === void 0) { key = LocalStoreManager.DBKEY_USER_DATA; }
            this.testForInvalidKeys(key);
            this.removeFromSessionStorage(key);
            localStorage.setItem(key, data);
        };
        LocalStoreManager.prototype.moveDataToSessionStorage = function(key) {
            if (key === void 0) { key = LocalStoreManager.DBKEY_USER_DATA; }
            this.testForInvalidKeys(key);
            var data = this.getData(key);
            if (data == null)
                return;
            this.saveSessionData(data, key);
        };
        LocalStoreManager.prototype.moveDataToSyncedSessionStorage = function(key) {
            if (key === void 0) { key = LocalStoreManager.DBKEY_USER_DATA; }
            this.testForInvalidKeys(key);
            var data = this.getData(key);
            if (data == null)
                return;
            this.saveSyncedSessionData(data, key);
        };
        LocalStoreManager.prototype.moveDataToPermanentStorage = function(key) {
            if (key === void 0) { key = LocalStoreManager.DBKEY_USER_DATA; }
            this.testForInvalidKeys(key);
            var data = this.getData(key);
            if (data == null)
                return;
            this.savePermanentData(data, key);
        };
        LocalStoreManager.prototype.getData = function(key) {
            if (key === void 0) { key = LocalStoreManager.DBKEY_USER_DATA; }
            this.testForInvalidKeys(key);
            var data = sessionStorage.getItem(key);
            if (data == null)
                data = localStorage.getItem(key);
            return data;
        };
        LocalStoreManager.prototype.getDataObject = function(key) {
            if (key === void 0) { key = LocalStoreManager.DBKEY_USER_DATA; }
            var data = this.getData(key);
            if (data != null)
                return JSON.parse(data);
            else
                return null;
        };
        LocalStoreManager.prototype.deleteData = function(key) {
            if (key === void 0) { key = LocalStoreManager.DBKEY_USER_DATA; }
            this.testForInvalidKeys(key);
            this.removeFromSessionStorage(key);
            localStorage.removeItem(key);
        };
        return LocalStoreManager;
    })();
 (function() {

    var localStorageMangerInstance = new LocalStoreManager();
    localStorageMangerInstance.initialiseStorageSyncListener();
    var data = localStorageMangerInstance.getData('ngStorage-getRepInfo'),
        obj = JSON.parse(data),
        vanity_name = obj.profile.data.vanityName;

    localStorageMangerInstance.saveSyncedSessionData(obj, obj.profile.data.vanityName);


    var rep_info = document.getElementById('rep-info'),
        your_avon_URL = 'https://youravon.com/';


    rep_info.insertAdjacentHTML('afterbegin', '<a href="' + your_avon_URL + vanity_name + '">youravon.com/' + vanity_name + '</a>');

    console.log(vanity_name);
    console.log(obj.profile.data.vanityName);
})();

0 个答案:

没有答案