11488 sujets

JavaScript, DOM et API Web HTML5

Bonjour à tous
J'ai une fonction de validation d'un formulaire qui a la forme suivante :

function validate() {
    if(...) return false;
    alert('message');
    return true;
}

La fonction alert() affiche le message dans une boîte modale et attend que l'utilisateur ait cliqué sur OK pour poursuivre le traitement.

J'aimerais remplacer la boîte modale système par une boîte modale propriétaire.
Pas de problème pour créer une boîte modale, mais comment faire pour que l'exécution soir suspendue jusqu'à ce que l'utilisateur ait cliqué sur OK ?
Merci de votre aide.
Modifié par PapyJP (11 Aug 2023 - 11:40)
Quand on exécute une fonction de validation d’un formulaire, la fonction est sensée retourner true ou false et si c’est true le contenu du formulaire est envoyé à la page dont l’adresse est donnée dans l’attribut action du formulaire.
Ce que je veux, c’est afficher un message à l’utilisateur avant que l’appel soit exécuté.
Si j.affiche le message par alert() pas de problème, l’action est appelée après que l’utilisateur ait cliqué sur le bouton OK de la boîte d’affichage.
Mais si je veux afficher le message dans une <div> de la page je ne vois pas comment faire pour que l’on attende le clic sur OK pour effectuer l’action.
Modérateur
Bonjour,

dans la série des boites je vois 3 boites qui correspondent au comportement attendu une fois ouvertes et celle qui t’intéresse est probablement la dernière construite sur une balise <dialog>.

https://developer.mozilla.org/fr/docs/Web/API/Window/alert
https://developer.mozilla.org/en-US/docs/Web/API/Window/prompt
https://developer.mozilla.org/fr/docs/Web/HTML/Element/dialog

La dernière permettrais de faire ce que tu souhaites et il n'y a que IE qui serait à la ramasse https://caniuse.com/?search=dialog

Cdt
Merci de ta réponse
En ignorant IE, je pourrais utiliser <dialog>
mais je ne vois pas très bien comment faire.

Voici le véritable environnement dans lequel je veux utiliser ce bidule:

1) j'ai un formulaire d'abonnement à une newsletter.

<form id="subscription" method="post" action="https://newsletter.infomaniak.com/external/submit" 
  class="inf-form" target="_blank" 
  onsubmit="return validateSubscription()">
  <input type="email" name="email" style="display:none">
  <input type="hidden" name="key" value="....">
  <input type="hidden" name="webform_id" value="15002">
  <div>
    <h4>Newsletter Osirisnet</h4>
    <div class="inf-success" style="display:none">
      <h4>You have successfuly subscribed to Osirisnet's newsletter!</h4>
    </div>
    <div class="inf-content">
      <div class="inf-input inf-input-text">
        <label>
          <span>Your email address</span>
          <input id="email" type="email" name="inf[1]" data-inf-meta="1" data-inf-error="Please enter an email address" required="required" placeholder="Your email address">
          <input id="submit" type="submit" name="" value="Subscribe">
        </label>
      </div>
      <div class="inf-rgpd">
      Your email address is used solely to send you our information letter as well as information concerning our activities. You can, at any time, use the unsubscribe link which can be found in all of our emails.</div>
    </div>
  </div>
</form>

C'est du code fourni par mon hébergeur.
Je me suis permis de modifier les textes, de supprimer une balise <style> qui donnait à ce formulaire une apparence qui ne collait pas avec le style du site et d'ajouter un "onsubmit" pour récupérer la main quand l'utilisateur clique sur "Subscribe"
Ce qui donne :
upload/1691844116-48769-formulaire.png

Quand on clique sur "Subscribe" sans exécuter la fonction validateSubscription(), la page qui s'affiche est une demande de CAPTCHA en français, alors que nous avons défini explicitement que la langue de la Newsetter était l'anglais.
upload/1691843144-48769-captcha.png

Le support nous a dit que "c'était comme ça" Smiley confus

J'ai donc ajouté la fonction validateSubscription() où je fais deux choses :
1) vérifier que le contenu est bien une adresse mail correcte (pour le cas où notre utilisateur aurait un navigateur qui ne connait pas <input type="email">)
2) envoyer un message à l'utilisateur non francophone pour le prévenir qu'il va recevoir quelque chose dans une langue qu'il ne comprend pas et ce qu'il doit en faire

function validateSubscription() {
  var email = document.getElementById('email');
  if(!email) return true;
  var address = email.value;
  if(!/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(address)) {
	alert("Please enter a valid email address");
    return false;
  }
  alert('For technical reasons the next page requesting a CAPTCHA is written in French only.\nPlease copy the text to the input field and click "Valider" (Validate)');
  return true;
}


Voici ce que ça donne à l'écran :
upload/1691843180-48769-alert.png

Je pourrais toujours laisser ça comme ça en attendant le jour improbable où l'hébergeur aura fait quelque chose pour supporter autre chose que le français.
Mais je préférerais avoir quelque chose de mieux présenté, d'où ma question "Par quoi remplacer un alert() ?"

Il faut absolument que le script qui afficherait ce message dans une balise quelconque (disons <dialog>) fasse en sorte que le "return true" ne s'exécute que quand l'utilisateur a cliqué quelque part. Sinon c'est la page CAPTCHA en français qui s'affiche et le message n'est visible que ... quand l'utilisateur a fermé la page CAPTCHA.

Est-ce que c'est plus clair ?
Modifié par PapyJP (12 Aug 2023 - 14:49)
Bonsoir,

Tu vas nécessairement devoir le faire différemment.

Tu es obligé de return false dans un premier temps dans ton onsubmit, puis envoyer le formulaire par JavaScript avec submit() lorsque l'utilisateur a validé la boîte de de dialogue (attention à ne pas tomber dans une boucle infinie de dialogues).
Oui, c'est bien ce que je pensais.
Je vais laisser les choses en l'état, c'est urgent et je n'ai pas le temps de me lancer dans une refonte du programme.
Merci à tous pur vos réponses