Bonjour j'ai un input de type numbers dans un formulaire qui est une quantité, j'ai fais deux bouton un + et un - pour augmenter, diminuer la quantité, le problème c'est que dans certains cas l'incrémentation ne seras pas de 1, mais de 2, 5, 15, etc..
???? Dans le JSFiddle ?? Là y'a un gros soucis, moi ça fonctionne nickel !
Tu as des erreurs dans la console?
Non j'ai repris ton code pour le mettre dans le mien et ça ne marche pas, même le +1 qui marchais avant ne marche plus la valeur dans l'input disparaît dans chaque cas.
Dans le JSFiddle ça marche très bien pourtant
- Edité par FaresElWilliams1 26 août 2016 à 10:12:40
Ouais en gros ton erreur te dit que ce n'est pas un nombre. Mais je comprends pas comment ca peut bien fonctionneer dans le fiddle et pas dans ton fichier...
Quand tu ne sais pas, Google reste ton meilleur ami! ;)
Ouais en gros ton erreur te dit que ce n'est pas un nombre. Mais je comprends pas comment ca peut bien fonctionneer dans le fiddle et pas dans ton fichier...
Au delà de ça, il y a plein de problèmes dans ton script.
Il est déconseillé de créer plusieurs événements comme tu le fais. Il vaut mieux que tu gères ta condition dans le gestionnaire d'événement pour ne pas dupliquer de code, ou quand c'est possible, de simplement créer une variable intermédiaire comme je l'ai fait ici pour te passer de condition tout court.
Ne re-sélectionne pas plusieurs fois tes éléments par leur id. Tu l'as fais une fois, sers-toi de ta variable.
Utilise addEventListener quand tu utilises preventDefault. Là tu mélanges les événements DOM 1 et DOM 2. Ce n'est pas standard, ça peut marcher comme ça peut créer des comportements exotiques en fonction de l'implémentation du navigateur.
N'utilise jamais onload. Si tu as un autre script qui utilise cet événement, le dernier va écraser le premier. AddEventListener permet d'avoir plusieurs événements load dans la page et de faire cohabiter plusieurs scripts.
Comme l'a dit bryan, utilise parseInt car un input renvoie une valeur de type texte. Et même si un input type number renvoyait un nombre, tu ne peux pas savoir si le navigateur gère cette balise (qui va se transformer en input text si il ne la gère pas). À noter que la façon correcte d'utiliser parseInt est de préciser la base du nombre à parser (ici on est en base 10).
N'incrémente pas directement la valeur d'un input. On ne peut pas incrémenter un texte, il faut utiliser parseInt et donc passer par une valeur intermédiaire (attention, ça n'a pas été corrigé dans le jsfiddle)
N'utilise pas d'input type number si tu crées tes propres boutons, ou modifie le comportement des boutons de l'input (risqué s'il n'est pas supporté). Là on a deux jeux de boutons, ça fait bizarre.
Quand tu utilises un attribut HTML qui n'existe pas (colisage) utilise la syntaxe data-* (data-colisage, et data-min si tu choisis de faire un input text qui ne supporte pas min)
window.addEventListener("load", function () {
var input = document.getElementById('reassort_scan_quantite');
var plus = document.getElementById('plus');
var moins = document.getElementById('moins');
var colisage = parseInt(input.getAttribute("data-colisage"), 10);
var min = parseInt(input.getAttribute("data-min"), 10);
var step = (min < 2) ? 1 : colisage;
plus.addEventListener("click", function () {
var value = parseInt(input.value, 10);
input.value = value + step;
});
moins.addEventListener("click", function () {
var value = parseInt(input.value, 10);
input.value = (value > min) ? value - step : value;
});
});
Au delà de ça, il y a plein de problèmes dans ton script.
Il est déconseillé de créer plusieurs événements comme tu le fais. Il vaut mieux que tu gères ta condition dans le gestionnaire d'événement pour ne pas dupliquer de code, ou quand c'est possible, de simplement créer une variable intermédiaire comme je l'ai fait ici pour te passer de condition tout court.
Ne re-sélectionne pas plusieurs fois tes éléments par leur id. Tu l'as fais une fois, sers-toi de ta variable.
Utilise addEventListener quand tu utilises preventDefault. Là tu mélanges les événements DOM 1 et DOM 2. Ce n'est pas standard, ça peut marcher comme ça peut créer des comportements exotiques en fonction de l'implémentation du navigateur.
N'utilise jamais onload. Si tu as un autre script qui utilise cet événement, le dernier va écraser le premier. AddEventListener permet d'avoir plusieurs événements load dans la page et de faire cohabiter plusieurs scripts.
Comme l'a dit bryan, utilise parseInt car un input renvoie une valeur de type texte. Et même si un input type number renvoyait un nombre, tu ne peux pas savoir si le navigateur gère cette balise (qui va se transformer en input text si il ne la gère pas). À noter que la façon correcte d'utiliser parseInt est de préciser la base du nombre à parser (ici on est en base 10).
N'incrémente pas directement la valeur d'un input. On ne peut pas incrémenter un texte, il faut utiliser parseInt et donc passer par une valeur intermédiaire (attention, ça n'a pas été corrigé dans le jsfiddle)
N'utilise pas d'input type number si tu crées tes propres boutons, ou modifie le comportement des boutons de l'input (risqué s'il n'est pas supporté). Là on a deux jeux de boutons, ça fait bizarre.
Quand tu utilises un attribut HTML qui n'existe pas (colisage) utilise la syntaxe data-* (data-colisage, et data-min si tu choisis de faire un input text qui ne supporte pas min)
window.addEventListener("load", function () {
var input = document.getElementById('reassort_scan_quantite');
var plus = document.getElementById('plus');
var moins = document.getElementById('moins');
var colisage = parseInt(input.getAttribute("data-colisage"), 10);
var min = parseInt(input.getAttribute("data-min"), 10);
var step = (min < 2) ? 1 : colisage;
plus.addEventListener("click", function () {
var value = parseInt(input.value, 10);
input.value = value + step;
});
moins.addEventListener("click", function () {
var value = parseInt(input.value, 10);
input.value = (value > min) ? value - step : value;
});
});
même erreur :
The specified value "NaN" is not a valid number. The value must match to the following regular expression: -?(\d+|\d+\.\d+|\.\d+)([eE][-+]?\d+)?
j'ai relus mon code et quelque chose m'à interpellé, les valeurs data-colisage et min n'existe pas au chargement de la page, peux-être que ça change quelque chose(certainement ..).
bryan33000 a écrit:
Je peux voir ton code dans le fichier?
Le fichier JS ?
EDIT : j'ai modifier
window.addEventListener("load", function () {
par
$('#plus').click(function ()
et ça marche niquel ^^'
- Edité par FaresElWilliams1 26 août 2016 à 10:59:42
Non, tu utilises un événement qui repousse l'exécution de ton code après le chargement justement pour éviter ça.
Ce que tu viens de faire n'a aucun sens.
Tu n'arriveras à rien en JS si tu copies/colles des trucs et que tu remplaces des bouts de code aveuglément.
-
Bryan veut tout voir, et moi aussi. Ton JS est dépendant de ton HTML. Depuis le début on ne voit qu'un bout de JS, on ne sait pas dans quel environnement il est exécuté.
Non, tu utilises un événement qui repousse l'exécution de ton code après le chargement justement pour éviter ça.
Ce que tu viens de faire n'a aucun sens.
Tu n'arriveras à rien en JS si tu copies/colles des trucs et que tu remplaces des bouts de code aveuglément.
-
Bryan veut tout voir, et moi aussi. Ton JS est dépendant de ton HTML. Depuis le début on ne voit qu'un bout de JS, on ne sait pas dans quel environnement il est exécuté.
- Edité par ConcombreRouge il y a moins de 30s
Mais en fait les valeurs min et colisage n'existe pas au chargement de la page c'est normal que ça ne marche pas ?
On n'étais pas obligé de voir le code côté serveur XD enfin c'est pas grave
Mais là effectivement si tu génères le code en AJAX c'est sûr que l'événement load ne ert à rien. Il faut attribuer tes événements après avoir modifié le DOM, pas avant.
Pense à créer des fonctions. Là tu imbriques des conditions dans des conditions dans des requêtes ajax dans d'autres requêtes ajax dans d'autres conditions... tu as même un $(document).ready à l'intérieur d'un $(document).ready... c'est un peu le bordel, je ne sais pas comment tu peux t'y retrouver. découpe ton code en actions et crée une fonction par action (enfin pour tes prochains projets, sauf si tu es assez maso pour tout réécrire). Là je te conseille de faire une fonction, plusClick et moinsClick par exemple, en dehors de ta requête AJAX, et d'attribuer l'événement dans le succes de la requête ajax. C'est ça qu'il faudrait faire la plupart du temps quand tu as des imbrications de code.
Si non, choisis ton camps, tu mélange du jQuery avec du JS natif, ça n'aide pas à rendre les choses plus claires.
function showHint(str) {
if (str.length == 13) {
$.ajax({
url: 'http://localhost/sf/web/extranet_dev.php/plateforme/reassort_scan/'+str,
method: "POST",
dataType: "json",
success: function(json){
var nom = json.nom;
var prix = json.prix;
var colisage = json.colisage;
var miniCommande = json.minicommande;
document.getElementById("designationModal").innerHTML = nom;
document.getElementById("prixModal").innerHTML = prix;
document.getElementById("colisageModal").innerHTML = colisage;
document.getElementById("reassort_scan_quantite").setAttribute("min", miniCommande);
document.getElementById('reassort_scan_quantite').setAttribute("value", miniCommande);
document.getElementById("reassort_scan_quantite").setAttribute("data-colisage", colisage);
}
});
}
}
$('#plus').click(function () {
var input = document.getElementById('reassort_scan_quantite');
var plus = document.getElementById('plus');
var moins = document.getElementById('moins');
var colisage = parseInt(input.getAttribute("data-colisage"), 10);
var min = parseInt(input.getAttribute("min"), 10);
var step = (min < 2) ? 1 : colisage;
plus.addEventListener("click", function () {
var value = parseInt(input.value, 10);
input.value = value + step;
});
moins.addEventListener("click", function () {
var value = parseInt(input.value, 10);
input.value = (value > min) ? value - step : value;
});
});
$('#moins').click(function () {
var input = document.getElementById('reassort_scan_quantite');
var plus = document.getElementById('plus');
var moins = document.getElementById('moins');
var colisage = parseInt(input.getAttribute("data-colisage"), 10);
var min = parseInt(input.getAttribute("min"), 10);
var step = (min < 2) ? 1 : colisage;
plus.addEventListener("click", function () {
var value = parseInt(input.value, 10);
input.value = value + step;
});
moins.addEventListener("click", function () {
var value = parseInt(input.value, 10);
input.value = (value > min) ? value - step : value;
});
});
déjà plus clair.
le soucis maintenant c'est qu'avec un min de 1 (il devrais augmenter de 1 donc) il fais 5, 13, 27, 43
en gros ça ne marche plus du tout x)
le soucis avec ce code c'est que je n'ai quasiment rien écrit c'est du code écrit la quasi totalité par mon prédécesseur en entreprise et mon boulot n'est pas de le réécrire complètement (et je suis pas dev JS aussi x))
- Edité par FaresElWilliams1 26 août 2016 à 11:54:54
Et pense à commenter ton code aussi, tant pour toi que pour les autres, c'est beaucoup plus compréhensible!
Pour le coup, je plussoie le coup des fonctions, ca permet beaucoup plus de clarté dans ton code et en plus ca te permet aussi de les réutiliser ailleurs sans réécrire ton onclick
Quand tu ne sais pas, Google reste ton meilleur ami! ;)
Et pense à commenter ton code aussi, tant pour toi que pour les autres, c'est beaucoup plus compréhensible!
Pour le coup, je plussoie le coup des fonctions, ca permet beaucoup plus de clarté dans ton code et en plus ca te permet aussi de les réutiliser ailleurs sans réécrire ton onclick
J'ai commencer la documentation de plus de 1000 pages php & symfony j'ai clairement pas pensé au JS (c'est plus de boulot de commenter que de produire du code j'ai l'impression).
Et dis toi que je bosse pour une filiale de la plus grosse compagnie européenne dans notre niche métier et que le code date des année 90-2000 et que je suis quasiment le seul dev
- Edité par FaresElWilliams1 26 août 2016 à 12:08:28
Mais du coup, tu as pas le code généré par le vanigateur plutôt pour le HTML? Parce que du coup impossible de créer un fiddle correct qui reprends bien les inputs et tout (j'ai pas envie de me jouer la vie )
Quand tu ne sais pas, Google reste ton meilleur ami! ;)
Mais du coup, tu as pas le code généré par le vanigateur plutôt pour le HTML? Parce que du coup impossible de créer un fiddle correct qui reprends bien les inputs et tout (j'ai pas envie de me jouer la vie )
Dans ton $("#plus").click tu fais un plus.addEventListener ?
De plus, tu n'as toujours pas attribué tes événements au bon moment. Ton code $("#plus") et $("#moins") est certes exécuté après $.ajax, mais rappelle-toi que $.ajax est asynchrone, donc le code à l'intérieur de ton success est appliqué après.
Aussi, je ne vois pas l'intérêt de récupérer des valeurs dans un attribut si c'est toi qui les a mis dans cet attribut avant. C'est inutile. Tout autant que sélectionner plusieurs fois la même chose.
Je pense que le plus propre vu les circonstances ce serait ça
function reassort_scan_quantite_success(json) {
var colisage = parseInt(json.colisage, 10);
var min = parseInt(miniCommande, 10);
var step = (min < 2) ? 1 : colisage;
$("#designationModal").html(json.nom);
$("#prixModal").html(json.prix);
$("#colisageModal").html(colisage);
var $input = $('#reassort_scan_quantite');
$input.attr({"value": min, "min": min});
$('#plus').click(function () {
var value = parseInt($input.val(), 10);
$input.val(value + step);
});
$('#moins').click(function () {
var value = parseInt($input.val(), 10);
value = (value > min) ? value - step : value;
$input.val(value);
});
}
function showHint(str) {
if (str.length == 13) {
$.ajax({
url: 'http://localhost/sf/web/extranet_dev.php/plateforme/reassort_scan/'+str,
method: "POST",
dataType: "json",
success: reassort_scan_quantite_success
});
}
}
Ici les fonctions plus et moins était trop courtes pour avoir besoin d'être sorties, mais tu peux te dire en gros que dès que tu commences à avoir de fortes indentations c'est qu'il y a un problème.
Dans ton $("#plus").click tu fais un plus.addEventListener ?
De plus, tu n'as toujours pas attribué tes événements au bon moment. Ton code $("#plus") et $("#moins") est certes exécuté après $.ajax, mais rappelle-toi que $.ajax est asynchrone, donc le code à l'intérieur de ton success est appliqué après.
Aussi, je ne vois pas l'intérêt de récupérer des valeurs dans un attribut si c'est toi qui les a mis dans cet attribut avant. C'est inutile. Tout autant que sélectionner plusieurs fois la même chose.
Je pense que le plus propre vu les circonstances ce serait ça
function reassort_scan_quantite_success(json) {
var colisage = parseInt(json.colisage, 10);
var min = parseInt(miniCommande, 10);
var step = (min < 2) ? 1 : colisage;
$("#designationModal").html(json.nom);
$("#prixModal").html(json.prix);
$("#colisageModal").html(colisage);
var $input = $('#reassort_scan_quantite');
$input.attr({"value": min, "min": min});
$('#plus').click(function () {
var value = parseInt($input.val(), 10);
$input.val(value + step);
});
$('#moins').click(function () {
var value = parseInt($input.val(), 10);
value = (value > min) ? value - step : value;
$input.val(value);
});
}
function showHint(str) {
if (str.length == 13) {
$.ajax({
url: 'http://localhost/sf/web/extranet_dev.php/plateforme/reassort_scan/'+str,
method: "POST",
dataType: "json",
success: reassort_scan_quantite_success
});
}
}
Ici les fonctions plus et moins était trop courtes pour avoir besoin d'être sorties, mais tu peux te dire en gros que dès que tu commences à avoir de fortes indentations c'est qu'il y a un problème.
ta réfinition de mon
function showHint(str) {
if (str.length == 13) {
$.ajax({
url: 'http://localhost/sf/web/extranet_dev.php/plateforme/reassort_scan/'+str,
method: "POST",
dataType: "json",
success: function(json){
var nom = json.nom;
var prix = json.prix;
var colisage = json.colisage;
var miniCommande = json.minicommande;
document.getElementById("designationModal").innerHTML = nom;
document.getElementById("prixModal").innerHTML = prix;
document.getElementById("colisageModal").innerHTML = colisage;
document.getElementById("reassort_scan_quantite").setAttribute("min", miniCommande);
document.getElementById('reassort_scan_quantite').setAttribute("value", miniCommande);
document.getElementById("reassort_scan_quantite").setAttribute("data-colisage", colisage);
}
});
}
}
ne le fais plus marcher.
bryan33000 a écrit:
Vu que tu utilises le jQuery je t'ai fait ça en jQuery
Je pense que le problème ne vient pas des morceaux de code que l'on t'a donné mais plutôt du reste de ton code, comme te l'a fait remarque ConcombreRouge (notamment les window.onload etc.. Il va falloir s'armer de patience et reprendre ton code proprement!
Tout ce que j'ai mis sur le fiddle fonctionne très bien à chaque fois..
Tu n'as pas d'erreurs dans la console?
Quand tu ne sais pas, Google reste ton meilleur ami! ;)
Je pense que le problème ne vient pas des morceaux de code que l'on t'a donné mais plutôt du reste de ton code, comme te l'a fait remarque ConcombreRouge (notamment les window.onload etc.. Il va falloir s'armer de patience et reprendre ton code proprement!
Tout ce que j'ai mis sur le fiddle fonctionne très bien à chaque fois..
Tu n'as pas d'erreurs dans la console?
aucune erreur console. je récupère bien jquery dans le head :/, je comprend bien que ça fonctionne sur jsfiddle et que normalement ça devrais marcher chez moi je blâme personne.
la le bouton n'incrémente même pas que se sois 1 par 1 ou 15 par 15.
Quand je mets ton code l'IDE me sort sur
var plus = $('#plus');
var moins = $('#moins');
duplicate jQuery selector
Je sais pas si ça indique quelque chose :/
- Edité par FaresElWilliams1 26 août 2016 à 14:20:46
Signifie que tu as déjà déclaré ces variables ailleurs dans ton sript C'est pas une fatal error qui empêche l'exécution de ton script, mais ca ralentit son exécution.
Pose toi, et reprends tranquillement ton code en essayant de mettre en place les conseils que t'a donné concombreRouge, sur tout ce qui est window.onload, utilisation des fonctions etc..
Pour moi, le plus efficace, serait d'ouvrir un nouveau fichier vierge, tu le fous côte à côte et tu recrées ton fichier tranquillement.
Tu crées tes fonctions une par une, tu récupères les morceaux de code dans ton fichier existant et tu les mets au bon endroit.
Comme ça, tu vas pouvoir t'assurer que tu n'as pas de selecteur dupliqué par exemple. Tu vas aussi pouvoir commenter ton code ce qui te seras grandement utile par la suite.
Je sais, c'est chiant, mais en prenant bien ton temps et en faisant les choses correctement, normalement dans max 1h ton code fonctionne.
Actuellement je travaille sur un projet où je repasse derrière des gens qui ont codé comme des porcs en 2006, et je leur en veux pas mal
C'est la solution que j'applique: new file -> reprenons les bases
Quand tu ne sais pas, Google reste ton meilleur ami! ;)
Signifie que tu as déjà déclaré ces variables ailleurs dans ton sript C'est pas une fatal error qui empêche l'exécution de ton script, mais ca ralentit son exécution.
Pose toi, et reprends tranquillement ton code en essayant de mettre en place les conseils que t'a donné concombreRouge, sur tout ce qui est window.onload, utilisation des fonctions etc..
Pour moi, le plus efficace, serait d'ouvrir un nouveau fichier vierge, tu le fous côte à côte et tu recrées ton fichier tranquillement.
Tu crées tes fonctions une par une, tu récupères les morceaux de code dans ton fichier existant et tu les mets au bon endroit.
Comme ça, tu vas pouvoir t'assurer que tu n'as pas de selecteur dupliqué par exemple. Tu vas aussi pouvoir commenter ton code ce qui te seras grandement utile par la suite.
Je sais, c'est chiant, mais en prenant bien ton temps et en faisant les choses correctement, normalement dans max 1h ton code fonctionne.
Actuellement je travaille sur un projet où je repasse derrière des gens qui ont codé comme des porcs en 2006, et je leur en veux pas mal
C'est la solution que j'applique: new file -> reprenons les bases
Ouais je vais tenté ça merci.
il est forcément duppliqué si tu fais : var plus = $('#plus'); et $('#plus').click(function (e) {
- Edité par FaresElWilliams1 26 août 2016 à 14:45:22
Je suis content de pas être pur dev, je sauterais par la fenêtre Enfin, il y a des aspects chiants dans chaque métier
Désolé d'avoir mal interprété tes réactions Fares. On a beau se dire qu'il ne faut pas avoir d'apriori, c'est comme une illusion d'optique : tu sais que c'est un piège mais tu tombes dedans à chaque fois.
Je suis content de pas être pur dev, je sauterais par la fenêtre Enfin, il y a des aspects chiants dans chaque métier
Désolé d'avoir mal interprété tes réactions Fares. On a beau se dire qu'il ne faut pas avoir d'apriori, c'est comme une illusion d'optique : tu sais que c'est un piège mais tu tombes dedans à chaque fois.
Je sais pas comment tu as intérprété mes réactions, mais il n'y a rien de blessant, je ne fais pas du je "m'enfoutisme", j'essaie de comprendre, je modifie à chaque fois les codes que vous me proposé pour voir si ça marche mieux en modifiant tel ou tel chose, j'essaie juste de faire fonctionner ce foutu truc qui me pête les bonbons depuis deux jours(où chaque essaie et un echec qui suis d'un soupire, ce qui est en train de me faire craqué psychologiquement et moralement) et qui est un truc j'en suis complétement enfantin (j'arrive à le faire marcher en remplissant les valeurs mano sur du htmlpure, d'ailleurs mon JS que j'ai posté tout en haut fonctionne hein c'est pas juste pour rigoler et emmerder les gens que je demande de l'aide) je suis vraiment empêtré dans ma merde et je t'en remerci pleinement d'avoir essayé de m'y aider même si j'ai pas forcément saisi le fond je ton message et que je ne sais pas comment le prendre.
Bonne journée.
- Edité par FaresElWilliams1 26 août 2016 à 15:02:01
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.