2011-06-27 4 views
2
var input = document.getElementById('thumbimg'); 
      input.addEventListener('change', function() { $("input.imgcheck").attr("disabled", ""); }, false); 

J'utilise ce code pour activer le bouton d'envoi lorsque l'utilisateur sélectionne un fichier à télécharger. Mais que faire si je veux ajouter plus d'un champ de téléchargement? Je dois savoir comment activer le bouton de soumission uniquement si tous les champs de téléchargement sont remplis. Des idées?Comment ajouter un écouteur d'événement à plusieurs éléments?

Répondre

2

Mise à jour:

@Simeon fait un commentaire important et il a raison. Pour résoudre ce problème, vous pouvez vérifier la valeur de chaque champ et voir si elle est vide ou non:

var $fields = $('.thumbimg'), 
    $submit = $("input.imgcheck"), 
    numRequiredFields = $fields.length; // or 3 as per your comment (somewhere) 

function runOnChange() { 
    var $filledFields = $fields.filter(function(){ 
     return $(this).val() !== ""; 
    }); 
    if($filledFields.length >= numRequiredFields) 
     // all fields changed 
     // run logic here 
     $submit.attr("disabled", ""); 
    } 
    else { 
     $submit.attr("disabled", "disabled"); 
    } 
} 

$fields.change(runOnChange); 

j'espérais pour éviter l'inspection tous les domaines à chaque changement, mais il semble que ce soit inévitable.


réponse originale:

Vous devrait garder une trace des champs ont changé. Si vous avez plus d'un champ de téléchargement de fichiers, vous devez utiliser des classes, pas d'ID:

var numFields = $('.thumbimg').length, 
    changedFields = 0; 

function runOnChange() { 
    changedFields++; 
    if(changedFields >= numFields) { 
     // all fields changed 
     // run logic here 
     $("input.imgcheck").attr("disabled", ""); 
    } 
} 

$('.thumbimg').change(runOnChange); 

De plus, si vous utilisez jQuery de toute façon, alors cohérente et l'utiliser tout au long du script. Surtout ne pas utiliser addEventListener, ce qui ne fonctionne pas dans IE8 et ci-dessous. jQuery est là pour abstraire des différences de ce navigateur.

+0

Cela fonctionne comme un charme, merci :) –

+0

Si l'utilisateur change une sélection de fichier plusieurs fois cela produira un résultat incorrect, car l'événement 'change' est exécuté chaque fois que le fichier est modifié – Simeon

+0

@Simeon: True .Bon point .Mon mis à jour ma réponse. –

4

D'une part, vous pouvez utiliser un sélecteur plus générique. Par exemple:

$(".mytest").change(function() { $(this).attr("disabled", ""); } ; 

appliquera l'événement à chaque élément qui contient la classe mytest. En revanche, vous pouvez utiliser le code delegate function. Par exemple:

$("#myContainer").delegate(".mytest", "change", function(){ $(this).attr("disabled", ""); }); 

appliquera l'événement à chaque élément qui contient la classe mytest mais appartient au conteneur principal dont l'id est myContainer.

[EDIT] (modifié le code ci-dessus) Pour vérifier si vos entrées sont remplis, vous pouvez utiliser ce code (devrait fonctionner même si non testé ici) en utilisant les name selector:

if ($('input[disabled!=""]').length !== 0) { 
    // submit 
} 

Cordialement,

Max

+0

Bonjour max, merci pour votre réponse. Cependant, ce code permet l'exécution des fonctions si l'un des champs a changé, mais je ne veux l'activer que si TOUS les champs ont changé. –

+0

Vérifiez simplement la valeur de toutes les entrées de fichier sur chaque événement de changement. Si aucun d'entre eux n'est vide, activez le bouton de soumission. –

+0

@Mohamed Said: J'ai édité ma réponse pour mieux répondre à votre question – JMax

2

Vous pouvez utiliser

$('input').change(function() { 

}); 

pour lier la fonction à l'événement change() pour tous les éléments <input>. Ajoutez ensuite des vérifications au corps de la fonction et activez le <input type="submit"/> si la validation réussit.

Certains plugins jQuery sont disponibles. Vous pouvez utiliser jQueryFormValidtor (par exemple) et jQuery Form Validation Plugins pour commencer.

+0

J'utilise déjà un validateur jquery, mais j'essaie de forcer l'utilisateur à télécharger trois images avant de pouvoir soumettre le formulaire, c'est pourquoi je suis désactiver le bouton de soumission. Existe-t-il une condition AND dans jquery? comme $ ('input and input2'). change (fonction ( pour que la fonction ne fonctionne pas à moins que les trois entrées soient changées? –

1

La réponse acceptée -t a fait fonctionne pas correctement. Le bouton de soumission serait activé si l'utilisateur change le fichier/l'image dans le premier champ de fichier un certain nombre de fois. Regardez le this demo, qui vérifie que chaque entrée a une valeur. Code:

var fileInputs = $('input[type=file]'); 
var submitBtn = $('input[type=submit]'); 
fileInputs.change(function() { 
    if(fileInputs.filter('[value=""]').length == 0) 
     submitBtn.removeAttr('disabled'); 
    else 
     submitBtn.attr('disabled', 'disabled'); 
}); 
Questions connexes