J'ai une page de liste de produits où tous les produits répertoriés ont un nom et un identifiant de forme différents en utilisant la boucle while comme mentionné dans le morceau de code ci-dessous. Je veux faire en sorte que lorsque l'utilisateur clique sur le bouton "Ajouter" pour un produit particulier, le formulaire de ce produit spécifique doit être soumis en utilisant AJAX / jQuery.
product_listing.php
var id = '';
$(function() {
$("form").submit(function() {
var form = $(this);
var id = form.attr('id');
//alert(id + ' form submitted');
$("#"+id+" input, #"+id+" select").jqBootstrapValidation({
//alert(id + ' form submitted'); // Can't alert ID here
submitSuccess: function($form, event) {
event.preventDefault(); // prevent default submit behaviour
var hdn_prodpkid = $("input#hdn_prodpkid").val();
$.ajax({
url: "./product_addtocart_p.php",
type: "POST",
data: {
hdn_prodpkid: hdn_prodpkid
},
cache: false,
}) // End of Ajax
}, // End of submitSuccess
}); // End of jqBootstrapValidation
}); // End of form submit
}); // End of $(function())
Je veux l'ID du formulaire soumis afin de pouvoir récupérer les valeurs des champs de saisie pour ce formulaire soumis. Mais à chaque soumission de formulaire, j'ai reçu l'ID du dernier formulaire.
Alors, comment puis-je obtenir l'ID de formulaire unique (uniquement soumis) sur la page JS? S'il vous plaît aviser.
Le code ci-dessous fonctionne parfaitement lorsqu'il n'y a qu'un seul formulaire à soumettre. Dans ce cas, l'identifiant du formulaire est prédéfini sur les pages .php et .js.
product_listing.js
$(function() {
$("#"+NEED_SUBMITTED_FORM_ID_HERE+" input, #"+NEED_SUBMITTED_FORM_ID_HERE+" select").jqBootstrapValidation({
preventSubmit: true,
submitError: function($form, event, errors) {
...other code...
},
submitSuccess: function($form, event) {
event.preventDefault();
var hdn_prodpkid = $("input#hdn_prodpkid").val();
... other variables...
$.ajax({
url: "./product_addtocart_p.php",
type: "POST",
data: {
hdn_prodpkid: hdn_prodpkid,
... other variables...
},
cache: false,
success: function(data)
{
...other code...
}
}
});
});
- - CODE MIS À JOUR -
product_listing.js
<script language="JavaScript" src="./product_listing.js"></script>
while loop to list products on page {
<form id="frm_add<?php print $rs_list->Fields("pkid"); ?>" name="frm_add<?php print $rs_list->Fields("pkid"); ?>" novalidate>
<input type="hidden" name="hdn_prodpkid" id="hdn_prodpkid" value="<?php print $rs_list->Fields("pkid"); ?>">
... other variables...
<button type="submit" name='btn_addtocart' id='btn_addtocart'>Add</button>
</form>
end of while loop }
3 Réponses :
Lorsqu'un utilisateur clique sur le bouton Ajouter (Ajouter au panier), le formulaire parent de ce bouton sera soumis car vous utilisez . La propriété type = "submit" est utilisée pour une soumission de formulaire.
Si vous avez plusieurs formulaires, utilisez jQuery pour obtenir des éléments de formulaire soumis comme celui-ci-
var id = '';
$(function() {
$("form").submit(function(e) {
e.preventDefault(); // prevent default submit behaviour
var form = $(this);
id = form.attr('id');
var hdn_prodpkid = $("#id #hdn_prodpkid").val();
$.ajax({
url: "./product_addtocart_p.php",
type: "POST",
data: {
hdn_prodpkid: hdn_prodpkid
},
cache: false,
}) // End of Ajax
}); // End of form submit
}); // End of $(function())
Lorsqu'un formulaire est soumis à partir de votre fichier product_listing.php le code ci-dessus s'exécutera et récupérera l'ID de ce formulaire soumis.
Après cela, vous pouvez exécuter votre ajax pour un autre calcul sur le fichier product_listing.js .
- Mettre à jour--
essayez d'utiliser l'exemple ci-dessous
$(document).ready(function() {
var id; //For global access
$("form").submit(function(){
var form = $(this);
id = form.attr('id');
$("#"+id+" input, #"+id+" select").jqBootstrapValidation({
preventSubmit: true,
submitError: function($form, event, errors) {
...other code...
},
submitSuccess: function($form, event) {
event.preventDefault();
var hdn_prodpkid = $("input#hdn_prodpkid").val();
... other variables...
$.ajax({
url: "./product_addtocart_p.php",
type: "POST",
data: {
hdn_prodpkid: hdn_prodpkid,
... other variables...
},
cache: false,
success: function(data)
{
...other code...
}
}
});
});
});
alert(id);
Maintenant, j'ai défini la variable id en dehors de la fonction afin que vous puissiez y accéder en dehors la fonction.
J'espère que cela fonctionnera ...
--Mettre à jour--
Je ne suis pas en mesure de reproduire votre code fourni donc je vous suggère seulement comment gérer ce problème. Tout d'abord, simplifiez votre code et vérifiez quel code fonctionne ou quel code ne fonctionne pas, après cela, vous devez vérifier pourquoi ce code ne fonctionne pas.
Si possible, simplifiez votre code qui pourrait vous donner un indice pourquoi votre code ne fonctionne pas. J'ai simplifié votre code Si possible, utilisez le code simplifié.
Merci
Votre product_listing.js
$("form").submit(function(){
var form = $(this);
var id = form.attr('id');
alert(id + ' form submitted');
});
J'obtiens maintenant l'ID de formulaire approprié sur la page js, mais je dois ensuite appliquer cet ID de formulaire au code ci-dessous afin que je puisse obtenir toutes les valeurs masquées transmises pour le formulaire sélectionné. Mais je ne reçois pas l'ID de formulaire récupéré dans ce code - $ ("#" + id + "input, #" + id + "select"). JqBootstrapValidation ({
@KAhir J'ai mis à jour ma réponse maintenant, le code s'exécutera et récupérera les valeurs cachées lorsque le bouton d'envoi est enfoncé.
Bonjour, j'ai essayé votre code fourni ci-dessus, mais si j'alerte l'ID du formulaire après ce code, cela n'alerte pas. $ ("#" + id + "input, #" + id + "select"). jqBootstrapValidation ({... Veuillez aviser.
Souhaitez-vous accéder à l'identifiant en dehors de la fonction? Si oui, vous devez déclarer la variable id globalement dans votre fichier js. La variable id est déclarée à l'intérieur de la fonction afin qu'elle ne puisse être accessible qu'à l'intérieur de la fonction
oui, j'en ai besoin dans le monde entier. Alors, comment puis-je le déclarer globalement? S'il vous plaît, faites-moi savoir. Également dans votre réponse mise à jour ci-dessus, sera disponible dans la fonction jqBootstrapValidation? S'il vous plaît, faites-moi savoir.
@KAhir J'ai déclaré l'identifiant globalement, vérifiez la réponse mise à jour
Bonjour, j'ai mis tout le code selon votre réponse, mais pour une raison quelconque, je ne reçois pas l'ID de formulaire dans la fonction jqBootstrapValidation? Est-il possible d'envoyer votre code complet pour que vous puissiez y jeter un œil? S'il vous plaît, faites-moi savoir.
Vérifiez attentivement le code, il vous manque probablement quelque chose.
Bonjour, j'ai vérifié l'intégralité du code et également publié le code de page .JS mis à jour dans ma question initiale. Jetez un œil et répondez. Ty
veuillez trouver les modifications en espérant que cela fonctionne
Tout d'abord mettre à jour, le code du bouton dont l'id est répété n'est pas valide
déclenche l'événement de clic du bouton par classe
$ (". submitButton"). click (function () { var form = $ (this) .parent ("formulaire"); console.log (jQuery (formulaire) .attr ("id")); });
Ty pour votre réponse, mais comme je l'ai mentionné dans ma question initiale et mise à jour, je reçois un ID de formulaire unique, mais après je ne suis pas en mesure de récupérer cette valeur ici dans ce code $ ("#" + id + "input, # "+ id +" select "). jqBootstrapValidation ({ et après. C'est pourquoi le code JS n'est pas exécuté. Veuillez nous en informer.
essayez var values = {}; jQuery.each ($ ('#' + jQuery (formulaire) .attr ("id") '). serializeArray () , function (i, field) {values [field.name] = field.value;}) ;
Les identifiants HTML doivent être uniques donc n'utilisez pas id = "hdn_prodpkid" quel que soit le nombre d'éléments avec hdn_prodpkid identifiant le l'instruction suivante
$("form").submit(function() {
var id= $(this).data('id'); //Example
$(this).find('input, select') //Target the descendant
.jqBootstrapValidation({
submitSuccess: function($form, event) {
//Perform the desired operation here to get the relvant data from thr form
event.preventDefault();
$.ajax({
url: "./product_addtocart_p.php",
type: "POST",
data: {
hdn_prodpkid: $form.data('id') //Get Arbitary data
},
cache: false,
})
}
});
});
vous renverra toujours la valeur du premier élément.
Je vous recommande de ne pas utiliser l'élément hidden comme vous l'êtes ne pas envoyer le formulaire à l'API à la place en utilisant l'appel ajax () .
Une solution immédiate ( Je ne recommanderais pas cette approche ) serait d'utiliser
while () {
<form data-id="<?php print $rs_list->Fields("pkid"); ?>" novalidate>
<button type="submit">Add</button>
</form>
}
Utilisez des attributs data- * personnalisés pour conserver des informations arbitraires sous la forme, par exemple, pkid qui peuvent être récupérées en utilisant la méthode .data (key) .
En supposant que et descendent de l'élément de formulaire, utilisez .find () pour obtenir la référence Ensuite, appliquez la méthode jqBootstrapValidation () sur eux.
Lors de la soumission du formulaire en utilisant jqBootstrapValidation () , le submitSuccess ($ form, event) La méthode de rappel donne les références de l'élément que l'utilisateur a tenté de soumettre (enveloppé dans jQuery), c'est-à-dire $ form . Il peut être utilisé pour obtenir les références de l'élément descendant souhaité ou pour obtenir les données arbitraires de l'élément .
HTML p >
var hdn_prodpkid = $form.find("input#hdn_prodpkid").val();
Script
var hdn_prodpkid = $("input#hdn_prodpkid").val();
Bonjour, j'ai près de 20 variables qui sont passées lors de la soumission du formulaire. Je n'ai mentionné qu'une seule variable dans ma question pour qu'elle soit courte et claire. Alors s'il vous plaît aviser en conséquence. Ty
@KAhir, aucune variable n'a d'importance Si ce sont des données arbitraires, utilisez des attributs de données sinon utilisez des éléments HTML, la logique reste la même. Remarque Les identifiants en HTML doivent être uniques si vous souhaitez cibler individuellement, utilisez le sélecteur de classe .class avec. .find () . Un exemple de quantité peut être ciblé en utilisant $ form.find ('. Qty'). Val ()
Combien de formulaires avez-vous dans le fichier product_listing.php? Dans le code ci-dessus, il n'y a qu'un seul formulaire.
Je ne suis pas sûr de bien comprendre l'exigence, mais vous pouvez générer un identifiant aléatoire avec stackoverflow.com/a/6860916/863110 a> alors vous pouvez ajouter l'identifiant au formulaire en utilisant
input [type = "hidden"]et enfin soumettre le formulaire en utilisant ajaxForm@LokeshSaini, cela peut prendre n'importe quel nombre de formes et cela dépend du nombre de produits. Actuellement, je viens de mentionner While Loop dans mon code ci-dessus pour réduire la taille du code.
@KAhir vous déclarez deux fois la variable
id, remplacezvar id = form.attr ('id');parid = form.attr ('id' );parce que vous aviez déclaré la variable id précédemment.@KAhir Si vous ne pouvez pas obtenir d'identifiant dans la fonction
jqBootstrapValidation, alors je suis sûr que votre fonctionjqBootstrapValidationne fonctionne pas.@LokeshSaini, j'ai changé deux fois la déclaration de
var id. Si j'utilise ce même code pour un formulaire unique, cela fonctionne bien mais ne fonctionne pas pour plusieurs formulaires. Vous ne savez donc pas comment vous assurer que la fonctionjqBootstrapValidationne fonctionne pas. S'il vous plaît donnez votre avis.Vous utilisez la variable
hdn_prodpkiddans votre ajax, vérifiez la valeur de cette variable pour différents produits (formulaire). Cette valeur est-elle différente ou identique pour tous les produits (formulaires)?@LokeshSaini, oui, chaque valeur de
hdn_prodpkidest différente, mais je ne peux pas alerter cette valeur sur la page JS car ma page de liste de produits vient de se soumettre.