Оскільки HTTP не має статусу, кожен раз, коли ви завантажуєте сторінку, він використовуватиме початкові значення того, що ви встановили в JavaScript. Ви не можете встановити глобальну змінну в JS і просто змусити це значення залишатися після завантаження сторінки знову.
Є кілька способів зберегти значення в іншому місці, щоб можна було ініціалізувати його при завантаженні за допомогою JavaScript
Рядок запиту
Під час надсилання форми за допомогою GET
методу URL-адреса оновлюється за допомогою рядка запиту ( ?parameter=value&something=42
). Ви можете використати це, встановивши для поля введення у форму певне значення. Це буде найпростіший приклад:
<form method="GET">
<input type="hidden" name="clicked" value="true" />
<input type="submit" />
</form>
При початковому завантаженні сторінки рядок запиту не встановлюється. Коли ви подаєте цю форму, комбінація вхідних даних name
та value
комбінація вхідних даних передаються у рядок запиту як clicked=true
. Отже, коли сторінка знову завантажується за допомогою цього рядка запиту, ви можете перевірити, чи натиснуто кнопку.
Щоб прочитати ці дані, ви можете використовувати такий сценарій при завантаженні сторінки:
function getParameterByName(name) {
name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
results = regex.exec(location.search);
return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
}
var clicked = getParameterByName('clicked');
( Джерело )
Можливість використовувати це залежить від того, як у даний час працює ваша форма; якщо ви вже використовуєте POST, це може бути проблематично.
Крім того, для більших наборів даних це менше, ніж оптимальне. Передача рядка не є великою проблемою, але для масивів та об’єктів даних вам слід використовувати веб-сховище або файли cookie. Хоча деталі дещо різняться між браузерами, практичне обмеження довжини URI становить близько 2000 символів
Веб-сховище
З введенням HTML5 ми також отримали веб-сховище, яке дозволяє зберігати інформацію в браузері при завантаженні сторінок. Існує localStorage
можливість збереження даних протягом тривалого періоду (якщо користувач не видаляє їх вручну) і sessionStorage
яка зберігає дані лише під час поточного сеансу перегляду. Останнє для вас тут корисно, оскільки ви не хочете, щоб "натиснуто" було встановлено в значення true, коли користувач повернеться пізніше.
Тут я встановив сховище для події натискання кнопки, але ви також можете прив'язати його до форми подання або чогось іншого.
$('input[type="submit"][value="Search"]').click(function() {
sessionStorage.setItem('clicked', 'true');
});
Потім, завантажуючи сторінку, ви можете перевірити, чи встановлена вона, використовуючи це:
var clicked = sessionStorage.getItem('clicked');
Незважаючи на те, що це значення зберігається лише під час цього сеансу перегляду, можливо, ви хочете скинути його раніше. Для цього використовуйте:
sessionStorage.removeItem('clicked');
Якщо ви хочете зберегти об'єкт або масив JS, вам слід перетворити це на рядок. Відповідно до специфікації, має бути можливим збереження інших типів даних, але це ще неправильно реалізовано в браузерах.
localStorage.setItem('myObject', JSON.stringify(myObject));
var myObject = JSON.parse(localStorage.getItem('myObject'));
Підтримка браузера є чудовою, тому ви повинні бути впевнені у використанні цього, якщо вам не потрібно підтримувати справді старі / неясні браузери. Веб-сховище - це майбутнє.
Печиво
Альтернативою веб-сховищу є збереження даних у файлі cookie. Файли cookie в основному створені для зчитування даних на стороні сервера, але можуть використовуватися і для суто клієнтських даних.
Ви вже використовуєте jQuery, що робить налаштування файлів cookie досить простим. Знову ж таки, я використовую click
подію тут, але міг би бути використаний де завгодно.
$('input[type="submit"][value="Search"]').click(function() {
$.cookie('clicked', 'true', {expires: 1});
});
Тоді при завантаженні сторінки ви можете прочитати файл cookie так:
var clicked = $.cookie('clicked');
Оскільки у вашому випадку файли cookie зберігаються протягом сеансів, вам потрібно буде їх зняти, як тільки ви зробите все, що з цим потрібно. Ви не хотіли б, щоб користувач повернувся через день і все ще clicked
встановив значення true.
if(clicked === "true") {
$.cookie('clicked', null);
}
(не-jQuery спосіб встановити / прочитати файли cookie можна знайти тут )
Я особисто не використовував би cookie для чогось такого простого, як запам'ятовування клацаного стану, але якщо рядок запиту не є опцією, і вам потрібно підтримувати справді старі браузери, які не підтримують sessionStorage, це буде працювати. Вам слід спочатку здійснити це за допомогою перевірки sessionStorage, і лише якщо це не вдається, використовуйте метод cookie.
window.name
Хоча це здається мені зламаною, яка, ймовірно, виникла ще до localStorage / sessionStorage, ви можете зберігати інформацію у window.name
властивості:
window.name = "my value"
Він може зберігати лише рядки, тому, якщо ви хочете зберегти об’єкт, вам доведеться його обстежити, як у наведеному вище localStorage
прикладі:
window.name = JSON.stringify({ clicked: true });
Основна відмінність полягає в тому, що ця інформація зберігається не тільки в оновлених сторінках, але й у різних доменах. Однак це обмежено поточною вкладкою, в якій ви перебуваєте.
Це означає, що ви можете зберегти деяку інформацію на своїй сторінці, і поки користувач залишається на цій вкладці, ви можете отримати доступ до тієї самої інформації, навіть якщо він переглядав інший веб-сайт і назад. Загалом, я б радив не використовувати це, якщо вам не потрібно фактично зберігати міждоменну інформацію під час одного сеансу перегляду.