2012-01-25 2 views
2

이 코드는 어떻게 단축합니까? 각 CSS 선택기는 +1을 증가시킵니다. .mug (x)를 선택하지 않으면 모든 Bio의 div가 숨겨집니다.이 자바 스크립트 코드는 어떻게 단축 할 수 있습니까? 여러 div 표시 숨기기

감사

 <script type='text/javascript'> 
       $(document).ready(function() { 
        $(".mug1").click(function() { 
         $("#bios div").hide(); 
         $(".bio1").show();      
        });      
        $(".mug2").click(function() { 
         $("#bios div").hide(); 
         $(".bio2").show();      
        });      
        $(".mug3").click(function() { 
         $("#bios div").hide(); 
         $(".bio3").show();      
        });      

      }); 
     </script> 

     <h2>Meet the team</h2> 

     <div id="mugshots"> 
      <img src="images/img-mugshot.jpg" alt="mug" class="mug1"/> 
      <img src="images/img-mugshot.jpg" alt="mug" class="mug2"/> 
      <img src="images/img-mugshot.jpg" alt="mug" class="mug3"/> 
     </div> 

     <div id="bios"> 
      <div class="bio1"></div> 
          <div class="bio2"></div> 
          <div class="bio3"></div> 
        </div> 
+0

기본적으로 [jQuery UI Accordion] (http://jqueryui.com/demos/accordion/) – jrummell

답변

1

그냥 인덱스를 사용하고 원하는만큼 추가

$('#mugshots>img').on('click', function() { 
    $("#bios div").hide(); 
    var myIndex = $(this).index("#mugshots> img"); 
    $("#bios> div").eq(myIndex).show(); 
}); 

이의 짧은 버전은 다음과 같습니다

$('#mugshots>img').on('click', function() { 
    $("#bios div").hide().eq($(this).index("#mugshots> img")).show();; 
}); 
2

가장 간단한 방법은 for 루프

$(document).ready(function() { 
    for (var i = 1; i <= 3; i++) { 
    $(".mug" + i).click(function() { 
     $("#bios div").hide(); 
     $(".bio" + i).show(); 
    });      
    } 
}); 

내가 생각 아니에요 여전히 더 좋은 방법이있을 수있다.

+0

을 구현하고 있습니다. 클로저 문제를 피하기 위해 'i'를 다시 선언해야 할지도 모르겠지만 아마 가장 쉽습니다. 다른 방법은 자신의 클래스를 검사하고,'mugX'를 찾아서 그것으로부터'bioX' 클래스를 계산하는 단일 함수입니다. 예를 들어 'mugX'와'bioX' 클래스 이름을 동일하게 만들고, 그들을 구분하기 위해'div.mugshots .mugX'와'div.bios div.mugX'로 참조하십시오. – Rup

4

이 줄에 뭔가가 있습니까?

이에 HTML을 변경

:

<div id="bios"> 
     <div class="bio" data-id="1"></div> 
         <div class="bio" data-id="2"></div> 
         <div class="bio" data-id="3"></div> 
       </div> 

를 그런 다음 JS를 여기에 :

$(".mug").click(function() { 
        $("#bios div").hide(); 
        $(".bio[data-id='" + $(this).data("id") + "'", $("#bios")).show();      
       }); 

당신이없이 원하는만큼 머그컵과 바이오스를 추가 할 수 있습니다이 방법을 더 이상 js를 추가해야합니다.

+1

Html 요소 ID는 숫자로 시작할 수 없습니다. – Samich

+0

아, 그 생각은 내 마음을 교차 시켰습니다. – DavidGouge

+0

대신 데이터 속성을 사용하도록 편집되었습니다. 테스트하지는 않았지만 아이디어는 괜찮을 것입니다. ;) – DavidGouge

1

이 시도 :

$(document).ready(function() { 
    $("img[alt=mug]").each(function() { 
     $(this).click(function(){ 
      var id = $(this).attr("class").substr(3, 1); 
      $("#bios div").hide(); 
      $(".bio" + id).show(); 
     }); 
    }); 
}); 
+0

'rel = mug'에 대해 잘 모르겠습니다. 대신에'div.mugshots img'을 사용할 수 있습니다. – Rup

+0

그것은 rel과 함께 작동해야합니다. 그리고 당신이'div # mugshots img'를 의미한다고 생각합니다. –

+0

D' oh, 네,'class = mugshots'라고 읽었습니다.좋아요 - 이미지에는 rel 속성이 없지만 alt만이 그 이미지와 일치한다고 믿을 수 있습니다. 틀렸어요. – Rup

1

처음 수배 지금의 첫 번째 바이오, 두 번째 바이오와 두 번째 수배와 함께가는 가정하고 .EQ()와 mugshots의 인덱스를 사용합니다.

http://api.jquery.com/eq/

또한, 오히려 각 업데이트에 대한 모든 바이오스에서 숨기기를 호출하는 것보다 활성 바이오 추적하기 위해 클래스를 사용합니다.

JS :

$(document).ready(function() { 
    $('#mugshots img').click(function() { 
    $('#bios .active').hide().removeClass('active'); 
    $('#bios div').eq($(this).index()).show().addClass('active'); 
    }); 
}); 

HTML :

<h2>Meet the team</h2> 

    <div id="mugshots"> 
     <img src="images/img-mugshot.jpg" alt="mug"/> 
     <img src="images/img-mugshot.jpg" alt="mug"/> 
     <img src="images/img-mugshot.jpg" alt="mug"/> 
    </div> 

    <div id="bios"> 
     <div></div> 
     <div></div> 
     <div></div> 
    </div> 
관련 문제