chridam
chridam

Reputation: 103335

Clickable img wrapped in label not working in IE8

I have the following markup and Javascript:

JSFiddle

HTML:

<form method="get" action="some-url-here">
 <div class="UserFilter">
  <ul class="UserFilter">
   <li>
      <label class="Selected" for="1">
          <input id="1" type="radio" value="1" name="Profile" />
          <img title="User 1" alt="User 1" src="img-url-here" style="width: 50px;height: 50px" />
          User 1
      </label>
   </li>
   <li>
      <label class="Selected" for="2">
          <input id="2" type="radio" value="2" name="Profile" />
          <img title="User 2" alt="User 2" src="img-url-here" style="width: 50px;height: 50px" />
          User 2
      </label>
   </li>
  </ul>
 </div>
</form>

JavaScript:

var labelID;
$("label img").live("click", function() {
        labelID = $(this).parent().attr('for');
        $('#'+labelID).trigger('click');        
});

$('ul.UserFilter input').click(function () {
        $('ul.UserFilter input:not(:checked)').parent().removeClass("Selected");
        $('ul.UserFilter input:checked').parent().addClass("Selected");
        //$(this).closest("form").submit();     
});

$('input:checked').parent().addClass("Selected");

CSS:

div.UserFilter {
    background: none repeat scroll 0 0 #EAE5DA;
    border-bottom: 1px solid #F1EEE6;
    border-top: 3px solid #0888A5;
    box-shadow: 0 5px 10px #F1F1F1;
}
div.UserFilter ul {
    display: inline-block;
}
ol, ul {
    list-style: none outside none;
}
div.UserFilter ul li label.Selected {
    background: none repeat scroll 0 0 #0888A5;
    border: 1px solid #16758B;
    color: #FFFFFF;
    text-shadow: 0 1px 0 #16758B;
}
div.UserFilter ul li label.Selected {
    background: none repeat scroll 0 0 #688ABD;
    border: 1px solid #688ABD;
    color: #FFFFFF;
    cursor: pointer;
    text-shadow: 0 1px 0 #52688A;
    transition: border-color 0.218s ease 0s;
}
div.UserFilter ul li label {
    background: none repeat scroll 0 0 #FFFFFF;
    border: 1px solid #CCCCCC;
    border-radius: 2px 2px 2px 2px;
    display: inline-block;
    letter-spacing: normal;
    padding: 0 5.666px 0 0;
    transition: background 0.218s ease 0s;
    word-spacing: normal;
}

Clicking on the text works just fine in selecting the radio button associated with it (tested in Firefox, Chrome and IE9+). However, in IE8-, clicking the image does not select or fire the click event of the radio button. Any ideas, workaround solutions, or suggestions are most welcomed.

Upvotes: 0

Views: 2874

Answers (1)

Andreas Schwarz
Andreas Schwarz

Reputation: 1798

I like Brad's solution to use a <span> with a background image. This way you get rid of the problem without having to use JavaScript.

Your HTML code becomes:

<form method="get" action="some-url-here">
 <div class="UserFilter">
  <ul class="UserFilter">
   <li>
      <label class="Selected" for="1">
          <input id="1" type="radio" value="1" name="Profile" />
          <span title="User 1" style="background-image: url('img-url-here')width: 50px;height: 50px;display: inline-block;"></span>
          User 1
      </label>
   </li>
   <li>
      <label class="Selected" for="2">
          <input id="2" type="radio" value="2" name="Profile" />
          <span title="User 2" style="background-image: url('img-url-here')width: 50px;height: 50px;display: inline-block;"></span>
          User 2
      </label>
   </li>
  </ul>
 </div>
</form>

The JavaScript gets much smaller. You can also remove the $('input:checked').parent().addClass("Selected"); line, since you set the Selected class to your labels in the HTML code:

$('ul.UserFilter input').click(function () {
        $('ul.UserFilter input:not(:checked)').parent().removeClass("Selected");
        $('ul.UserFilter input:checked').parent().addClass("Selected");
        //$(this).closest("form").submit();     
});

The CSS stays the same, except you can remove one of the div.UserFilter ul li label.Selected selector.

An updated jsFiddle: http://jsfiddle.net/ft4Hb/1/

Upvotes: 2

Related Questions