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

У меня есть этот код, а в консоли он возвращает 2xdefaults. Зачем?Корпус выключателя в виде строки

Я пытаюсь вернуть вход для каждого типа в виде текста или пароля, но мой переключатель не распознает «станд»

+0

Используйте переменную 'var' для переменной инициализации! –

ответ

8

Причина вы видите это поведение является то, что this в each вызова является экземпляром String объекта, а не строка примитивно. JavaScript имеет оба. В заявлении switch сравнение с случаями осуществляется через ===, а строка пример не === на строку примитив.

Три способа это исправить:

  1. Если вы измените переключатель:

    switch (String(this)) { 
    

    ... что превратит его обратно в примитив, после чего ваши switch работ.

  2. В VisioN указывает в комментариях ниже, используют аргументы, которые $.each проходит (каждая строка   — как примитивный   — будут предоставлены в качестве второго аргумента):

    $.each(typ, function(index, value) { 
        switch (value) { 
         // ... 
        } 
    }); 
    
  3. использовать любой из the alternatives discussed in this other answer (один из которых - простая простая петля for).


Side Примечание: Вы жертвой The Horror of Implicit Globals, не объявляя вашу typ переменную.

+1

Согласен с VisioN. Почему люди используют jQuery 'each()' вместо встроенного цикла JavaScript, который я никогда не узнаю! – hohner

+1

@hohner: Да, я тоже наклоняюсь к простым петлям, и для функции итерации '$ .each' требуется, um, special. :-) Многим людям нравится тот факт, что использование итерационной функции дает им новую возможность для переменных, зависящих от итерации.Это обычно указывает (на меня), что функция, в которой находится цикл, уже слишком сложна и требует разрыва, но это одна из причин, по которой люди ее используют. Слишком долго они смогут использовать 'forEach' надежно для этого вместо этого (что делает рациональным включение записи в качестве аргумента * first *). –

3

JQuery является излишеством здесь, на правильном пути, чтобы сделать это с JQuery так или иначе взглянуть на TJ Ответчики.

Я рекомендую метод, упрощающий использование стандартного for -loop. Он отлично работает:

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 не нашел правильной проблемы, я согласен, что ** для ** лучше для этой цели. Я ненавижу то, как люди производят неэффективные коды в эти дни. –

2

Неправильно используется функция $.each. Он должен выглядеть следующим образом:

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

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

Он не использует его * неправильно *, но 'this' не оказывается тем, что он ожидает (хотя он близок). –

+0

Простите, что вы сказали, повернулось полностью верно после того, как я посмотрел документы. –

0

Попробуйте использовать switch(String(this)) вместо switch(this). И, конечно, инициализируйте свои переменные.

Смежные вопросы