2017-02-19 7 views
0

J'ai obtenu un petit codepen où j'ai des onglets à sélection multiple (avec le widget jQuery sélectionnable). Au-dessus, j'ai reçu un formulaire avec une entrée de texte et un bouton de soumission. Lorsque j'insère du texte et le soumets, il ajoute le texte dans la liste de chaque onglet. Mon but est que le texte d'entrée soit seulement ajouté sur les listes des onglets sélectionnés. Thats my javascript:Ajouter un élément de liste uniquement aux listes dans les onglets sélectionnés

$(function() { 
    function selectionChange(event, ui) { 
     var items = $('.ui-selected', this).map(function() { 
      return $(this).index(); 
     }).get(); 

     $("section").each(function() { 
      $(this).toggle(items.indexOf($(this).index()) > -1); 
     }); 
     console.log(items); 
    } 

    $("#selectable").selectable(); 
    $("#selectable").selectable({ 
     selected: selectionChange, 
     unselected: selectionChange 
    }); 
}); 


$(function(){ 
    $('#plannerform').submit(function(e){ 
     var val = $(this).find('#plannername').val(); 
     $('ul.plannerlist').append('<li>' + val + '</li>'); 
     e.preventDefault(); 
    }); 
}); 

Et c'est le HTML:

<form id="plannerform"> 
    <input id="plannername" placeholder="Name eingeben" type="text"></input><!-- 
    --><input id="plannersubmit" type="submit" value="eintragen"></input> 
</form> 

<ol id="selectable"> 
    <li class="ui-widget-content">FR PM</li> 
    <li class="ui-widget-content">SA AM</li> 
    <li class="ui-widget-content">SA PM</li> 
    <li class="ui-widget-content">SO AM</li> 
    <li class="ui-widget-content">SO PM</li> 
    <li class="ui-widget-content">MO AM</li> 
</ol> 

<div id="content"> 
    <section class="tabcontent">1 
    <ul class="plannerlist"> 
    </ul> 
    </section> 
    <section class="tabcontent">2 
    <ul class="plannerlist"> 
    </ul> 
    </section> 
    <section class="tabcontent">3 
    <ul class="plannerlist"> 
    </ul> 
    </section> 
    <section class="tabcontent">4 
    <ul class="plannerlist"> 
    </ul> 
    </section> 
    <section class="tabcontent">5 
    <ul class="plannerlist"> 
    </ul> 
    </section> 
    <section class="tabcontent">6 
    <ul class="plannerlist"> 
    </ul> 
    </section> 
</div> 

Si vous avez besoin plus de code, le code complet est sur mes codepen que je l'ai mentionné ci-dessus.

Répondre

1

Append à $('.tabcontent:visible .plannerlist') au lieu, et si aucun sont visibles (état initial), ajouter à la un dans la première .tabcontent

est ici un stylo depuis la soumission du formulaire ne fonctionnera pas sur SO http://codepen.io/mcoker/pen/YNoNdN

$(function() { 
 
    // define one function, to be used for both select/unselect 
 
    function selectionChange(event, ui) { 
 
     // Get indexes of selected items in an array 
 
     var items = $('.ui-selected', this).map(function() { 
 
      return $(this).index(); 
 
     }).get(); 
 
     // Show or hide sections according to the corresponding option's selection 
 
     $("section").each(function() { 
 
      $(this).toggle(items.indexOf($(this).index()) > -1); 
 
     }); 
 
     console.log(items); 
 
    } 
 

 
    $("#selectable").selectable(); 
 
    $("#selectable").selectable({ 
 
     selected: selectionChange, 
 
     unselected: selectionChange 
 
    }); 
 
}); 
 

 

 
$(function(){ 
 
    $('#plannerform').submit(function(e){ 
 
     var val = $(this).find('#plannername').val(); 
 
     var $target = $('.tabcontent:visible').length ? $('.tabcontent:visible .plannerlist') : $('.tabcontent:first-child .plannerlist'); 
 
     $target.append('<li>' + val + '</li>'); 
 
     e.preventDefault(); 
 
    }); 
 
});
*{ 
 
    font-family: 'Josefin Sans', sans-serif; 
 
    margin: 0; 
 
    padding: 0; 
 
    box-sizing: border-box; 
 
} 
 
