Javascript Makeln
-
12-09-2019 - |
Frage
Ich versuche, einen Toggle-Effekt zu erhalten, aber nicht ganz sicher, wie es zu tun oder etwas zu suchen. (I Jave Jquery geladen).
annehmen html ähnlich wie
<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>
Schritte zu ergreifen,
- Alle divs gezeigt werden
- für ein Datum auf einer td Ein Klick auf alle, aber die div mit der Klasse des Tages verstecken geklickt haben
- „Alle Termine“ klicken alles zeigen wird wieder
eine Idee, wie ich das sauber achive könnte? idealerweise mit JQuery.
Lösung
Hier ist ein funktionierendes Beispiel mit jQuery.
Beachten Sie, dass ich auf Ihre div Klassen und td
Etiketten ändern Leerzeichen zu entfernen, so dass die Etiketten auf den Klassennamen entsprechen würde. Wenn Sie keine Bindestriche in den Etikett wollten konnte man String-Manipulation in Javascript tut white-space zu entfernen oder den td
s den gleichen Klassennamen wie ihre entsprechenden div geben und dann auf dem Namen der Klasse des angeklickten td
aussehen, anstatt sein innerer Text.
<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>
Andere Tipps
Ich würde versuchen, es so aus:
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();
});
EDIT: Ich tauschte .click()
in für .live('click')
. Wenn es eine Tonne Reihen sein würde, könnte es besser sein .live()
zu verwenden, anstatt ein click()
Ereignisses zu jedem td
der Bindung
Auch die HTML Sie auf dem Laufenden hat einen Fehler. Die 03
div ist ein Bindestrich vor dem 2009
fehlt
Identifizieren Sie Ihre <td>All Dates</td>
eindeutig. Ordnen Sie die gleiche Klasse oder eine andere Kennung auf all Ihren Daten <td>s
. Geben Sie ihnen einen Click-Handler, der alle .box Elemente mit Ausnahme der mit dem gleichen Datum verbirgt. In Ihrem Beispiel sind Sie mit macht das Datum im <td>
der gleichen wie der Klassenname des Datums in Ihrem divs nicht konsistent, die Sie brauchen, was ich tun werde.
<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();
}
});
});
});