SkyKOG
SkyKOG

Reputation: 287

Custom styled checkbox not working properly

Currently I'm using multiple blocks of the following code as my custom styled checkbox:

  <div class="row-fluid">
    <div class="span12 card card-even">
      <div>
      <h3><label class="checkbox">
      <i class="icon-check-empty"></i>
      <input type="checkbox" value="1" />
    </label></h3>
      </div>
    </div>
  </div>

The JS:

jQuery.fn.extend({
  shinyCheckbox: function() {
    var setIcon;
    setIcon = function($el) {
      var checkbox, iclass;
      checkbox = $el.find("input[type=checkbox]");
      iclass = "";
      if (checkbox.is(":checked")) {
        iclass = "icon-ok";
      } else {
        iclass = "icon-check-empty";
      }
      return $el.find("i[class^=icon-]").removeClass("icon-check").removeClass("icon-check-empty").addClass(iclass);
    };
    this.find("input[type=checkbox]").change(function() {
      return setIcon($(this).parents("label.checkbox"));
    });
    return this.each(function(i, el) {
      return setIcon($(el));
    });
  }
});

$(document).ready(function() {
  return $("label.checkbox").shinyCheckbox();
});

Im able to achieve my requirement by styling the icon-check-empty & icon-check classes but when i click any checkbox only the first checkbox gets activated.

How can i use the this keyword to solve the issue such that the correct checkbox is activated?

Upvotes: 0

Views: 173

Answers (2)

Joe
Joe

Reputation: 15558

This is the way I'd do it, based on your code:

jQuery.fn.extend({
    shinyCheckbox: function () {
        var setIcon = function ($el) {
            var checkbox = $el.find("input[type=checkbox]"), checked = checkbox.is(':checked');
            checkbox.val(+checked);
            return $el.find("i[class^=icon-]").removeClass("icon-check-empty icon-ok").addClass(function () {
                return checked ? "icon-ok" : "icon-check-empty";
            });
        };
        this.find("input[type=checkbox]").on('change', function () {
            return setIcon($(this).closest("label.checkbox"));
        });
        return this.each(function (i, el) {
            return setIcon($(el));
        });
    }
});

$(document).ready(function () {
    $("label.checkbox").shinyCheckbox();
});

The main issue was that you weren't removing the icon-ok class, only the icon-check class. I also cleaned the code up a little.

Here it is working: http://jsfiddle.net/W88fk/1/

Upvotes: 2

Abraham Uribe
Abraham Uribe

Reputation: 3118

you can try

jQuery.fn.extend({
  shinyCheckbox: function() {
    return this.each(function() {
      var el=$(this),checkbox = el.find("input[type=checkbox]");
      checkbox.change(function() {
          var iclass = checkbox.is(":checked")?"icon-ok":"icon-check-empty";
          el.find("i[class^=icon-]").removeClass().addClass(iclass);
          var cval= checkbox.is(":checked")?0:1;
          checkbox.val(cval);
      });
});
}
});

$(document).ready(function() {
  $("label.checkbox").shinyCheckbox();
});    

toogle class and value http://jsfiddle.net/rWFMm/1/

Upvotes: 1

Related Questions