#selectable .ui-selecting { 
 
    background: #9eefbc; 
 
    transition:.8s ease-in-out; 
 
    -webkit-transition: -webkit-transform 0.8s, background-color 0.8s; 
 
\t transition: transform 0.8s, background-color 0.8s; 
 
\t -webkit-transform: perspective(300px) rotate3d(1,0,0,-180deg); 
 
\t transform: perspective(300px) rotate3d(1,0,0,-180deg); 
 
\t -webkit-transform-origin: 50% 100%; 
 
\t transform-origin: 50% 100%; 
 
\t -webkit-perspective-origin: 50% 100%; 
 
\t perspective-origin: 50% 100%; 
 
} 
 
#selectable .ui-selected { 
 
    background: #6dce91; 
 
    transition:all 0.8s; 
 
} 
 
#selectable { 
 
    list-style-type: none; 
 
    position:absolute; 
 
    width: 60%; 
 
    margin-left:20%; 
 
    display:flex; 
 
    transition:.3s ease-in-out; 
 
    z-index:1; 
 
    margin-top:3px; 
 
} 
 
#selectable li { 
 
    background:#ddffea; 
 
    padding: 0.6em; 
 
    font-size: 1.4em; 
 
    flex-grow:1; 
 
    transition:.3s ease-in-out; 
 
    border:none; 
 
    text-align:center; 
 
    line-height:0.8em; 
 
} 
 

 
#selectable .ui-selected:after, 
 
#selectable .ui-selected::after { 
 
    position: absolute; 
 
    top: 44px; 
 
    margin-left:-50px; 
 
    transition: .2s ease-in-out; 
 
    content: ''; 
 
    width: 0; 
 
    height: 0; 
 
    opacity:1; 
 
    animation:dreieckFade 1s forwards; 
 
    border-top: solid 15px #6dce91; 
 
    border-left: solid 20px transparent; 
 
    border-right: solid 20px transparent; 
 
} 
 

 
@keyframes dreieckFade{ 
 
    0%{opacity:0;border-top: solid 0px #6dce91;} 
 
    100%{opacity:1;border-top: solid 15px #6dce91;} 
 
} 
 

 
.ui-selectable-helper { 
 
    visibility: hidden; 
 
} 
 

 
#content{ 
 
    width:60%; 
 
    background-color:#9eefbc; 
 
    margin-left:20%; 
 
    padding-top:70px; 
 
    margin-top:3px; 
 
    padding-bottom:30px; 
 
} 
 

 
.tabcontent{ 
 
    top:44px; 
 
    background-color:transparent; 
 
    z-index:0; 
 
    transition:.3s ease-in-out; 
 
    font-size:2em; 
 
    display:none; 
 
    padding-left:100px; 
 
} 
 

 
#plannername{ 
 
    width:40%; 
 
    background-color:#9eefbc; 
 
    margin-left:20%; 
 
    border:0; 
 
    font-size:2em; 
 
    padding:20px; 
 
} 
 
#plannername:focus{ 
 
    outline:0; 
 
} 
 
#plannersubmit{ 
 
    width:20%; 
 
    background-color:#6dce91; 
 
    border:0; 
 
    font-size:2em; 
 
    padding:20px; 
 
    transition:.2s ease-in-out; 
 
} 
 
#plannersubmit:hover{ 
 
    transition:.2s ease-in-out; 
 
    padding-left:40px; 
 
    cursor:pointer; 
 
} 
 
#plannersubmit:focus{ 
 
    outline:0; 
 
} 
 
#plannersubmit:active{ 
 
    color:white; 
 
} 
 
