Мой случай: localStorage с ключом + значением, которое должно быть удалено, когда браузер закрыт, а не одна вкладка.
Посмотрите мой код, если он правильный и что можно улучшить:
//create localStorage key + value if not exist
if(localStorage){
localStorage.myPageDataArr={"name"=>"Dan","lastname"=>"Bonny"};
}
//when browser closed - psedocode
$(window).unload(function(){
localStorage.myPageDataArr=undefined;
});
undefined
перезапишет ранее сохраненный элемент. Но да, использование.removeItem()
более уместно.localStorage.clear();
если вы хотите очистить все хранилище.Ответы:
должно быть сделано так, а не с оператором удаления:
источник
delete localStorage.key
работает так же хорошо, как иlocalStorage.removeItem(key)
. Мне кажется более понятным использовать delete, когда я устанавливаю свои переменные как,localStorage.key = 1
а неlocalStorage.setItem('key', 1)
.localStorage.removeItem = null;
, создаваяlocalStorage.removeItem(key);
потенциально плохую идею.localStorage.key = 1
во-первых, чтобы избежать несчастных случаев такого родаИспользовать с
window
глобальным ключевым словом: -источник
localStorage.removeItem(key)
отлично работаетВы можете использовать
beforeunload
событие в JavaScript.Используя ванильный JavaScript, вы можете сделать что-то вроде:
Это удалит ключ до закрытия окна / вкладки браузера и предложит вам подтвердить действие закрытия окна / вкладки. Я надеюсь, что это решит вашу проблему.
ПРИМЕЧАНИЕ.
onbeforeunload
Метод должен возвращать строку.источник
Вместо этого вы должны использовать sessionStorage, если вы хотите, чтобы ключ был удален при закрытии браузера.
источник
sessionStorage
является средством от того, что описывает спрашивающий.sessionStorage
, но черновик редактора W3C гласит: «Время существования контекста просмотра может быть не связано со временем жизни самого процесса пользовательского агента, поскольку пользовательский агент может поддерживать возобновление сеансов после перезапуска».Попробуйте использовать
Надеюсь, что это работает для вас
источник
localStorage.clear();
Существует очень специфический вариант использования, в котором любое предложение использовать sessionStorage вместо localStorage действительно не помогает. Вариант использования будет таким же простым, как сохранение чего-либо, пока у вас есть хотя бы одна открытая вкладка, но аннулируйте его, если закроете последнюю оставшуюся вкладку. Если вам нужно сохранить свои значения в кросс-таблице и окне, sessionStorage не поможет вам, если вы не усложните свою жизнь со слушателями, как я пытался. В то же время localStorage идеально подходит для этого, но он выполняет свою работу «слишком хорошо», так как ваши данные будут ждать там даже после перезапуска браузера. В итоге я использовал собственный код и логику, которые используют оба преимущества.
Я лучше объясню, потом дам код. Сначала сохраните то, что вам нужно, в localStorage, затем также в localStorage создайте счетчик, который будет содержать количество открытых вами вкладок. Это будет увеличиваться при каждой загрузке страницы и уменьшаться при каждой ее загрузке. Вы можете выбрать здесь, какие события использовать, я бы предложил «загрузить» и «выгрузить». В то время, когда вы выгружаете, вам нужно выполнять задачи очистки, которые вы хотели бы выполнять, когда счетчик достигает 0, то есть вы закрываете последнюю вкладку. Здесь возникает сложная часть: я не нашел надежного и универсального способа определить разницу между перезагрузкой страницы или навигацией внутри страницы и закрытием вкладки. Поэтому, если данные, которые вы храните, не могут быть перестроены при загрузке после проверки того, что это ваша первая вкладка, тогда вы не можете удалить его при каждом обновлении. Вместо этого вам нужно хранить флаг в sessionStorage при каждой загрузке, прежде чем увеличивать счетчик вкладок. Перед сохранением этого значения вы можете проверить, есть ли у него значение, а если нет, это означает, что вы загружаетесь в этот сеанс впервые, то есть вы можете выполнить очистку при загрузке, если это значение не установлено, а счетчик равен 0.
источник
использовать sessionStorage
Объект sessionStorage равен объекту localStorage, за исключением того, что он хранит данные только для одного сеанса. Данные удаляются, когда пользователь закрывает окно браузера.
В следующем примере показано, сколько раз пользователь нажимал кнопку в текущем сеансе:
пример
источник
источник
источник
Хотя некоторые пользователи уже ответили на этот вопрос, я привожу пример настроек приложения для решения этой проблемы.
Я была такая же проблема. Я использую https://github.com/grevory/angular-local-storage модуль в моем приложении angularjs. Если вы настроите свое приложение следующим образом, оно сохранит переменную в хранилище сеансов вместо локального хранилища. Поэтому, если вы закроете браузер или закроете вкладку, хранилище сеанса будет автоматически удалено. Вам не нужно ничего делать.
Надеюсь, это поможет.
источник
Есть пять методов на выбор:
Вы можете использовать clear (), этот метод при вызове очищает все хранилище всех записей для этого домена. Он не получает никаких параметров.
источник
Вот простой тест, чтобы увидеть, есть ли у вас поддержка браузера при работе с локальным хранилищем:
Это сработало для меня, как и ожидалось (я использую Google Chrome). Адаптировано с: http://www.w3schools.com/html/html5_webstorage.asp .
источник
Я не думаю, что представленное здесь решение на 100% правильно, потому что событие window.onbeforeunload вызывается не только тогда, когда браузер / вкладка закрыта (что требуется), но и для всех остальных нескольких событий. (КОТОРОЕ НЕ ТРЕБУЕТСЯ)
Смотрите эту ссылку для получения дополнительной информации о списке событий, которые могут вызвать window.onbeforeunload: -
http://msdn.microsoft.com/en-us/library/ms536907(VS.85).aspx
источник
почему не используется sessionStorage?
«Объект sessionStorage равен объекту localStorage, за исключением того, что он хранит данные только для одного сеанса. Данные удаляются, когда пользователь закрывает окно браузера».
http://www.w3schools.com/html/html5_webstorage.asp
источник
Посмотрев на этот вопрос через 6 лет после того, как он был задан, я обнаружил, что до сих пор нет достаточного ответа на этот вопрос; который должен достичь всего следующего:
Выполните этот фрагмент javascript в начале каждой загрузки страницы, чтобы достичь вышеуказанного:
Изменить: Основная идея здесь заключается в следующем:
tabid
tabs
содержащим объект, для которого ключtabid
имеет значение 1.tabs
обновляется до объекта, содержащегоtabid
значение 0.tabid
существует, и поэтомуtabs
ключ локального хранилища с вложенным ключомtabid
локального хранилища не очищается.tabid
больше не существует, иtabid
будет сгенерировано новое . Поскольку локальное хранилище не имеет ни подключаtabid
ни этого , ни какого-либо другогоtabid
(все сеансы были закрыты), оно очищается.tabid
в хранилище сеанса генерируется новое , но поскольку существует хотя бы одинtabs
[tabid
], локальное хранилище не очищаетсяисточник
window.onbeforeunload
не будет вызвано иtabs[tabid]
локальное хранилище не будет установлено равным 0 =>, локальное хранилище больше никогда не будет очищено. Я думаю, что сторожевой таймер был бы более уместным в этом случае, вместо записи 1 при загрузке вкладки, вы должны написать текущую метку времени. Затем в части сокращения вы должны установить задержку, поскольку эта временная метка не слишком велика, или заменить ее на 0, если она есть. Таким образом, вы не зависите от фактического вызоваonbeforeunload
. Вкладке просто необходимо время от времени переустанавливать сторожевой таймер для поддержания существования локального хранилища.Вы можете просто использовать sessionStorage. Потому что sessionStorage позволяет очистить все значения ключа, когда окно браузера будет закрыто.
Смотрите там: SessionStorage - MDN
источник
Это старый вопрос, но, похоже, ни один из приведенных выше ответов не идеален.
В случае, если вы хотите сохранить аутентификацию или любую конфиденциальную информацию, которая уничтожается только при закрытом браузере, вы можете положиться
sessionStorage
иlocalStorage
для закладок креста передачи сообщений.По сути, идея заключается в следующем:
localStorage
иsessionStorage
пустая (если нет, вы можете очиститьlocalStorage
). Вам нужно будет зарегистрировать прослушиватель сообщений наlocalStorage
.sessionStorage
чтобы сохранить конфиденциальную информацию, и используете ееlocalStorage
для хранения этой информации, а затем удаляете ее (здесь вам не нужно время, так как событие было поставлено в очередь при изменении данных). Любая другая вкладка, открытая в это время, будет отозвана по событию сообщения и обновит ихsessionStorage
конфиденциальной информацией.sessionStorage
будет пустой. Код должен будет установить ключ вlocalStorage
(например:)req
. Любая (все) другая вкладка будет вызвана обратно в событии сообщения, увидит этот ключ и может ответить секретной информацией из своихsessionStorage
(как в 3), если они есть.Обратите внимание, что эта схема не зависит от
window.onbeforeunload
события, которое является хрупким (так как браузер может быть закрыт / сбой без запуска этих событий). Кроме того, время, когда конфиденциальная информация хранится наlocalStorage
очень мало (поскольку вы полагаетесь на обнаружение изменения переходных процессов при событии сообщения с перекрестными табуляциями), поэтому маловероятно, что такая конфиденциальная информация попадет на жесткий диск пользователя.Вот демонстрация этой концепции: http://jsfiddle.net/oypdwxz7/2/
источник
Нет такого способа определения закрытия браузера, поэтому, вероятно, вы не можете удалить localStorage при закрытии браузера, но есть другой способ обработки вещей, которые вы можете использовать с помощью sessionCookies, так как он уничтожит после закрытия браузера. Это я реализовал в своем проекте.
источник
Вы можете попробовать следующий код для удаления локального хранилища:
источник
localStorage.removeItem(key);
чтобы удалить ключ.delete
? Я пытался, и это работает. Есть ли побочный эффект или что-то, что мы не должны использовать delete? Спасибо.delete
- не лучшая практикаlocalStorage