Problème checkbox Javascript ou Ajax, Jquery

Fermé
cedric77200 Messages postés 16 Date d'inscription vendredi 1 juin 2012 Statut Membre Dernière intervention 11 juin 2012 - Modifié par cedric77200 le 1/06/2012 à 14:33
ThEBiShOp Messages postés 8378 Date d'inscription jeudi 22 mars 2007 Statut Contributeur Dernière intervention 8 février 2021 - 27 nov. 2013 à 11:36
Bonjour,

J'espère avoir posté au bon endroit. Si ce n'est pas le cas, je m'en excuse.

J'aimerais faire une checkbox qui met à jour ma base de donné à chaque fois qu'elle change de statut.
Pour faire celà, j'ai fait 2 fichiers : le HTML dans lequel il y a du JS et un fichier PHP.
J'ai fait mon fichier html, mon fichier php avec mes requêtes sql, mais je ne connais pas l'ajax/javascript.

HTML :
<p class="checkbox">
<input id="PlusQuinze" type="checkbox" name="PlusQuinze" value="true" onchange="doOnChange();" checked >
</p>

Mon fichier html ne contient pas de form parce que je le rajoute par rapport à un autre fichier qui le contient (c'est d'ailleurs la raison pour laquelle j'ai besoin que la bdd se mette à jour sans changer de page).

En faisant des tests avec simplement "alert", mon js ne se met pas en route quand je coche ou décoche ma checkbox

Partie JS du fichier HTML :
<script language="JavaScript">
function doOnChange()
{
alert('ok');
}
</script>

Et je cherche aussi le moyen d'actionner mon fichier PHP dans mon JS sans que celui-ci ne charge de page supplémentaires.

Je répète que je ne connais rien en ajax ou jquery et très peu en javascript.

Je vous remercie d'avance.

Cordialement




A voir également:

19 réponses

Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
3 juin 2012 à 11:47
chez moi onclick fonctionne sur Firefox et IE

<script type="text/javascript">
function doOnChange(){

	var xhr_object = null;
	if(window.XMLHttpRequest)
	{ // Firefox
		xhr_object = new XMLHttpRequest();
	}
	else if(window.ActiveXObject)
	{ // Internet Explorer
		xhr_object = new ActiveXObject('Microsoft.XMLHTTP');
	}
	var method = 'POST';
	var filename = 'ton_script.php';
	xhr_object.open(method, filename, true);
	xhr_object.onreadystatechange = function()
	{
	if(xhr_object.readyState == 4)
	{
		if (http_request.status == 200) { 
		var tmp = xhr_object.responseText;
		alert(tmp); //ici tu peux si tu veux mettre une réponse que ton script php va te retourner par une echo (ex:mise à jour BDD ok)
		}
	}
	}
	xhr_object.send(null);
	
}


</script>




<body>
<p class="checkbox">
<input id="PlusQuinze" type="checkbox" name="PlusQuinze" value="true" onclick="doOnChange();" checked >
</p> 
1
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
4 juin 2012 à 13:53
Houps !! copier / coller malheureux de ma part depuis une autre page:

changes:
if(xhr_object.readyState == 4)
{
if (http_request.status == 200) {


if(xhr_object.readyState == 4)
	{
		if (xhr_object.status == 200) {
1
cedric77200 Messages postés 16 Date d'inscription vendredi 1 juin 2012 Statut Membre Dernière intervention 11 juin 2012
1 juin 2012 à 14:35
Pour ceux qui se demandent, j'ai aussi échangé le onchange avec un onclick et ça ne marche pas non plus, le JS ne s'effectue pas.
0
cedric77200 Messages postés 16 Date d'inscription vendredi 1 juin 2012 Statut Membre Dernière intervention 11 juin 2012
Modifié par cedric77200 le 4/06/2012 à 10:57
Je vois que tu as mis une balise <body> avant le input. Celà veux dire que je dois impérativement mettre le script dans le head ?
Parce que je suis sur prestashop, et le head est dans un fichier et je n'ai aucune idée de l'endroit où il se trouve.

Sinon, j'ai un peu regardé l'Ajax et j'ai compris la partie navigateur avec le xhr, mais je ne comprend pas tout pour la suite.

Je dois me planter dans ce qu'il faut écrire pour le ton_script.php.
J'ai mis tout le chemin : [http://localhost/prestashop/modules/plusquinze/plusquinze_page.php ou plusquinze_page.php

ça n'a pas l'air de me réussir.

Du coup, la dernière condition : if (http_request.status == 200) ; ne marche pas.

Merci beaucoup pour ta réponse Alain_42.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
4 juin 2012 à 10:40
Pourquoi 4 pour readystate ?

il faut attendre la réponse à la requette ajax pour triater la réponse

si tu ne mets pas le script js dans le head ce n'est pas grave.
mets le au début de la page si tu peux
0
cedric77200 Messages postés 16 Date d'inscription vendredi 1 juin 2012 Statut Membre Dernière intervention 11 juin 2012
4 juin 2012 à 11:01
Pardon, je modifait mon post précédent entre temps.
J'ai réussi a répondre aux question que je me posait.

Du coup comme je le dis au dessu, j'ai un problème au niveau de ma dernière boucle qui ne s'effectue pas parce que mon script php n'est pas trouvé.
Le request_status n'est ni en 200, ni en 404...

J'ai mis le script au début, mais il ne s'effectue pas. J'ai donc triché et mis le script directe dans le onchange=""
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
4 juin 2012 à 13:24
mon script php n'est pas trouvé.

mets le chemin relatif de ton script php par rapport à la page
ex: plusquinze/plusquinze.php si il est dans un rep plusquinze par rapport à ta page
sinon si dans m^me rep tu mets simplement 'plusquinze.php'

bizarre que ta fonction ne soit pas lancée, dans le onchange ça doit faire un code difficile à lire
0
cedric77200 Messages postés 16 Date d'inscription vendredi 1 juin 2012 Statut Membre Dernière intervention 11 juin 2012
4 juin 2012 à 13:50
Oui c'est pas facile à lire je te l'avoue.

J'ai trouvé le chemin qu'il fallais en débuguant.

L'état est maintenan en 200, mais, il ne m'exécute toujours pas l'echo par rapport à la boucle :
if (http_request.status == 200) ;

Donc là je ne vois vraiment plus ...
0
cedric77200 Messages postés 16 Date d'inscription vendredi 1 juin 2012 Statut Membre Dernière intervention 11 juin 2012
Modifié par cedric77200 le 4/06/2012 à 14:46
Merci !

C'est bon, ça marche !

Je vais essayé de continuer seul.

Merci encore !
0
cedric77200 Messages postés 16 Date d'inscription vendredi 1 juin 2012 Statut Membre Dernière intervention 11 juin 2012
4 juin 2012 à 15:33
En fait mon problème n'est pas totalement résolu car mon fichier php ne s'exécute pas. J'ai beau mettre des tests echo ou alert, rien ne se passe et donc les bdd ne se mettent pas à jour.
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
4 juin 2012 à 16:18
tu peux envoyer une valeur au script en fonction de l'état de la checkbox:
<script type="text/javascript">
function doOnChange(){

	var xhr_object = null;
	if(window.XMLHttpRequest)
	{ // Firefox
		xhr_object = new XMLHttpRequest();
	}
	else if(window.ActiveXObject)
	{ // Internet Explorer
		xhr_object = new ActiveXObject('Microsoft.XMLHTTP');
	}
	var method = 'POST';
	var filename = 'ton_script.php';
	xhr_object.open(method, filename, true);
	xhr_object.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	xhr_object.onreadystatechange = function()
	{
	if(xhr_object.readyState == 4)
	{
		if (xhr_object.status == 200) { 
		var tmp = xhr_object.responseText;
		alert(tmp); //ici tu peux si tu veux mettre une réponse que ton script php va te retourner par une echo (ex:mise à jour BDD ok)
		}
	}
	}
	var case_check=document.getElementById('PlusQuinze');
	if(case_check.checked){ data="valeur_checkbox=1";}else{data="valeur_checkbox=0";}
	xhr_object.send(data);
	
}


</script>




<body>
<p class="checkbox">
<input id="PlusQuinze" type="checkbox" name="PlusQuinze" value="true" onclick="doOnChange();" checked >
</p> 
ton_script.php
<?php
$valeur_checkbox=$_POST['valeur_checkbox'];

//tu fait ton traitement puis
echo "la réponse";

?>
0
cedric77200 Messages postés 16 Date d'inscription vendredi 1 juin 2012 Statut Membre Dernière intervention 11 juin 2012
4 juin 2012 à 16:40
J'ai passé la valeur avec un onchange dans le input, mais là c'est le contenu dans le php qui ne s'effectue pas.
Et même avec des tests, je n'obtient rien.
Je sais que mes bases de donnés sont bonne parce que j'avais testé ce fichier php avant.
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
4 juin 2012 à 18:05
J'ai passé la valeur avec un onchange dans le input,

je ne comprend pas ?

il faut en Ajax passer la valeur par xhr_object.send(data);

si tu veux faire un petit script php de test, sans appel BDD ni rien

ton_script.php
<?php
$valeur_checkbox=$_POST['valeur_checkbox'];

//on renvoie ce qu'on a reçu dans la réponse
echo "le script php a recu: ".$valeur_checkbox;

?>
0
cedric77200 Messages postés 16 Date d'inscription vendredi 1 juin 2012 Statut Membre Dernière intervention 11 juin 2012
Modifié par cedric77200 le 5/06/2012 à 10:52
J'ai mis un onchange en plus du onclick parce que ça marchait avant.
onchange="if(this.checked) this.value='true'; else this.value='false';"

Mais ce n'est pas une bonne idée, il faut que je fasse un test ajax plutôt.
Mais j'ai rajouté "if(this.checked) this.value='true'; else this.value='false';" dans le onclick plutôt. Vu que je sais que ça marche.

Par contre, ton code ne marche pas au niveau du test :
var case_check=document.getElementById('PlusQuinze');
if(case_check.checked){ data="valeur_checkbox=1";}else{data="valeur_checkbox=0";}

Mais mon fichier php, qui n'a pas de test, ne se déclenche toujours pas. je ne sais pas s'il faut rajouter une ligne ajax pour que celui-ci fasse les requêtes.

Et oui j'ai juste testé avec :
<?php
echo "test";
?>

Mais rien ne se passe.

A quoi correspond le : 'application/x-www-form-urlencoded'
à la ligne xhr_object.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); ???
0
cedric77200 Messages postés 16 Date d'inscription vendredi 1 juin 2012 Statut Membre Dernière intervention 11 juin 2012
Modifié par cedric77200 le 5/06/2012 à 17:46
J'avais une erreur de parse dans une requête de mon php, c'est pour ça qu'il ne voulais même pas l'ouvrir.
Maintenan c'est tout bon, j'ai juste ma condition qui ne marche pas dans mon php et qui foire tout.
0
cedric77200 Messages postés 16 Date d'inscription vendredi 1 juin 2012 Statut Membre Dernière intervention 11 juin 2012
8 juin 2012 à 11:27
Pour la condition j'ai remplacé ton :
var case_check=document.getElementById('PlusQuinze');
if(case_check.checked){ data='valeur_checkbox=1';}else{data='valeur_checkbox=0';}
xhr_object.send(data);

par
var case_check=document.getElementById('PlusQuinze');
if(case_check.checked){ data=1;}else{data=0;}
xhr_object.send(data);

ça ne marche pas, la condition marche toujours.
Je l'ai remplacé parce qu'il me mettait une parse error sur le double égale.
0
cedric77200 Messages postés 16 Date d'inscription vendredi 1 juin 2012 Statut Membre Dernière intervention 11 juin 2012
8 juin 2012 à 15:24
Ma condition marche, c'est en fait mon send qui n'envoie pas la valeur au PHP.
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
8 juin 2012 à 21:32
pour que le script php puisse récupérer la valeur passée par
xhr_object.send(data)

il faut que data contienne une definition ex valeur_check_box
data='valeur_checkbox=......

et tu recuperes dans le script php
par $_POST['valeur_checkbox']

pour voir ce qui est envoyé au script php tu peux mettre une alert

alert("data envoyé"+data);
xhr_object.send(data);  
0
cedric77200 Messages postés 16 Date d'inscription vendredi 1 juin 2012 Statut Membre Dernière intervention 11 juin 2012
11 juin 2012 à 10:16
ça marche !
0
cedric77200 Messages postés 16 Date d'inscription vendredi 1 juin 2012 Statut Membre Dernière intervention 11 juin 2012
11 juin 2012 à 15:22
Merci !
0
Antoine Crochet-Damais Messages postés 16 Date d'inscription vendredi 11 mars 2011 Statut Webmaster Dernière intervention 8 janvier 2014 1 240
27 nov. 2013 à 11:30
0
ThEBiShOp Messages postés 8378 Date d'inscription jeudi 22 mars 2007 Statut Contributeur Dernière intervention 8 février 2021 1 566
Modifié par ThEBiShOp le 27/11/2013 à 11:37
1 an après, c'est dommage de remonter un topic pour une réponse à côté (de mon point de vue).

En utilisant le jQuery, je trouverais plus pertinent d'utiliser quelque chose du genre :


$.('#maCheckbox').change(function() {
$.ajax({
url: "page.php"
});
});
0