2015-10-03 16 views
6

Ho un modulo con più caselle a discesa.Combina più funzioni jQuery semplici

Se l'utente sceglie "Altro" dal menu a discesa, un altro div con un campo di immissione scorrerà verso il basso.

Il problema è che ho 20+ caselle a discesa simili. Posso creare solo 1 funzione per attivare quella correlata?

Ecco il mio html:

<div class="container"> 
    <div> 
     <select id="option1" name="city"> 
      <option value="">Please Choose</option> 
      <option value="Other">Other</option> 
      <option value="London">London</option> 
     </select> 
    </div> 

    <div id="box1"> 
     <input type="text" name="city-other"> 
    </div> 
</div> 

<div class="container"> 
    <div> 
     <select id="option2" name="color"> 
      <option value="">Please Choose</option> 
      <option value="Other">Other</option> 
      <option value="Red">Red</option> 
     </select> 
    </div> 

    <div id="box2"> 
     <input type="text" name="color-other"> 
    </div> 
</div> 

E il mio codice jQuery:

$("#box1").hide(); 
$('#option1').on('change', function() { 
    if (this.value == 'Other') 
    { 
     $("#box1").slideDown("slow"); 
    } else { 
     $("#box1").slideUp("slow"); 
    } 
}); 

$("#box2").hide(); 
$('#option2').on('change', function() { 
    if (this.value == 'Other') 
    { 
     $("#box2").slideDown("slow"); 
    } else { 
     $("#box2").slideUp("slow"); 
    } 
}); 
+0

cercare il mio codice e fammi sapere. .. –

risposta

1

Demo: http://jsfiddle.net/fn5ac1f7/

$(function() { 
    $(".box").hide(); 
    $('.option').on('change', function() { 
     var parent = $(this).parent().parent(); 
     var children=$(parent).children()[1]; 

     if (this.value == 'Other') 
     { 
      $(children).slideDown("slow"); 
     } else { 
      $(children).slideUp("slow"); 
     } 
    }); 
}); 
1

Utilizzare le classi invece di ID e di classe come loro:

$('.option').on('change', function() { 
    if (this.value == 'Other') 
    { 
     $(this).slideDown("slow"); 
    } else { 
     $(this).slideUp("slow"); 
    } 
}); 

Edit:
Per nascondi la scatola, dovresti ottenere l'id dell'ingresso select (all'interno della modifica funzione) da questo:

var this_id = $(this)[0].id; 
this_id = this_id.split('option')[1]; //get the input id 
$("#box" + this_id).hide(); //hide box with same id 
+0

Che scorre verso l'alto t lui opzione, non la scatola. –

+0

Maximillian ha ragione – Dejavu

+0

Ho modificato la risposta. – Tarek

0

solo per divertimento demo https://jsfiddle.net/mtffje50/

$(function() { 
    // hide all div with id starting with "box" 
    $("div[id^='box']").hide(); 
    // observe all select with id starting with "option" 
    $("select[id^='option']").on('change', function() { 
     // do the trick here... 
     var name = this.name.toLowerCase() + '-other'; 
     var $parent = $("input[name='" + name + "']").parent().parent(); 
     if (this.value.toLowerCase() == 'other') { 
      $parent.slideDown("slow"); 
     } else { 
      $parent.slideUp("slow"); 
     } 
    }); 
}); 
+0

Piuttosto complicato :) – Dejavu

+0

complicato? con queste poche righe di codice non è necessario riscrivere tutto il codice html. (poiché è necessario riscrivere il codice html, lo sai?) –

+0

Hai ragione. Sto cercando di mettere il dropdown e il bos in un contenitore per scoprire un altro modo. Ho appena aggiornato il mio codice. – Dejavu

0

Utilizzare le classi

$(".box").slideUp(); 
$('.option').on('change', function() { 
var parent = $($(this).parent()).parent(); 
var children=$(parent).children()[1]; 

    if (this.value == 'Other') { 
    $(children).slideDown("slow"); 
    } else { 
    $(children).slideUp("slow"); 
    } 
}); 
+0

Fa scorrere il menu a discesa se scelgo un'opzione anziché "Altro" – Dejavu

+0

@Dejavu, necessario per ottenere var parent = $ ($ (questo) .parent()). Parent(); per la tua struttura html (dato che il genitore del contenitore è un genitore di parent di select), anche $ (". box"). slideUp(); bisogno di essere menzionato in cima. http://jsfiddle.net/#&togetherjs=66wOuC1roU –

Problemi correlati