2009-10-24 5 views
3

나는 switch case 문이 javascript에 고유 한 것이므로 변경할 수 없다는 것을 알고있다. 나는 여전히 자바 스크립트와 jQuery를 배우므로 얻을 수는 있지만, jQuery 수준에있을만한 것을 작성하는 것에 대해서는 충분히 알지 못한다. 따라서이 아이디어가 실현 가능한지에 대한 생각이나 질문으로 받아 들여야합니다. jQuery Switch Case Plugin?

내 생각이 같은 것을 사용할 수있는 객체를 사용할 수있는 스위치 케이스 문 ...입니다 :

switch($(this)){ 

case .hasClass('foo'): 
    // do something 
    break; 

case .filter('.bar').attr('id') == 'foo': 
    // do something else 
    break; 

} 

편집 :이 같은 심지어 뭔가 아마도 (좋은 것 보다 합리적인 생각) ...

switch ($(this).hasClass()) { 

case 'foo': 
    alert('found a foo!'); 
    break; 

case 'bar': 
    alert('found a bar!'); 
    break; 

} 
+0

왜 커뮤니티 위키가 추가? – cdmckay

+1

* 어깨를 으 * 것은 옳은 것처럼 보였습니까? – Mottie

+0

LOL, 이제는 이것에 대해 생각할 시간이 있었으므로 두 번째로 합리적인 예가 포함되었습니다. 또한이 질문에 대한 답변이 없을 수도 있기 때문에 커뮤니티 위키를 만들었습니다. 다른 사람들이 이것을 유용하게 사용할 수 있는지 알아 보는 것이 더 좋습니다. – Mottie

답변

3

종종 스위치는 문제를 해결하는 가장 좋은 방법은 아니지만, 당신은 종류의 스위치 문처럼 작동하는 플러그인을 만들 수있는 jQuery를 사용 : 당신은 너무 같은 플러그인을 사용

(function($) { 
    $.fn.switchClasses = function(switches) { 
     return this.each(function() { 
      var that = this; 
      $.each(this.attr("class").split(' '), function(i, class) { 
       var func = switches[class]; 
       if(func) 
        func.apply(that, class); 
      }); 
     }); 
    }; 
})(jQuery); 

을 :

$(this).switchClasses(
    { 
     "class1": 
     function(class) { 
      // Do something for this class, 
      // the "this" variable is the jquery object that matched the class 
     }, 

     "class2": 
     function(class) { 

     } 
    } 
); 
+1

저는 항상 빠른 전환 명령문으로 객체 리터럴을 사용하는 것을 좋아했습니다. +1 – gnarf

+0

나를 위해 작동하지 않습니다 ... – EmRa228

0

정상 if/else 어떤 문제가 있습니까?

inst = $(this); 

if (inst.hasClass('foo')) { 
    // do something 
} else if (inst.filter('.bar').attr('id') == 'foo') { 
    // do something else 
} 
+2

두세 가지 경우 가독성? –

0

하나의 클래스 이름을 다루는 경우 element.attr('class')을 켤 수 있습니다.

두 개 이상을 처리하는 경우 element.attr('class').split(/\s+/)을 수행하고 해당 배열에서 클래스 이름을 확인할 수 있습니다.

또한 .is()을 살펴볼 수도 있습니다. 당신은 같은 일을 할 수 있습니다 if(element.is('a.foo')) console.log('This is a link with a 'foo' class.');

당신의 접근 방식을 바꿀 수도 있습니다. 나는 이것이 당신이하려는 일을하는 가장 효율적인 방법이라는 것을 알 수 없습니다.

1

먼저 switch 문은 int에 대해서만 작동합니다. 나는 왜 javascript가 C/C++에서이 한계를 지켰는지 잘 모르겠다.하지만 거기에있다.

스위치 대신 중첩 된 if-then-else 블록을 사용하면 몇 가지 옵션 이상을 처리하는 경우 코드를 읽을 수 없게 될 수 있습니다.

그러나 C 및 C++에서와 마찬가지로 해결 방법이 있으며 여기에는 goto와 같은 "break"를 사용하는 것이 포함되며 항상 악조건이 아닙니다. 이것은 goto가 코드를 더 효율적이고 읽기 쉽게 만드는 상황 (많은 양의 중첩 된 if-the-else 's)입니다. C/C++에서 if를 사용하여 이것을 구현할 수 있습니다 (if 스위치의 끝 부분에 라벨이 붙어 있음). 그리고 스위치 컨텍스트로 건너 뜁니다.

switch (1) { //yes, that is a hardcoded 1, we only want the switch block for the break keyword 
    if (yourString == "Case 1") { 
     do_stuff_1(); 
     break; // well, we're done, let's get out of here. 
    } 

//implicit else - if you matched the first one, you'd be out of here 

    if (yourString == "Case 2") { 
     do_stuff_2(); 
     break; // well, we're done, let's get out of here. 
    } 

    // etc..... 

    default: 
     do_error_condition(); 
} //end of switch 
0
(function($) { 
    $.fn.switchClasses = function(switches) { 
     return this.each(function() { 
      var that = this; 
      $.each(this.attr("class").split(' '), function(i, classname) { 
       var func = switches[classname]; 
       if(func){ 
        func.apply(that, classname); 
       } 
      }); 
     }); 
    }; 
})(jQuery); 

'클래스는' 예약 된 이름이며 나는 일부 누락 된 괄호