user1763812
user1763812

Reputation: 437

Highlight only one cell per row

My goal is to be able to highlight a cell when clicked and un-highlight when clicked again.

Each row can have only one cell highlighted.

Below is my attempted code and here is the fiddle.

Thanks.

HTML:

<div class="hws-css-filter" >
  <div class="hws-css-filter-tr">
    <div class="hws-css-filter-td"></div>
    <div class="hws-css-filter-td"></div>
    <div class="hws-css-filter-td"></div>
  </div>
  <div class="hws-css-filter-tr">
    <div class="hws-css-filter-td"></div>
    <div class="hws-css-filter-td"></div>
    <div class="hws-css-filter-td"></div>
  </div>
</div>

jQuery

$('.hws-css-filter-td').click(function () {
    var theTable = $(this).closest('.hws-css-filter-tr');
    $(theTable).each(function () {
        $(this).css("background-color", "");
    });
    $(this).css("background-color", "blue");
});

Upvotes: 1

Views: 305

Answers (4)

Ibrahim Khan
Ibrahim Khan

Reputation: 20750

Remove the background color of all siblings first like following.

$('.hws-css-filter-td').click(function() {
  $(this).siblings().css("background-color", "");
  $(this).css("background-color", "blue");
});
.hws-css-filter {
  display: table;
  margin: auto;
  vertical-align: middle;
}

.hws-css-filter-tr {
  display: table-row;
  padding: 0;
  margin: 0;
}

.hws-css-filter-td {
  display: table-cell;
  border: 1px solid #000;
  width: 15px;
  height: 15px;
  line-height: 15px;
  text-align: center;
  vertical-align: middle;
  padding: 0;
  margin: 0;
  font-family: monospace;
  font-size: 10px;
  text-transform: uppercase;
  cursor: pointer;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="hws-css-filter">
  <div class="hws-css-filter-tr">
    <div class="hws-css-filter-td"></div>
    <div class="hws-css-filter-td"></div>
    <div class="hws-css-filter-td"></div>
    <div class="hws-css-filter-td"></div>
    <div class="hws-css-filter-td"></div>
  </div>
  <div class="hws-css-filter-tr">
    <div class="hws-css-filter-td"></div>
    <div class="hws-css-filter-td"></div>
    <div class="hws-css-filter-td"></div>
    <div class="hws-css-filter-td"></div>
    <div class="hws-css-filter-td"></div>
  </div>
  <div class="hws-css-filter-tr">
    <div class="hws-css-filter-td"></div>
    <div class="hws-css-filter-td"></div>
    <div class="hws-css-filter-td"></div>
    <div class="hws-css-filter-td"></div>
    <div class="hws-css-filter-td"></div>
  </div>
</div>

UPDATE: To select unselected.

$('.hws-css-filter-td').click(function() {
  $(this).siblings().removeClass('selected');
  $(this).toggleClass('selected');
});
.hws-css-filter {
  display: table;
  margin: auto;
  vertical-align: middle;
}

.hws-css-filter-tr {
  display: table-row;
  padding: 0;
  margin: 0;
}

.hws-css-filter-td {
  display: table-cell;
  border: 1px solid #000;
  width: 15px;
  height: 15px;
  line-height: 15px;
  text-align: center;
  vertical-align: middle;
  padding: 0;
  margin: 0;
  font-family: monospace;
  font-size: 10px;
  text-transform: uppercase;
  cursor: pointer;
}

.selected {
  background-color: blue;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="hws-css-filter">
  <div class="hws-css-filter-tr">
    <div class="hws-css-filter-td"></div>
    <div class="hws-css-filter-td"></div>
    <div class="hws-css-filter-td"></div>
    <div class="hws-css-filter-td"></div>
    <div class="hws-css-filter-td"></div>
  </div>
  <div class="hws-css-filter-tr">
    <div class="hws-css-filter-td"></div>
    <div class="hws-css-filter-td"></div>
    <div class="hws-css-filter-td"></div>
    <div class="hws-css-filter-td"></div>
    <div class="hws-css-filter-td"></div>
  </div>
  <div class="hws-css-filter-tr">
    <div class="hws-css-filter-td"></div>
    <div class="hws-css-filter-td"></div>
    <div class="hws-css-filter-td"></div>
    <div class="hws-css-filter-td"></div>
    <div class="hws-css-filter-td"></div>
  </div>
</div>

UPDATED FIDDLE

Upvotes: 4

avck
avck

Reputation: 3693

Based on Figor's answer but also with toggling the highlighted cell https://jsfiddle.net/dwsL9z63/5/

   $('.hws-css-filter-td').click(function () {
      if($(this).hasClass("cell_highlight")){
        $(this).removeClass("cell_highlight");
      }
      else{
         $(this).addClass("cell_highlight");
      }

      $(this).siblings().removeClass("cell_highlight");

   });

Upvotes: 0

Travis
Travis

Reputation: 12379

This will satisfy all of your requests:

  1. Highlight on click
  2. Un-highlight if clicked again
  3. Only one highlighted cell allowed per row

$('.hws-css-filter-td').on('click', function() {
  var $this = $(this);
  
  if ($this.hasClass('blue-highlight')) {
    $this.removeClass('blue-highlight');
  } else {
    $this.addClass('blue-highlight');
    $this.siblings().removeClass('blue-highlight');
  }
});
.hws-css-filter-td {
  border: solid 1px #000;
  height: 25px;
  width: 25px;
  float: left;
}

.hws-css-filter-tr {
  clear: left;
}

.blue-highlight {
  background-color: blue;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="hws-css-filter" >
  <div class="hws-css-filter-tr">
    <div class="hws-css-filter-td"></div>
    <div class="hws-css-filter-td"></div>
    <div class="hws-css-filter-td"></div>
  </div>
  <div class="hws-css-filter-tr">
    <div class="hws-css-filter-td"></div>
    <div class="hws-css-filter-td"></div>
    <div class="hws-css-filter-td"></div>
  </div>
</div>

Upvotes: 0

F.Igor
F.Igor

Reputation: 4390

To better manage cell formatting, create a new style for highlighted cells

.cell_highlight{
    background-color: blue;
}

and set the jQuery event:

$('.hws-css-filter-td').click(function () {
    $(this).siblings().removeClass("cell_highlight"); 
    $(this).addClass("cell_highlight");
});

Upvotes: 1

Related Questions