11521 sujets

JavaScript, DOM et API Web HTML5

Bonjour à tous !

Je vous expose mon problème

J'ai une page HTML et une autre qui contient le JS
Je souhaite afficher une "alert" si 2 conditions sont réunion à base de "checkboxes" dans un formulaire
Dans mon exemple : si "checkbox h" ET "checkbox j" sont cochées, alors affiche "alert" contenant ce message.
Je précise que je travaille avec Jquery (où il peut parfois y avoir des conflits...)

J'ai essayer de modifier le JS de toute les façons possibles et rien ne fonctionne.
Soit il ne se passe rien
Soit j'ai des erreurs "is null" ou "not defined"
Soit "alert" apparait quand il ne doit pas.

Le code :
(Ici "alert" apparait dès qu'on coche une des cases incriminées alors que les 2 doivent impérativement être cochées...)

HTML


<!DOCTYPE html>
<head>
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" shrink-to-fit="no" />
	<meta name="apple-mobile-web-app-capable" content="yes" />
	<title>FORMUALIRE</title>
	<link rel="icon" type="image/png" href="images/favicon-32x32.png" sizes="32x32" />
	<link rel="apple-touch-icon-precomposed" href="images/logo.png" />
	<link rel="stylesheet" href="http://code.jquery.com/mobile/1.2.1/jquery.mobile-1.2.1.min.css" />
	<link rel="stylesheet" href="css/style.css" />
	<script src="http://code.jquery.com/jquery-1.8.3.min.js"></script>
	<script src="http://code.jquery.com/mobile/1.2.1/jquery.mobile-1.2.1.min.js"></script>
	<script src="fichierjs.js"></script>
</head>
<body>
<div data-role="page" id="formulaire">
		<div data-role="header" data-theme="b">
			<h1>FORMULAIRE</h1>
			<a href="#page" data-icon="home" data-iconpos="notext" data-direction="reverse">Home</a>
		</div>
		<div data-role="content" data-theme="c">
			<div class="content-primary">
				<center>
					<h3>Bienvenue !</h3>
					<p><img src="images/form.jpg" height="30%" width="30%" alt="img formulaire" ></p>
	         		<form method="POST" name="FORM">
						<p><B>Motif d'appel :</B></p>
						<input type="radio" name="vItem1" id="a" onclick="f_formu()" value="0"/><label for="a"> Aucun</label>
						<input type="radio" name="vItem1" id="b" onclick="f_formu()" value="1"/><label for="b"> J'ai soif</label>
						<input type="radio" name="vItem1" id="c" onclick="f_formu()" value="2"/><label for="c"> Je suis malade</label>
						<p><B>Douleurs :</B></p>
						<input type="radio" name="vItem2" id="d" onclick="f_formu()" value="0"/><label for="d"> Aucunes</label>
						<input type="radio" name="vItem2" id="e" onclick="f_formu()" value="2"/><label for="e"> Supportables</label>
						<input type="radio" name="vItem2" id="f" onclick="f_formu()" value="4"/><label for="f"> Insupportables</label>
						<p><label for="vItem3"><B>Facteur aggravants</B></label></p>
						<input type="checkbox" name="vItem3.0" id="g" onclick="f_formu(this.checked)" value="1" /><label for="g"> ATCD</label>
						<input type="checkbox" name="vItem3.2" id="h" onclick="f_formu(this.checked)" value="2" /><label for="h"> Aucun suivi</label>
						<input type="checkbox" name="vItem3.3" id="i" onclick="f_formu(this.checked)" value="4" /><label for="i"> Age supérieur à 60 ans</label>
						<p><label for="vItem4"><B>Facteur favorisants</B></label></p>
						<input type="checkbox" name="vItem4.0" id="j" onclick="f_formu(this.checked)" value="-3" /><label for="j"> Suivi annuel</label>
						<input type="checkbox" name="vItem4.2" id="k" onclick="f_formu(this.checked)" value="-2" /><label for="k"> Age entre 25 et 45 ans</label>
						<input type="reset" value="R.A.Z." name="cmdCancel" />
						<h3><span id="Result" readonly="readonly"></span></h3>
					</form>
        		</center>
			</div>
		</div>
		<footer>
			<div data-role="footer" class="footer-docs" data-theme="c">
				<center><p>Formulaire</p></center>
			</div>
		</footer>
	</div>
</body>


JS


/*script formulaire */
function f_formu() {
    var Res = 0;      // initialisation de la variable qui récupère le résultat
    var Obj = this.document.FORM; // Simplification de l'expression du formulaire
    var Check1 = document.getElementById("h").checked;
    var Check2 = document.getElementById("j").checked;
for (i=1; i<11;i++)      // début de la boucle explorant les objets du formulaire (il y en à 18)
{
if (Obj.elements[i].checked == true) // test des objets 'checkés'
{
Res += parseInt(Obj.elements[i].value);  // on ajoute les valeurs des objets 'checked'
if (Check1 + Check2 == true)
    {
        alert ("Attention Vous ne pouvez pas cocher suivi et non suivi !")
}
}
}
    // Affichage du résultat
    document.getElementById("Result").innerHTML = "Score : " + Res;

Modifié par Gianni54 (30 Jul 2017 - 14:28)
[quote=Gianni54]Bonjour à tous !

Je vous expose mon problème

J'ai une page HTML et une autre qui contient le JS
Je souhaite afficher une "alert" si 2 conditions sont réunion à base de "checkboxes" dans un formulaire
Dans mon exemple : si "checkbox h" ET "checkbox j" sont cochées, alors affiche "alert" contenant ce message.
Je précise que je travaille avec Jquery (où il peut parfois y avoir des conflits...)

J'ai essayer de modifier le JS de toute les façons possibles et rien ne fonctionne.
Soit il ne se passe rien
Soit j'ai des erreurs "is null" ou "not defined"
Soit "alert" apparait quand il ne doit pas.

Le code :
(Ici "alert" apparait dès qu'on coche une des cases incriminées alors que les 2 doivent impérativement être cochées...)

HTML

<!DOCTYPE html>
<head>
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" shrink-to-fit="no" />
	<meta name="apple-mobile-web-app-capable" content="yes" />
	<title>FORMUALIRE</title>
	<link rel="icon" type="image/png" href="images/favicon-32x32.png" sizes="32x32" />
	<link rel="apple-touch-icon-precomposed" href="images/logo.png" />
	<link rel="stylesheet" href="http://code.jquery.com/mobile/1.2.1/jquery.mobile-1.2.1.min.css" />
	<link rel="stylesheet" href="css/style.css" />
	<script src="http://code.jquery.com/jquery-1.8.3.min.js"></script>
	<script src="http://code.jquery.com/mobile/1.2.1/jquery.mobile-1.2.1.min.js"></script>
	<script src="fichierjs.js"></script>
</head>
<body>
<div data-role="page" id="formulaire">
		<div data-role="header" data-theme="b">
			<h1>FORMULAIRE</h1>
			<a href="#page" data-icon="home" data-iconpos="notext" data-direction="reverse">Home</a>
		</div>
		<div data-role="content" data-theme="c">
			<div class="content-primary">
				<center>
					<h3>Bienvenue !</h3>
					<p><img src="images/form.jpg" height="30%" width="30%" alt="img formulaire" ></p>
	         		<form method="POST" name="FORM">
						<p><B>Motif d'appel :</B></p>
						<input type="radio" name="vItem1" id="a" onclick="f_formu()" value="0"/><label for="a"> Aucun</label>
						<input type="radio" name="vItem1" id="b" onclick="f_formu()" value="1"/><label for="b"> J'ai soif</label>
						<input type="radio" name="vItem1" id="c" onclick="f_formu()" value="2"/><label for="c"> Je suis malade</label>
						<p><B>Douleurs :</B></p>
						<input type="radio" name="vItem2" id="d" onclick="f_formu()" value="0"/><label for="d"> Aucunes</label>
						<input type="radio" name="vItem2" id="e" onclick="f_formu()" value="2"/><label for="e"> Supportables</label>
						<input type="radio" name="vItem2" id="f" onclick="f_formu()" value="4"/><label for="f"> Insupportables</label>
						<p><label for="vItem3"><B>Facteur aggravants</B></label></p>
						<input type="checkbox" name="vItem3.0" id="g" onclick="f_formu(this.checked)" value="1" /><label for="g"> ATCD</label>
						<input type="checkbox" name="vItem3.2" id="h" onclick="f_formu(this.checked)" value="2" /><label for="h"> Aucun suivi</label>
						<input type="checkbox" name="vItem3.3" id="i" onclick="f_formu(this.checked)" value="4" /><label for="i"> Age supérieur à 60 ans</label>
						<p><label for="vItem4"><B>Facteur favorisants</B></label></p>
						<input type="checkbox" name="vItem4.0" id="j" onclick="f_formu(this.checked)" value="-3" /><label for="j"> Suivi annuel</label>
						<input type="checkbox" name="vItem4.2" id="k" onclick="f_formu(this.checked)" value="-2" /><label for="k"> Age entre 25 et 45 ans</label>
						<input type="reset" value="R.A.Z." name="cmdCancel" />
						<h3><span id="Result" readonly="readonly"></span></h3>
					</form>
        		</center>
			</div>
		</div>
		<footer>
			<div data-role="footer" class="footer-docs" data-theme="c">
				<center><p>Formulaire</p></center>
			</div>
		</footer>
	</div>
</body>



function f_formu() {
    var Res = 0;      // initialisation de la variable qui récupère le résultat
    var Obj = this.document.FORM; // Simplification de l'expression du formulaire
    var Check1 = document.getElementById("h").checked;
    var Check2 = document.getElementById("j").checked;
for (i=1; i<11;i++)      // début de la boucle explorant les objets du formulaire (il y en à 18)
{
if (Obj.elements[i].checked == true) // test des objets 'checkés'
{
Res += parseInt(Obj.elements[i].value);  // on ajoute les valeurs des objets 'checked'
if (Check1 + Check2 == true)
    {
        alert ("Attention Vous ne pouvez pas cocher suivi et non suivi !")
}
}
}
    // Affichage du résultat
    document.getElementById("Result").innerHTML = "Score : " + Res;
}

Modifié par Gianni54 (30 Jul 2017 - 14:24)
Modérateur
Bonjour,

il ne faut pas faire :
if(Check1 + Check2 == true)

Car tu regarde si la somme des deux est égale à true. Et si je me trompe pas si tu fait une addition entre true et false ca donne 1. Donc le test passe si l'un des deux est coché.
Il faut plutôt les vérifier indépendamment :
if(Check1 === true && Check2 === true)

La le code dit "si Check1 est absoluement égale à true ET EN MEME TEMPS check2 esta bsoluement égale à true aussi.
Merci !
Une des solutions que je n'avais pas testé...
Malheureusement cela retourne mon premier cas => Il ne se passe rien !
Les cases sont cochées et aucune "alert" en vue...

Je pense malheureusement à un conflit avec jquery... A moins qu'il n'y ai une autre solution ?
Bonjour

_laurent a écrit :

Il faut plutôt les vérifier indépendamment :
if(Check1 === true && Check2 === true)

Ce n'est pas que ça change grand chose pour Gianni54 mais c'est quand même plus simple pour vérifier des booléens de faire :
if(Check1 && Check2)


(... S'il s'agit de choses assez simples, vous n'êtes peut-être pas obligé d'utiliser Jquery comme c'est expliqué ici ou … hélas en anglais)
Smiley smile
Modifié par Zelena (31 Jul 2017 - 09:02)
Modérateur
Zelena a écrit :
Ce n'est pas que ça change grand chose pour Gianni54 mais c'est quand même plus simple pour vérifier des booléens de faire :
if(Check1 &amp;&amp; Check2)

Plus simple peut être mais beaucoup moins rigoureux. Avec ton exemple il suffit que la variable ne soit pas vide pour que le test passe... imagine un
var check1 = "false";
de débutant pas encore très assuré Smiley cligne

Pour en revenir à ton soucis Gianni54, à chaque fois qu'on click sur une checkbox ça lance la fonction c'est ça ?

Première étape : est-ce que ta fonction se lance bien de base ? Si tu mets un alert en premier dans ta fonction est-ce qu'il apparaît bien ?

Pourquoi passe-tu "this.checked" en argument dans ta fonction et que tu ne l'utilise pas ?

Et dernier petit détail "Attention Vous ne pouvez pas cocher suivi et non suivi !" pourquoi ne pas utiliser tout simplement un radio bouton ?
_laurent a écrit :

Plus simple peut être mais beaucoup moins rigoureux.

Mais ça a le mérite de fonctionner !
Bizarrement je pensais avoir déjà tester cela (de part sa facilité).
Tout fonctionne correctement à présent allez savoir pourquoi.

_laurent a écrit :

Pour en revenir à ton soucis Gianni54, à chaque fois qu'on click sur une checkbox ça lance la fonction c'est ça ?

Oui à chaque case cochée la fonction se lance direct (onchange - onclick lance la fonction)

_laurent a écrit :

Première étape : est-ce que ta fonction se lance bien de base ? Si tu mets un alert en premier dans ta fonction est-ce qu'il apparaît bien ?

Fonction OK
Alert en premier ne change rien

_laurent a écrit :

Pourquoi passe-tu "this.checked" en argument dans ta fonction et que tu ne l'utilise pas ?

Un reste de code situé plus haut dans ma page que j'ai laissé (par inadvertance) mais qui n'a effectivement pas de fonction ici.

_laurent a écrit :

Et dernier petit détail "Attention Vous ne pouvez pas cocher suivi et non suivi !" pourquoi ne pas utiliser tout simplement un radio bouton ?

On pourrai se laisser tenter par cela effectivement mais dans la vrai page, il y a quelques items en plus qui fais que ce n'est pas 1 OU 0 (radiocheck) mais soit 1 soit 2 soit 3 ou les 3 (checkbox donc)

Merci pour votre participation à tous (1 journée de perdu à me casser la tête pour ça !)
Bon pas de jaloux les 2 fonctionnent !

if(Check1 && Check2)

if(Check1 === true && Check2 === true)


C'est juste que lorsque je remets le tout dans ma page cela ne fonctionne plus !
Alors que ma page de test seule fonctionne...

Je vais remettre les mains dans le cambouis....
Modérateur
hahaha non pas de jaloux on est la pour aider hein et oui les deux fonctionne bien Smiley cligne il y en a juste un plus permissif que l'autre.

Mmmmm... pas d'erreur dans la console ?
Modifié par _laurent (31 Jul 2017 - 11:03)
Maintenant j'ai une erreur dans la console "Obj is undefined"

Sur cette ligne :
if (Obj.elements[i].checked == true) // test des objets 'checkés'


Alors que la variable Obj déclare this.document.FORM contenu dans
<form method="POST" name="FORM">
"this" enlevé mais cela ne change rien même erreur.

var selectForm = document.forms[index];
var selectFormElement = document.forms[index].elements[index];


Comment dois-je appliquer cela dans mon code par exemple ?
Ce qui est marrant (ou à s'arracher les cheveux) c'est quand j'isole la partie du code la dans une page vierge cela fonctionne niquel
Mais il suffit que je remette ce bout de code dans ma page tel quel et j'ai une erreur "Obj is undefined"...
Allez Résolu !

J'ai changé bêtement le nom des "id" dans mon HTML car il ressemblait au reste du code histoire d'éviter les conflits et bingo !
Modifié par Gianni54 (31 Jul 2017 - 12:14)