2013-07-09 3 views
2

다른 컨텍스트에서 두 개의 클릭 기능이 있습니다. 하나는 jquery 동위 원소로 일부 요소를 필터링하고 다른 하나는 정렬되지 않은 목록으로 드롭 다운 기능을 모방합니다.두 개의 클릭 기능을 하나로 결합 했습니까?

드롭 다운이 작동하지만 두 번의 클릭 기능으로 인해 드롭 다운을 닫으려면 목록 항목을 두 번 클릭해야합니다.

누구나이 두 가지 클릭 기능을 하나의 기능으로 결합 할 수 있습니까?

나는 미리보기 좋은 작은 jsfiddle하고 스크립트를 가지고 :

$(function(){ 
    var $container = $('#container'), 
     filters = {}; 

    $container.isotope({ 
     itemSelector: '.item', 
     filter: '', 
     layoutMode: 'masonry', 
     animationEngine: 'css', 
     containerStyle: { 
      position: 'relative', 
      overflow: 'hidden' 
     }, 
     animationOptions: { 
      duration: 2500, 
      easing: 'linear', 
      queue: false 
     } 

    }); 

    ////////// first click function: filter links 

    $('.filter a').click(function(){ 
     var $this = $(this); 
     // don't proceed if already selected 
     if ($this.hasClass('selected')) { 
     return; 
     } 

     var $optionSet = $this.parents('.option-set'); 
     // change selected class 
     $optionSet.find('.selected').removeClass('selected'); 
     $this.addClass('selected'); 

     // store filter value in object 
     // i.e. filters.color = 'red' 
     var group = $optionSet.attr('data-filter-group'); 
     filters[ group ] = $this.attr('data-filter-value'); 

     // convert object into array 
     var isoFilters = []; 
     for (var prop in filters) { 
     isoFilters.push(filters[ prop ]) 
     } 
     var selector = isoFilters.join(''); 
     $container.isotope({ filter: selector }); 

     return false; 
    }); 



    ////////// Second Click function for faux Dropdown (replace span) 

    function DropDown(el) { 
       this.dd = el; 
       this.placeholder = this.dd.children('span'); 
       this.opts = this.dd.find('ul.dropdown > li'); 
       this.val = ''; 
       this.index = -1; 
       this.initEvents(); 
      } 
      DropDown.prototype = { 
       initEvents : function() { 
        var obj = this; 

        obj.dd.on('click', function(event){ 
         $(this).toggleClass('active'); 
         return false; 
        }); 

        obj.opts.on('click',function(){ 
         var opt = $(this); 
         obj.val = opt.text(); 
         obj.index = opt.index(); 
         obj.placeholder.text(obj.val); 
        }); 
       }, 
       getValue : function() { 
        return this.val; 
       }, 
       getIndex : function() { 
        return this.index; 
       } 
      } 

      $(function() { 

       var dd = new DropDown($('#dd')); 

       $(document).click(function() { 
        // all dropdowns 
        $('.wrapper-dropdown').removeClass('active'); 
       }); 

      }); 
}); 
+0

확실하지 않음 -> http://jsfiddle.net/QVFDv/2/합니다. ..? – adeneo

+2

false를 반환하면 다른 클릭 이벤트가 발생하지 않습니다. 거짓을 돌려주지 마라. –

+1

'return false; 대신'e.preventDefault()'를 시도하십시오 (클릭 함수 핸들러에'e' 매개 변수를 추가해야합니다) –

답변

2

당신은 당신의 $('.filter a').click() 이벤트 처리기에서 return false;을 제거해야합니다. (working jsFiddle)

다른 모든 코드의 실행을 차단합니다. 대신 .preventDefault()과 같은 것을 사용하는 것이 좋습니다 (jsFiddle을 포함하도록 업데이트했습니다).

+0

다른 ID로 여러 개의 드롭 다운을 사용하려면 어떻게해야합니까? 스크립트를 변경해야합니까? 지금은 단 하나의 ID (#dd) 만 사용됩니다. 배열에 여러 ID를 저장해야합니다. 맞습니까? – Alani

+0

문서 준비 처리기에서'var dd2 = new DropDown ($ ('otherID')); '을 추가하는 것이 좋습니다. –

+0

[업데이트 된 jsFiddle] (http://jsfiddle.net/QVFDv/7/) –

0

당신은 첫 번째 클릭 기능에 .active는 클래스를 전환 할 수 있습니다 : 당신이 일을하려고하는, 그것을 얻을

//... 
////////// first click function: filter links 
$('.filter a').click(function(){ 
    $('.wrapper-dropdown').toggleClass('active'); // Added this! 
    var $this = $(this); 
    // don't proceed if already selected 
    if ($this.hasClass('selected')) { 
    return; 
    } 
//... 
관련 문제