2013-02-16 28 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); 
} 

Bu kod bir konsolda 2xdefaults döndürüyor. Niye ya? Zaten bir gözDize olarak geçiş yapma durumu

Ben metin veya şifre olarak her türü için bir girdi dönmek çalışıyorum ama benim anahtarı jQuery ile yapmak doğru bir yol "TYP"

+0

Değişken başlatma için 'var' kullanın! –

cevap

8

nedeni each çağrı içinde this bir String nesne örneği değil, ilkel bir dize olmasıdır. JavaScript'in ikisi de var. Bir switch deyiminde, vakalarla karşılaştırmaaracılığıyla ve örneği dize ilkel bir dizeye === değil. bunu düzeltmek için

üç yolu vardır:

  1. Size anahtarı değiştirirseniz:

    switch (String(this)) { 
    

    ... bu senin switch eser bunun üzerine, ilkel haline geri dönecek. VisioN olarak

  2. aşağıdaki yorum işaret, bağımsız değişkenler kullanan $.each geçer (her bir dize ilkel   — ikinci bağımsız olarak temin edilecektir olarak   —) herhangi

    $.each(typ, function(index, value) { 
        switch (value) { 
         // ... 
        } 
    }); 
    
  3. Kullanım the alternatives discussed in this other answer (bunlardan biri basit bir for döngüdür).


Yan not: Eğer typ değişkeni bildirerek vermeyerek The Horror of Implicit Globals tuzağına düşüyoruz.

+1

VisioN ile katılıyorum. İnsanlar neden jQuery 'nı()' yerine bir yerel JavaScript döngüsü yerine kullanmazlar! – hohner

+1

@hohner: Evet, ben de basit döngülere doğru eğildim ve yineleme fonksiyonunun imzası “$ .each” gerektirir, özeldir. :-) Birçok kişi, yineleme işlevini kullanmanın yinelemeye özgü değişkenler için yeni bir kapsam sağladığını beğenir.Bu genellikle (benim için) döngünün içinde bulunduğu fonksiyonun zaten çok karmaşık olduğunu ve ayrılmaya ihtiyaç duyduğunu gösterir, ancak insanların bunu kullanmasının bir nedeni vardır. Çok uzun bir süre önce, 'forEach' için bunun yerine güvenilir bir şekilde kullanabilecekler (bu, girişi ilk * argüman olarak veren rasyonel şeyi yapar). –

3

jQuery, burada overkill tanımıyor TJ Kalabalıklar cevap veriyor.

Standart for -loop kullanarak daha basit bir yöntem öneririm. Düzgün çalışır: bu davranışı görüyoruz

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

TimWolla doğru sorunu bulamadı rağmen ** için ** bu amaç için daha iyi olduğunu kabul ediyorum. İnsanların, günler boyunca belirsiz kodlar üretmesinden nefret ediyorum. –

2

$.each işlevini yanlış kullanıyorsunuz. Bu gibi görünmelidir:

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

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

O kullanmıyor * yanlış *, ama '' '' '' '' '' '' '' '' '' '' '' 'beklemede olana kadar çıkmıyor. –

+0

Üzgünüm, doktorlara baktıktan sonra tam olarak ne demek istediniz. –

0

deneyin switch(this) yerine switch(String(this)) kullanarak. Ve elbette, değişkenlerinizi başlatınız.

İlgili konular