.plannerlist{ 
 
    list-style-type:none; 
 
}
<link href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" rel="stylesheet"/> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> 
 
<script src="http://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script> 
 

 
<form id="plannerform"> 
 
    <input id="plannername" placeholder="Name eingeben" type="text" autocomplete="off"></input><!-- 
 
    --><input id="plannersubmit" type="submit" value="eintragen"></input> 
 
</form> 
 
<ol id="selectable"> 
 
    <li class="ui-widget-content">FR PM</li> 
 
    <li class="ui-widget-content">SA AM</li> 
 
    <li class="ui-widget-content">SA PM</li> 
 
    <li class="ui-widget-content">SO AM</li> 
 
    <li class="ui-widget-content">SO PM</li> 
 
    <li class="ui-widget-content">MO AM</li> 
 
</ol> 
 
<div id="content"> 
 
    <section class="tabcontent">1 
 
    <ul class="plannerlist"> 
 
    </ul> 
 
    </section> 
 
    <section class="tabcontent">2 
 
    <ul class="plannerlist"> 
 
    </ul> 
 
    </section> 
 
    <section class="tabcontent">3 
 
    <ul class="plannerlist"> 
 
    </ul> 
 
    </section> 
 
    <section class="tabcontent">4 
 
    <ul class="plannerlist"> 
 
    </ul> 
 
    </section> 
 
    <section class="tabcontent">5 
 
    <ul class="plannerlist"> 
 
    </ul> 
 
    </section> 
 
    <section class="tabcontent">6 
 
    <ul class="plannerlist"> 
 
    </ul> 
 
    </section> 
 
</div>

+0

Ah je ne le savais pas: visible. Merci pour cette solution simple. Cette deuxième partie, à savoir que l'élément est ajouté à la première liste, lorsqu'aucun onglet n'est sélectionné, ne me concerne pas du tout, car je souhaite que l'utilisateur sélectionne d'abord des onglets puis les soumette (avec quelques notes). Mais merci pour ça :) Bon à savoir. –

+0

@TobiasGlaus np. Dans ce cas, vous pouvez désactiver l'entrée de recherche si quelqu'un n'a pas sélectionné un onglet (probablement un mauvais UX, car l'utilisateur peut ne pas savoir qu'il doit sélectionner un onglet avant de chercher), ou faire le premier onglet sélectionné par défaut (semble être une meilleure solution). –

+0

Oui, c'est comme un planificateur où vous pouvez vous inscrire pour quelques jours. Donc, je pense que la désactivation de l'entrée de recherche est la meilleure solution. –

0

Vous pouvez stocker les indices sélectionnés dans le gestionnaire de clic, puis filtrer ceux lorsque vous ajoutez les données:

$(function() { 
    //Create a variable to store the indices of selected items 
    var selectedIndices = []; 

    function selectionChange(event, ui) { 
     var items = $('.ui-selected', this).map(function() { 
      return $(this).index(); 
     }).get(); 

     $("section").each(function() { 
      $(this).toggle(items.indexOf($(this).index()) > -1); 
     }); 
     console.log(items); 
     //Store the indices so that they can be accessed when the plannerform gets submitted 
     selectedIndices = items; 
    } 

    $("#selectable").selectable(); 
    $("#selectable").selectable({ 
     selected: selectionChange, 
     unselected: selectionChange 
    }); 

    $('#plannerform').submit(function(e){ 
     var val = $(this).find('#plannername').val(); 
     //filter the list, leaving only the elements whose indices are present in the selectedIndices array 
     $('ul.plannerlist').filter(function(index) { 
      return selectedIndices.indexOf(index) > -1; 
     }).append('<li>' + val + '</li>'); 
     e.preventDefault(); 
    }); 
}); 
+0

Merci pour votre réponse, mais je suppose que l'ajout de: visible comme ceci '$ ('. Tabcontent: visible .plannerlist')' est beaucoup plus facile. Mais j'apprécie votre aide! –