2010-10-01 12 views
0

Merci à l'aide précieuse de plusieurs participants Stack Overflow, je suis très proche des résultats souhaités ... voici un résumé et mise à jour, pour les parties intéressées:contenu à une liste annexant en utilisant la case

J'ai une série de modules de produits, dont chacun contient (entre autres) le nom du produit et une case à cocher «Comparer». Mon objectif est de générer une liste de produits sélectionnés dans une autre zone de la page lorsque les cases à cocher sont cochées. Comme il doit y avoir une fonction pour vérifier un minimum de deux, et un maximum arbitraire - soit dans le cadre de la fonction checkbox .click (par la version de Brian, merci encore pour votre aide inestimable), ou sur le soumettre (que je suis penché vers). Dans les deux cas, le nombre d'éléments dans la liste est apparemment mal compté; w/zéro ou une case cochée, je reçois correctement une alerte d'éléments insuffisants; Toutefois, si je désélectionne et revérifie quelques fois, mon code signale le nombre incorrect d'éléments dans la liste. Dans l'intérêt de la brièveté (!), Je renoncerai à poster les deux versions, car je rencontre des similitudes similaires dans les deux. Voici mon dernier bricolage - merci d'avance pour toute idée.

<div class="product-module"> 

<div class="product-pic"> 
    <div class="checkbox-wrapper"> 
     <label for="compare1"> 
      <input type="checkbox" class="checkbox" name="compare" id="compare1" /> 
      Compare 
     </label> 
    </div> 
</div> 

<div class="product-info"> 
    <p> 
     <a href="#" title="#"><span class="product-name">Product Name here</span></a><br /> 
    </p> 
</div> 

<div class="compare"> 
<ul> 
</ul> 
<p class="error" style="display: none;">ACK! You've selected more than 4 products to compare.</p> 
<p class="compare-button"><button type="submit">Compare</button></p> 
<p class="clear-selections"><a class="button" id="clear-selections" href="#">Clear Selections</a></p> 

<script type="text/javascript"> 

$(function(){ 
    $('input[type="checkbox"]').attr('checked', false); 
}); 

$(function(){ 
    $('input[type="checkbox"]').click(function(){ 
     var title = $(this).closest('.product-module').find('.product-name').html(); 

     // as user checks the checkbox, add the item to the ul 
     if($(this).attr('checked')){ 

     var html = '<li><a href="'+title+'">' + title + '</a></li>'; 

     $('.compare ul').append(html); 
     } else {  
     // if user is un-checking the checkbox, remove the item from the ul 
     // orig: $('li[title="' + title + '"]').remove(); 
     $('li a[href="' + title + '"]').remove(); 
     } 
    }); 
}); 


$(function(){ 
    $('.clear-selections').click(function(){ 
     $('.compare ul').empty(); 
     $('input[type="checkbox"]').attr('checked', false); 
    }) 
}); 


$(function(){ 
    $('.compare button').click(function(){ 
     minRequests = 2; 
     maxRequests = 4; 
     requested = $('.compare ul li').size(); // go figure: why not .length()? 

     if(requested < 2) { 
     alert ('Compare ' + requested + ' products?'); 

     } else if((requested >= 2) && (requested <= 5)) { 
     alert ('There are ' + requested + ' products to compare'); 

     } else { 
     alert (requested + ' is too many'); 
     } 
    }); 
}); 

+0

Vous vous rendez compte que dans votre jQuery vous cherchez un '.product-module' qui ne semble pas exister dans le code HTML que vous avez fourni? –

+0

Lorsque vous essayez de présenter des blocs de code dans votre question, vous pouvez mettre en retrait chacune des lignes de code par quatre espaces; ** ou ** sélectionnez tout le texte que vous voulez afficher comme code et * soit * cliquez sur le '101010' au-dessus de la zone de texte * ou * appuyez sur ctrl + K. Pour le code en ligne, utilisez simplement des guillemets de chaque côté. S'il vous plaît lire le [Markdown editing help] (http://stackoverflow.com/editing-help). –

+0

Merci d'avoir signalé cela; c'est seulement parce que j'ai modifié les classes pour le but de la question, car je cible avec succès le nom du produit – shecky

Répondre

2

Voici l'approche que je prends: http://jsfiddle.net/ek2zh/ Je n'ai pas utilisé de clone parce que le noeud que vous voulez coller est un span et que vous voulez le cloner dans un li. Pas sûr que le clone ajustera automatiquement le noeud comme désiré.

+0

Merci Brian! Cette version ressemble beaucoup à ce que je pensais. Je ne l'ai pas encore fonctionné, pas sûr pourquoi, je vais devoir jouer avec elle – shecky

+0

Bonjour encore et encore merci, j'ai une version très légèrement modifiée de votre solution fonctionnant. Les noms de produits seront tirés d'une base de données, donc jusqu'à ce que je reçoive de mon client le format précis de ce contenu, je ne vais pas déranger personne pour modifier le code HTML;) ... ma prochaine question est comment limiter le nombre de lister les éléments et alerter l'utilisateur (par ex., afficher une erreur) quand ils essaient de sélectionner plus que le maximum autorisé. Peut-être que je devrais ajouter une nouvelle question, donc je peux montrer le jQuery jusqu'à présent – shecky

+0

Pas de soucis. J'ai mis à jour une fourche avec une boîte d'alerte. http://jsfiddle.net/G8yVe/ Tout ce que je fais est de fixer un montant maximum et de vérifier avant d'ajouter un nouveau li par rapport au nombre actuel de li –

0

Je devine que votre code est le clonage du clone .Product nom et le clonage à nouveau. Essayez d'utiliser un chemin plus spécifique pour cibler l'élément votre clonage, au lieu de la méthode find.