2013-02-16 15 views
5
$(document).ready(function(){ 

    createForm("text,password",".content"); 

}); 

function createForm(types,object){ 

    typ = types.split(','); 

    //var source = ""; 

    $.each(typ,function(){ 

     switch(this){ 

      case "text": 
      console.log('text');break; 
      default: console.log('default');break; 
     } 


    }); 
    //$(object).html(source); 
} 

Ho questo codice in console restituisce 2xdefaults. Perché?Switch case come stringa

cerco di restituire un ingresso per ogni tipo di testo o la password, ma il mio interruttore non riconosce il "tip"

+0

Utilizzare 'var' per l'inizializzazione delle variabili! –

risposta

8

Il motivo che stai vedendo questo comportamento è che this all'interno della chiamata each è un'istanza String oggetto, non una stringa primitiva. JavaScript ha entrambi. In un'istruzione switch, il confronto con i casi avviene tramite === e una stringa istanza non è in una stringa primitiva.

tre modi per risolvere il problema:

  1. se si cambia il passaggio a:

    switch (String(this)) { 
    

    ... che si trasformerà di nuovo in un primitivo, dopo di che i vostri switch opere.

  2. Come VisioN sottolinea nei commenti qui sotto, utilizzare gli argomenti che $.each passaggi (ogni stringa   — come primitiva   — sarà fornito come secondo argomento):

    $.each(typ, function(index, value) { 
        switch (value) { 
         // ... 
        } 
    }); 
    
  3. Utilizzo qualsiasi the alternatives discussed in this other answer (uno dei quali è un bel ciclo semplice for).


Nota a margine: si sta cadendo preda di The Horror of Implicit Globals dalla non dichiarando la variabile typ.

+1

D'accordo con VisioN. Perché le persone usano jQuery 'each()' invece di un ciclo nativo di JavaScript che non saprò mai! – hohner

+1

@hohner: Sì, mi avvicino anche ai loop semplici, e la firma della funzione iterazione '$ .each' è, um, speciale. :-) A molte persone piace il fatto che l'uso di una funzione di iterazione dia loro un nuovo ambito per variabili specifiche dell'iterazione.Questo di solito indica (per me) che la funzione in cui si trova il loop è già troppo complessa e deve essere interrotta, ma questa è una delle ragioni per cui la gente lo usa. Prima di troppo saranno in grado di usare 'forEach' in modo affidabile per quello (che fa la cosa razionale di dare la voce come * primo * argomento). –

3

jQuery è eccessivo qui, per un modo corretto di farlo con jQuery comunque dare un'occhiata a TJ Risposta di Crowders.

Si consiglia un metodo che è molto più semplice utilizzando uno standard for -loop. Funziona bene:

var types = "text,password".split(","); 
for (var i = 0; i < types.length; i++) { 
    switch(types[i]){ 
     case "text": 
      console.log('text'); 
     break; 
     default: 
      console.log('default'); 
     break; 
    } 
} 
+0

Sebbene TimWolla non abbia trovato il problema giusto, sono d'accordo sul fatto che ** per ** sia migliore per questo scopo. Odio il modo in cui le persone producono codici poco efficaci in questi giorni. –

2

Si utilizza la funzione $.each in modo errato. Esso dovrebbe essere simile a questo:

$.each(typ, function(key, value) { 
    switch(value){ 

     case "text": 
      console.log('text');break; 
     default: 
      console.log('default');break; 
    } 
}); 
+0

Non lo sta usando * errato *, ma "questo" non sta diventando ciò che si aspetta (anche se è vicino). –

+0

Mi dispiace, quello che dici è diventato completamente vero dopo aver consultato i documenti. –

0

Provare a utilizzare switch(String(this)) invece di switch(this). E, naturalmente, inizializza le tue variabili.

Problemi correlati