2010-06-14 3 views
1

J'utilise jquery pour trier plusieurs paragraphes. Actuellement, je l'ai configuré pour afficher uniquement les paragraphes commençant par une lettre en cours. Mais maintenant, je voudrais consolider davantage. Si le texte entre les balises de paragraphe a plusieurs instances, je voudrais tout sauf le premier caché.Masquer tout mais premier élément correspondant

C'est ce que j'ai pour le moment, mais ça ne marche pas.

var letter = '<?php echo(strlen($_GET['letter']) == 1) ? $_GET['letter'] : ''; ?>' 

function finish(){ 
    jQuery('p').each(function(){  
    if(jQuery(this).text().substr(0,1).toUpperCase() == letter){ 
     jQuery(this).addClass('current-series'); 
     jQuery(this).html(letter + '<span class="hidden">'+jQuery(this).text().slice(1)+ '</span>'); 
    } 
    else{ jQuery(this).hide();} 
    }) 
} 

Mise à jour:

Désolé les gars, je sais que c'est un peu difficile à expliquer. Voici un exemple de base:

  • La lettre sélectionnée est B
  • Les valeurs retournées sont:

balle

balle

balle

Boy

cerveau

Bat

Bat

Chacune de ces valeurs est dans une balise de paragraphe. Y a-t-il un moyen de consolider cela?

balle

Boy

cerveau

Bat

+0

Tout sauf le premier paragraphe ou la première lettre? Je pensais que vous vouliez dire la première lettre réelle. –

+0

Ahh, vous feriez mieux de le faire du côté PHP/Mysql quand vous obtenez les données à l'origine sinon ça devient compliqué. –

+1

Je pense que je comprends ce que vous cherchez maintenant. J'ai mis à jour ma réponse et le jsFiddle. – user113716

Répondre

1

Cela permet de masquer tout sauf le premier paragraphe avec cette première lettre:

EDIT: Vous pouvez faire la solution salissante suivante .

function finish(){ 
    var found_first = []; 
    jQuery('p').each(function(){  
    if(jQuery(this).text().substr(0,1).toUpperCase() == letter){ 
    if(found_first[jQuery(this).text()] != true){ 
     jQuery(this).addClass('current-series'); 
     found_first[jQuery(this).text()] = true; 
    }else{ 
     jQuery(this).hide(); 
    } 
    } 
    else{ jQuery(this).hide();} 
    }) 

} 
+0

Aaron - Vous l'avez fait à nouveau. Merci beaucoup. J'espère que je serai aussi compétent que vous avec Jquery un jour: P – Batfan

+0

Si vous sélectionnez les données avec MySQL, vous pouvez sélectionner les données comme ceci pour obtenir tout ce qui commence par la lettre spécifiée et seulement des noms uniques: 'CHOISIR le titre FROM table WHERE titre comme 'a%' GROUP BY title; ' –

+0

Oui, j'avais pensé à ça mais, malheureusement, mysql ne sera pas disponible là où le code est appliqué. Merci quand même :) – Batfan

2

OK, je pense que je comprends maintenant.

Essayez ceci:http://jsfiddle.net/Upa3S/

var letter = 'B'; 

    var array = []; // Stores array of the content of paragraphs 

    function finish(){ 
     jQuery('p').each(function(){ 

       // Cache reference to the paragraph 
      $th = jQuery(this); 
      if($th.text().substr(0,1).toUpperCase() == letter) { 

        // Test if we've already stored the current content in array 
       if(jQuery.inArray($th.text(), array) > -1) { 
         // If so, hide it 
        $th.addClass('hidden'); // You can do $th.hide() if you prefer 
       } else { 
         // If not, put its content in the array 
        $th.addClass('current-series'); 
        array.push($th.text()); 
       } 
      } else { 
       $th.hide(); 
      } 
     }) 
    } 

finish();​ 

Ou en utilisant .filter()

http://jsfiddle.net/Fjj5d/

var letter = 'B'; 

var array = []; 

function finish(){ 
    jQuery('p').filter(function(){ 
     $th = jQuery(this); 
     if($th.text().substr(0,1).toUpperCase() == letter && jQuery.inArray($th.text(), array) < 0) { 
      array.push($th.text()); 
      $th.addClass('current-series'); 
     } else { 
      return this; 
     } 
    }).hide(); 
} 
finish(); 

+0

Merci pour votre aide patrick – Batfan

+0

@Batfan - De rien. Si vous êtes intéressé, j'ai travaillé un peu plus propre en utilisant '.filter()'. Gratuit. ; o) – user113716

+0

Ha, quel gentleman. Merci encore, j'apprécie – Batfan

Questions connexes