J'essaie de capturer le bouton d'envoi de mon formulaire et si le formulaire est soumis, la page s'actualise et j'affiche quelques champs cachés. Je voudrais savoir si le formulaire a déjà été soumis ou non et s'il a été soumis lors du rechargement, je voudrais afficher les champs masqués. J'essayais d'utiliser une variable globale pour y parvenir, mais je n'ai pas pu le faire fonctionner correctement.
Voici ce que j'ai essayé:
var clicked = false;
$(document).ready(function() {
$("input[type='submit'][value='Search']").attr("onclick", "form.act.value='detailSearch'; clicked = true; return true;");
if (clicked == true) {
// show hidden fields
} else {
// don't show hidden fields
}
});
Des suggestions sur ce qui ne va pas avec ce code?
preventDefault
de l'submit
événement (au lieu de celuiclick
que vous utilisez.)Réponses:
Comme HTTP est sans état, chaque fois que vous chargez la page, il utilisera les valeurs initiales de tout ce que vous avez défini dans JavaScript. Vous ne pouvez pas définir une variable globale dans JS et simplement faire en sorte que cette valeur reste après le chargement de la page à nouveau.
Il existe plusieurs façons de stocker la valeur à un autre endroit afin de pouvoir l'initialiser au chargement à l'aide de JavaScript
Chaîne de requête
Lors de la soumission d'un formulaire à l'aide de la
GET
méthode, l'url est mise à jour avec une chaîne de requête (?parameter=value&something=42
). Vous pouvez l'utiliser en définissant un champ de saisie dans le formulaire sur une certaine valeur. Ce serait l'exemple le plus simple:Lors du chargement initial de la page, aucune chaîne de requête n'est définie. Lorsque vous soumettez ce formulaire, la combinaison
name
etvalue
de l'entrée est transmise dans la chaîne de requête sous la formeclicked=true
. Ainsi, lorsque la page se charge à nouveau avec cette chaîne de requête, vous pouvez vérifier si le bouton a été cliqué.Pour lire ces données, vous pouvez utiliser le script suivant lors du chargement de la page:
( Source )
La possibilité d'utiliser cela dépend de la façon dont votre formulaire fonctionne actuellement, si vous utilisez déjà un POST, cela pourrait être problématique.
En outre, pour des ensembles de données plus volumineux, ce n'est pas optimal. Faire passer une chaîne n'est pas un gros problème, mais pour les tableaux et les objets de données, vous devriez probablement utiliser le stockage Web ou des cookies. Bien que les détails diffèrent un peu selon les navigateurs, la limite pratique de la longueur de l'URI est d'environ 2000 caractères
Espace archivage sur le Web
Avec l'introduction de HTML5, nous avons également obtenu le stockage Web, qui vous permet d'enregistrer des informations dans le navigateur à travers les chargements de page. Il existe un système
localStorage
qui peut enregistrer des données pendant une période plus longue (tant que l'utilisateur ne les efface pas manuellement) etsessionStorage
qui enregistre les données uniquement pendant votre session de navigation en cours. Ce dernier est utile pour vous ici, car vous ne voulez pas garder "cliqué" sur true lorsque l'utilisateur revient plus tard.Ici, j'ai défini le stockage sur l'événement de clic sur le bouton, mais vous pouvez également le lier à l'envoi de formulaire ou à toute autre chose.
Ensuite, lorsque vous chargez la page, vous pouvez vérifier si elle est définie en utilisant ceci:
Même si cette valeur n'est enregistrée que pendant cette session de navigation, il est possible que vous souhaitiez la réinitialiser plus tôt. Pour ce faire, utilisez:
Si vous souhaitez enregistrer un objet ou un tableau JS, vous devez le convertir en chaîne. Selon les spécifications, il devrait être possible d'enregistrer d'autres types de données, mais cela n'est pas encore correctement implémenté dans les navigateurs.
La prise en charge des navigateurs est assez bonne , vous devriez donc l'utiliser en toute sécurité, sauf si vous avez besoin de prendre en charge des navigateurs vraiment anciens / obscurs. Le stockage Web est l'avenir.
Biscuits
Une alternative au stockage Web consiste à enregistrer les données dans un cookie. Les cookies sont principalement conçus pour lire les données côté serveur, mais peuvent également être utilisés pour des données purement côté client.
Vous utilisez déjà jQuery, ce qui facilite la configuration des cookies. Encore une fois, j'utilise l'
click
événement ici mais pourrait être utilisé n'importe où.Ensuite, lors du chargement de la page, vous pouvez lire le cookie comme ceci:
Comme les cookies persistent à travers les sessions dans votre cas, vous devrez les désactiver dès que vous avez fait tout ce que vous devez faire avec. Vous ne voudriez pas que l'utilisateur revienne un jour plus tard et qu'il soit toujours
clicked
défini sur true.(un moyen non-jQuery de définir / lire les cookies peut être trouvé ici )
Personnellement, je n'utiliserais pas de cookie pour quelque chose de simple comme se souvenir d'un état cliqué, mais si la chaîne de requête n'est pas une option et que vous devez prendre en charge les navigateurs vraiment anciens qui ne prennent pas en charge sessionStorage, cela fonctionnera. Vous devez implémenter cela avec une vérification de sessionStorage en premier, et seulement si cela échoue, utilisez la méthode des cookies.
window.name
Bien que cela me semble être un hack qui provient probablement d'avant localStorage / sessionStorage, vous pouvez stocker des informations dans la
window.name
propriété:Il ne peut stocker que des chaînes, donc si vous souhaitez enregistrer un objet, vous devrez le stringifier comme dans l'
localStorage
exemple ci-dessus :La principale différence est que ces informations sont conservées non seulement dans les actualisations de page, mais également dans différents domaines. Cependant, il est limité à l'onglet actuel dans lequel vous vous trouvez.
Cela signifie que vous pouvez enregistrer certaines informations sur votre page et tant que l'utilisateur reste dans cet onglet, vous pouvez accéder à ces mêmes informations même s'il a navigué sur un autre site Web et inversement. En général, je déconseille de l'utiliser à moins que vous n'ayez réellement besoin de stocker des informations inter-domaines au cours d'une seule session de navigation.
la source
window.name
). Il peut simplement faire exactement ce dont vous avez besoin sans utiliser les cookies / localStorage.Essayez d'utiliser
$.holdReady()
,history
la source
Utiliser
localeStorage
ousessionStorage
semble être le meilleur pari.Au lieu de sauvegarder la
clicked
variable dans le scope globle, stockez-la de cette façon:la source
Vous pouvez essayer ceci:
la source