2012-01-30 3 views
0

그래서 내 사이트에서 다시 사용할 수있는 jQuery 탭 플러그인을 작성하고 있습니다. 여기특정 컨테이너 만 타겟팅하는 사용자 정의 jQuery 플러그인

<div class="js-tabs"> 
    <div id="top-text">Top 10 Best</div> 

    <ul class="top-side-tabs"> 
     <li id="selected"> 
      <a id="day" data-url="/top/day">Today</a> 
     </li> 
     <li> 
      <a id="week" data-url="/top/week">Week</a> 
     </li> 
     <li><a id="month" data-url="/top/month">Month</a> 
     </li> 
     <li> 
      <a id="year" data-url="/top/year">Year</a> 
     </li> 
    </ul> 
    <div id="top-text"> 
     <div class="js-tabs-container"> 
      <div class="loading">Loading...</div> 
     </div> 
    </div> 
</div> 

플러그인 자체입니다 :

(function($) { 
var tabs = {   
    fn: function(params) { 
     return this.each(function() { 
      $thisContainer = $(this); 
      $contentContainer = $thisContainer.find('.js-tabs-container').first(); 
      var $thisUl = $thisContainer.find('ul').first(); 
      var $thisLi = $thisUl.children('li'); 

      var tabs = []; 
      var tabUrls = []; 

      $thisLi.each(function() { 
       $links = $(this).children('a').attr('id'); 
       tabs.push($links); 

      }); 

      // Display first url in the container when page first loads 
      var firstTabUrl = $thisUl.find('li > a').first().data('url'); 
      //console.log(firstTabUrl); 
      $.ajax({ 
       url: firstTabUrl, 
       cache: false, 
       success: function(content) { 
        $contentContainer.empty().append(content).hide().fadeIn(500); 
        $('.loading').hide(); 
       } 
      }); 

      // Add click event handler for each tab 
      for (var i = 0; i < tabs.length; i++) { 
       var id = i; 
       $('#' + tabs[i]).bind('click', (function(id) { 
        return function() { 
         // Grab tab's url from data attribute 
         var tabUrl = $(this).data('url'); 
         // Find the js-tabs-container 
         // This is what we're changing 
         if (tabs.length) { 
          $('.loading').show(); 
          $.ajax({ 
           url: tabUrl, 
           cache: false, 
           success: function(content) { 
            $contentContainer.empty().append(content).hide().fadeIn(500); 
            $('.loading').hide(); 
           } 
          }); 
         } 
        }; 
       })(id)); 
      } 

     }); 
    } 
} 
    $.fn.tabs = tabs.fn 
})(jQuery); 

$(window).load(function() { 
    $('.js-tabs').tabs(); 
}); 

내가 HTML 코드를 한 번 이상, 나는 그것을 기대 복사 할 경우, 몇 가지 독특한 DIV ID를 사용하고 있다는 사실을 무시 아래는 HTML입니다 다른 하나와 독립적으로 일할 수 있습니다. 무슨 일이 일어나고 무엇

은 다음과 같습니다

A)

Top 10 Best | Today | Week | Month | Year 
[.js-tabs-container] 

B)는

Top 10 Best | Today | Week | Month | Year 
[.js-tabs-container] 

내가 위, B의 내용은 다시 채워됩니다 A에서 "주"를 클릭 말. .each()가 여러 번 반복되는 것처럼 보입니다 (두 번 페이드 인/페이드 아웃 됨). 그 중에서도 B 내의 옵션을 클릭하면 간단히 작동하지 않습니다.

모든 플러그인을 고유 한 네임 스페이스에 유지하기 위해이 스타일의 플러그인 개발 방법이 생소하므로 전공 과목을 간과 할 수 있으므로 도움이 될 것입니다.

또한이 문제를 다시 해결하는 방법에 대한 조언은 크게 감사하겠습니다.

+0

을 경우는, 일반적으로 선택 엔진에 문제를 일으키는 것으로 알려진 마크 업, 두 번 (위 텍스트)를 동일한 ID를 사용하여 $ (이) 중 하나를 나타냅니다 플러그인이 두 번째 div에 액세스하지 못하게 할 수 있습니다. ID는 고유해야합니다 – Semyazas

+0

@Semyazas 예, 방금 예를 들어 설명했습니다. $ thisContainer와 $ contentContainer에 대해 var를 사용하지 않았다는 것을 알았습니다. 왜 그렇게했는지 모르겠습니다. 이제는 내가 가지고 있었던 문제를 해결했지만 : D –

답변

0

$ thisContainer 및 $ contentContainer의 접두사로 var을 사용하지 않았습니다. 지금은 잘 작동합니다 :

(function($) { 
var tabs = { 
    fn: function(params) { 
     return this.each(function() { 
      var $thisContainer = $(this); 
      var $contentContainer = $thisContainer.find('.js-tabs-container').first(); 
      var $thisUl = $thisContainer.find('ul').first(); 
      var $thisLi = $thisUl.children('li'); 

      var tabs = []; 

      $thisLi.each(function() { 
       $links = $(this).children('a').attr('id'); 
       tabs.push($links); 

      }); 

      // Display first url in the container when page first loads 
      var firstTabUrl = $thisUl.find('li > a').first().data('url'); 

      $.ajax({ 
       url: firstTabUrl, 
       cache: false, 
       success: function(content) { 
        $contentContainer.empty().append(content).hide().fadeIn(500); 
        $('.loading').hide(); 
       } 
      }); 

      // Add click event handler for each tab 
      for (var i = 0; i < tabs.length; i++) { 
       var id = i; 
       $('#' + tabs[i]).bind('click', (function(id) { 
        return function() { 
         // Grab tab's url from data attribute 
         var tabUrl = $(this).data('url'); 
         // Find the js-tabs-container 
         // This is what we're changing 
         if (tabs.length) { 
          $('.loading').show(); 
          $.ajax({ 
           url: tabUrl, 
           cache: false, 
           success: function(content) { 
            $contentContainer.empty().append(content).hide().fadeIn(500); 
            $('.loading').hide(); 
           } 
          }); 
         } 
        }; 
       })(id)); 
      } 

     }); 
    } 
} 
$.fn.tabs = tabs.fn 
})(jQuery); 

$(window).load(function() { 
    $('.js-tabs').tabs(); 
}); 
관련 문제