Convert dropdowns to radio buttons w/o modifying HTML

前端 未结 2 1129
有刺的猬
有刺的猬 2020-12-29 15:42

So this is sort of an exceptional case situation - I have a plugin that I can\'t modify for contractual reasons. It displays a set of drop downs and I need it to display a s

相关标签:
2条回答
  • 2020-12-29 16:09

    Hide the dropdown and place the new radio elements outside the form, they don't need to post, just update the dropdown value.

    Here is a code example on jsFiddle.

    $("#d option").each(function(i, e) { // get the options
        $("<input type='radio' name='r' />") // create a radio element
            .attr("value", $(this).val()) // set the value
            .attr("checked", i == 0) // check the first by default
            .click(function () { // add event click which updates the dropdown
                $("#d").val($(this).val()); // update the dropdown if clicked
            })
            .appendTo("#r"); // append to some visible place
    });
    
    0 讨论(0)
  • 2020-12-29 16:12

    To encapsulate this into a declarative attribute, I extended @BrunoLM 's function to style all <select>'s with a given CSS class into the radio button look.

    jsFiddle

    HTML

    <select class="radioSelect" id="sizeOptions">
        <option value="S">S</option>
        <option value="M">M</option>
        <option value="L">L</option>
        <option value="XL">XL</option>
        <option value="2XL">2XL</option>
        <option value="3XL">3XL</option>
        <option value="4XL">4XL</option>
        <option value="5XL">5XL</option>
    </select>
    

    Result

    enter image description here

    CSS

    /* http://jsfiddle.net/496c9/ */
    .radioSelectContainer > select {
      display: none;
    }
    
    .radioSelectContainer > label {
      display: inline-block;
      margin: 0.3em 0.3em 0 0;
      background-color: #EFEFEF;
      border-radius: 4px;
      border: 1px solid #D0D0D0;
    }
    
      .radioSelectContainer > label > span {
        padding: 0.2em;
        text-align: center;
        display: block;
        white-space: nowrap;
      }
    
      .radioSelectContainer > label > input {
        position: absolute;
        top: -20px;
      }
    
        .radioSelectContainer > label > input:checked + span {
          background-color: #404040;
          color: #F7F7F7;
        }
    

    JS

    // http://stackoverflow.com/questions/3975331/update-drop-down-selection-with-radio-button-selection-using-jquery
    // http://jsfiddle.net/ChinmayeeG/TkGP8/
    $(function () {
    
      $('.radioSelect').each(function (selectIndex, selectElement) {
    
        var select = $(selectElement);
        var container = $("<div class='radioSelectContainer' />");
        select.after(container);
        container.append(select);
    
        select.find('option').each(function (optionIndex, optionElement) {
          var radioGroup = select.attr('id') + "Group";
          var label = $("<label />");
          container.append(label);
    
          $("<input type='radio' name='" + radioGroup + "' />")
              .attr("value", $(this).val())
              //.click((function () { select.val($(this).val()); })) //radio updates select - see optional below
              .appendTo(label);
    
          $("<span>" + $(this).val() + "</span>").appendTo(label);
        });
    
        //http://stackoverflow.com/questions/4957207/how-to-check-uncheck-radio-button-on-click
        //optional - this logic handles unchecking when clicking on an already checked radio
        container.find(":radio + span").mousedown(
          function (e) {
            var $span = $(this);
            var $radio = $span.prev();
            if ($radio.is(':checked')) {
              var uncheck = function() {
                setTimeout(function () { $radio.prop('checked', false); }, 0);
              };
              var unbind = function() {
                $span.unbind('mouseup', up);
              };
              var up = function() {
                uncheck();
                unbind();
              };
              $span.bind('mouseup', up);
              $span.one('mouseout', unbind);
            } else {
              select.val($radio.val());
            }
          }
        );
    
        select.change((function () { //select updates radio
          $("input[name='" + select.attr('id') + "Group" + "'][value='" + this.value + "']").prop("checked", true);
        }));
      });
    });
    
    0 讨论(0)
提交回复
热议问题