2013-04-23 3 views
0

Я пытаюсь переключаться между div, чтобы при нажатии тега отображался div. Когда другой тег щелкнут, div заменит отображаемый div.JQuery Toggle Между несколькими divs

Это то, что я сделал.

HTML:

<a href="#" rel="#slidingDiv">a</a><br> 
<a href="#" rel="#slidingDiv_2">b</a><br> 
<a href="#" rel="#slidingDiv_3">c</a><br> 
<a href="#" rel="#slidingDiv_4">d</a><br> 

<div id="slidingDiv">a</div> 
<div id="slidingDiv_2">a</div> 
<div id="slidingDiv_3">a</div> 
<div id="slidingDiv_4">a</div> 

Jquery:

function ($) { 
$.fn.showHide = function (options) { 

    //default vars for the plugin 
    var defaults = { 
     speed: 1000, 
     easing: '', 
     changeText: 0, 
     showText: 'Show', 
     hideText: 'Hide' 

    }; 
    var options = $.extend(defaults, options); 

    $(this).click(function() { 

       var toggleDiv; 

       var $divA = $('#slidingDiv'), 
        $divB = $('#slidingDiv_2'), 
         $divC = $('#slidingDiv_3'), 
         $divD = $('#slidingDiv_4'), 
         $divE = $('#slidingDiv_5'), 
         $divF = $('#slidingDiv_6'), 
         $divG = $('#slidingDiv_7'), 
         $divH = $('#slidingDiv_8'), 
         $divI = $('#slidingDiv_9'); 

       if($divA.is(':visible')){ 
         $divA.hide(); 
      } 
       if($divB.is(':visible')){ 
         $divB.hide(); 
      } 
       if($divC.is(':visible')){ 
         $divC.hide(); 
      } 
       if($divD.is(':visible')){ 
         $divD.hide(); 
      } 
       if($divE.is(':visible')){ 
         $divE.hide(); 
      } 
       if($divF.is(':visible')){ 
         $divF.hide(); 
      } 
       if($divG.is(':visible')){ 
         $divG.hide(); 
      } 
       if($divH.is(':visible')){ 
         $divH.hide(); 
      } 
       if($divI.is(':visible')){ 
         $divI.hide(); 
      } 

       // this reads the rel attribute of the button to determine which div id to toggle 
       toggleDiv = $(this).attr('rel'); 


     $('.toggleDiv').slideUp(options.speed, options.easing); 

       // this var stores which button you've clicked 
     var toggleClick = $(this); 

      var toggleDiv = $(this).attr('rel'); 

       // here we toggle show/hide the correct div at the right speed and using which easing effect 
      $(toggleDiv).slideToggle(options.speed, options.easing, function() { 
      // this only fires once the animation is completed 
       // if(options.changeText==0){ 
       //$(toggleDiv).is(":visible") ? toggleClick.text(options.hideText) : toggleClick.text(options.showText); 
       //} 

      }); 

     return false; 

    }); 

}; 
})(jQuery); 

Это в настоящее время работает, но я знаю, что это может быть сделано лучше, вместо того, чтобы использовать, если заявление.

Благодаря

+0

Вы также можете избавиться от всех пронумерованных идентификаторов и использовать индекс элемента + общий класс. Этот вопрос лучше подходит для http://codereview.stackexchange.com –

+0

Используйте классы! Сэкономьте массу времени! http://stackoverflow.com/questions/2951556/show-hide-divs-with-same-class-jquery – tymeJV

+0

Это моя точка ... Я хочу избавиться от операторов if. Я знаю, что есть лучший способ сделать это. Я искал через jsfiddle и нашел это: http://jsfiddle.net/karalamalar/62NPt/4/ Но для меня это не работает – Mark

ответ

3

Здесь мы идем: http://jsfiddle.net/fqK36/5/

Ваша целая функция становится:

$.fn.showHide = function (options) { 

    //default vars for the plugin 
    var defaults = { 
     speed: 1000, 
     easing: '', 
     changeText: 0, 
     showText: 'Show', 
     hideText: 'Hide', 
     slideDiv: '.slide-div' 
    }; 
    var options = $.extend(defaults, options); 

    return this.each(function() { 
     $(this).click(function() { 
      $(options.slideDiv).hide(); 
      // this var stores which button you've clicked 
      var toggleClick = $(this), 
       toggleDiv = $(this).data('slide-id'); 
      // here we toggle show/hide the correct div at the right speed and using which easing effect 
      $(toggleDiv).slideToggle(options.speed, options.easing, function() { 
       // this only fires once the animation is completed 
       // if(options.changeText==0){ 
       //$(toggleDiv).is(":visible") ? toggleClick.text(options.hideText) : toggleClick.text(options.showText); 
       //} 

      }); 


     }); 

    }); 

}; 

Затем вы можете использовать его как это:

$('a').showHide({'slideDiv' : '.slide-div'}); 

Опция slideDiv может быть пользовательский селектор, который вы используете, может делиться с вами.

Все слайды назначаются классу, что означает, что вы можете скрыть их все сразу. Затем вы можете показать целевое div, получив атрибут data-slide-id щелкнутой ссылки.

+0

Не работает. Должно быть, я сделал что-то не так. Они приближаются друг к другу. – Mark

+0

Убедитесь, что вы смотрите ссылку jsfiddle и обновляете свой html, чтобы он выглядел как мой. – Joe

+1

@Joe Вероятно, вы должны убедиться, что ручки плагина применяются к нескольким наборам элементов. Как бы то ни было, это немного бесполезно, как плагин, потому что его можно использовать только один раз. Вы можете поместить атрибут 'data-slide-group' в divs и передать это имя группы в качестве опции плагина. – plalx

0

Как правило, я делаю это, создавая класс hidden. Когда вы идете, чтобы перейти на новый DIV, вы можете сделать что-то вроде этого:

$(this).click(function(){ 
    $(this).removeClass('hidden') 

    $('div:not(#' + $(this).attr('id') + ')').addClass('hidden') 
}); 

Это использует селектор not, чтобы найти все, кроме текущего пункта. Без анимации это простой способ сделать это. Вы также можете захватить все, что не скрыто, используя $('div:not(.hidden)'), а затем запустите свой переключатель на все в этом селекторе.

$(this).click(function(){ 

    if($(this).hasClass('hidden'){ 
     $(this).show() 

     $(this).removeClass('hidden') 
    } 

    $('div:not(#' + $(this).attr('id') + ') :not(.hidden.)') 
     .hide().addClass('hidden') 
}); 

Может помочь немного почистить вещи.

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