Javascript Toggling - PullRequest
       15

Javascript Toggling

0 голосов
/ 04 декабря 2009

Я пытаюсь получить эффект переключения, но не совсем уверен, как это сделать или что искать. (Я загрузил Jave JQuery).

предполагается, что HTML похож на

<table class="left-dates">
    <tr><td>All Dates</td></tr>
    <tr><td>01 dec 2009</td></tr>
    <tr><td>02 dec 2009</td></tr>   
    <tr><td>03 dec 2009</td></tr>   
    <tr><td>04 dec 2009</td></tr>   
</table>

<div class="box 01-dec-2009">
    foo
</div>

<div class="box 03-dec 2009">
    bar
</div>

<div class="box 04-dec-2009">
    foobar
</div>

Шаги для принятия

  1. Отображаются все div
  2. Нажатие на td для даты скроет все, кроме div с классом дня, на который нажали
  3. клик «Все даты» покажет все снова

Есть идеи, как мне добиться этого чисто? в идеале, используя JQuery.

Ответы [ 3 ]

1 голос
/ 04 декабря 2009

Я бы попробовал это так:

var $boxes = $('div.box');

$('.left-dates td:gt(0)').click(function(e){
   var class = this.innerHTML.replace(/ /g, '-'); // Convert text to class
   $boxes.filter(':visible').not('.' + class).hide(); // All visible div.box that don't have the class we are going to show.
   $boxes.filter('.' + class).show(); // Show this class
});
$('.left-dates td:first').click(function(e){
   $boxes.show();
});

РЕДАКТИРОВАТЬ: Я поменял .click() на .live('click'). Если бы была тонна строк, лучше использовать .live() вместо привязки события click() к каждому td

Кроме того, HTML-код, который вы разместили, содержит ошибку. В 03 div отсутствует дефис до 2009

0 голосов
/ 04 декабря 2009

Определите ваш <td>All Dates</td> однозначно. Присвойте тот же класс или какой-либо другой идентификатор всей вашей дате <td>s. Дайте им обработчик кликов, который скрывает все элементы .box, за исключением одного с той же датой. В вашем примере вы не согласны с тем, чтобы сделать дату в <td> такой же, как имя класса даты в ваших div-элементах, которое вам понадобится для того, что я сделаю.

<table class="left-dates">
    <tr><td id="alldates">All Dates</td></tr>
    <tr><td id="date">01 dec 2009</td></tr>
    <tr><td id="date">02 dec 2009</td></tr>       
    <tr><td id="date">03 dec 2009</td></tr>       
    <tr><td id="date">04 dec 2009</td></tr>       
</table>

// unhide all box elements
$("#alldates").click(function(e){ $(".box").show(); });

// For each date <td> element
$("#date").each(function(){
   // assign a click event
   $(this).click(function(e){
      // when the user clicks, get the
      // <td>'s text contents
      var myval = $(this).text();
      // and grab each element with the
      // 'box' css class
      $(".box").each(function(){
         // for each of these 'box' elements,
         // if it has a class matching the date
         // they selected, return
         if($(this).has(myval))
         {
            return;
         }
         else
         {
            // otherwise, hide itself
            $(this).hide();
         }
      });
   });
});
0 голосов
/ 04 декабря 2009

Вот рабочий пример с jQuery.

Обратите внимание, что мне пришлось изменить ваши классы div и td метки, чтобы удалить пробелы, чтобы метки были эквивалентны именам классов. Если вы не хотите, чтобы в метках были тире, вы можете выполнить строковые манипуляции в Javascript, чтобы удалить пробелы или дать td s то же имя класса, что и их соответствующий div, а затем посмотреть на имя класса нажатой td вместо его внутренний текст.

<html>
<head>
    <title>jQuery hiding example</title>

    <script type='text/javascript' src='http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js'></script>

    <script type='text/javascript'>
        $(document).ready(function(){
            $('td').click(function() {
                var target = $(this).text();
                if (target == 'All Dates') {
                    $('div.box').show();
                } else {
                    $('div.box').hide();
                    $('div.' + target).show();
                }
            });
        });
    </script>
</head>
<body>
    <table class="left-dates">
        <tr><td>All Dates</td></tr>
        <tr><td>01-dec-2009</td></tr>
        <tr><td>02-dec-2009</td></tr>       
        <tr><td>03-dec-2009</td></tr>       
        <tr><td>04-dec-2009</td></tr>       
    </table>

    <div class="box 01-dec-2009">
        foo
    </div>

    <div class="box 03-dec-2009">
        bar
    </div>

    <div class="box 04-dec-2009">
        foobar
    </div>
</body>
</html>
...