Связывание радиокнопок и ввода текста

Я пытаюсь связать радио-вход с указанным вводом текста. Как видно на картинке, есть два варианта. Я знаю, что могу использовать for="", чтобы связать метку с радио-вводом, но как я могу также связать ее с текстовым вводом внизу, и наоборот, поэтому, когда я фокусируюсь на текстовом вводе, если фокусируется правильный переключатель?

Радио и ввод текста

ПРИМЕЧАНИЕ. Введенная сумма будет вставлена ​​в базу данных, так что это самая важная часть этой формы. В настоящее время, если я нажму на $ Off, я все еще могу ввести число в % Off. Я не хочу, чтобы это произошло, чтобы пользователь не запутался.

Моя разметка:

<div class="row-fluid control-group">
  <div class="span7 pull-left">
    <label class="radio" for="discount-dollars">
      <input type="radio" name="discount" id="discount-dollars" value="dollars" checked="checked">
      &#36; Off
    </label>
    <div class="input-append">
      <input type="text" name="discount-dollars-amount" id="discount-dollars-amount" class="input-small dollars" placeholder="enter amount">
      <span class="add-on">.00</span>
    </div>
  </div><!-- .span7 .pull-left -->

  <div class="span5">
    <label class="radio" for="discount-percent">
      <input type="radio" name="discount" id="discount-percent" value="percent">
      &#37; Off
    </label>
    <input type="text" name="discount-percent-amount" id="discount-percent-amount" class="input-small percent" placeholder="enter amount" disabled="disabled">
  </div>
</div><!-- .row-fluid .control-group -->

<script type="text/javascript">

$(function (){
  $("form input[type=radio]").click(function (){

  // get the value of this radio button ("dollars" or "percent")
  var value = $(this).val();

  // find all text fields...
  $(this).closest("form").find("input[type=text]")

    // ...and disable them...
    .attr("disabled", "disabled")                     

  // ...then find the text field whose class name matches
  // the value of this radio button ("dollars" or "percent")...
  .end().find("." + value)

    // ...and enable that text field
    .removeAttr("disabled")          
  .end();
  });
});

</script>

person chris_s    schedule 09.02.2012    source источник
comment
Что это за язык/технология? Я знаю, что это по крайней мере связано с HTML, но есть ли другие вовлеченные?   -  person Zenexer    schedule 09.02.2012
comment
Я думаю, что jQuery - хорошее решение, просто я пока не силен в создании функций.   -  person chris_s    schedule 09.02.2012


Ответы (5)


Вы не можете использовать один элемент <label> для обозначения двух отдельных входов. Я бы предложил связать метки с переключателями, поскольку переключатель является такой маленькой целью щелчка, а метка расширяет эту цель.

Выберите одно из радио, которое будет выбрано по умолчанию, возможно, «$ Off». Отключите другое текстовое поле по умолчанию:

<div class="row-fluid control-group">
  <div class="span7 pull-left">
    <label class="radio" for="discount-dollars">
      <input type="radio" name="discount" id="discount-dollars" value="dollars" checked="checked">
      &#36; Off
    </label>
    <div class="input-append">
      <input type="text" name="discount-dollars-amount" id="discount-dollars-amount" class="input-small dollars" placeholder="enter amount">
      <span class="add-on">.00</span>
    </div>
  </div><!-- .span7 .pull-left -->

  <div class="span5">
    <label class="radio" for="discount-percent">
      <input type="radio" name="discount" id="discount-percent" value="percent">
      &#37; Off
    </label>
    <input type="text" name="discount-percent-amount" id="discount-percent-amount" class="input-small percent" placeholder="enter amount" disabled="disabled">
  </div>
</div><!-- .row-fluid .control-group -->

Затем используйте jQuery, чтобы сделать что-то вроде этого:

$(function (){
  $("#discount-dollars, #discount-percent").click(function (){

    // get the value of this radio button ("dollars" or "percent")
    var value = $(this).val();

    // find all text fields...
    $(this).closest(".control-group").find("input[type=text]")

      // ...and disable them...
      .attr("disabled", "disabled")                     

    // ...then find the text field whose class name matches
    // the value of this radio button ("dollars" or "percent")...
    .end().find("." + value)

      // ...and enable that text field
      .removeAttr("disabled")          
    .end();
  });
});

По сути, это прослушивает click события на обоих переключателях. Когда вы щелкаете один переключатель, он включает связанное с ним текстовое поле (т. е. текстовое поле с именем класса CSS, совпадающим со значением переключателя) и отключает другое текстовое поле. Таким образом, вы не сможете ввести текст ни в одно из текстовых полей, пока не будет установлен соответствующий переключатель.

person Brandan    schedule 09.02.2012
comment
Но ОП упомянул, что они хотят этого в обоих направлениях. Если щелкнуть текстовое поле, оно также выберет переключатель. - person Ascalonian; 09.02.2012
comment
@Ascalonian Ой. Я пропустил это изначально. Но я чувствую, что это делает пользовательский интерфейс излишне сложным. Что произойдет, если я введу что-то в оба текстовых поля? Какая радиокнопка проверяется тогда? Что, если я наберу что-нибудь в текстовом поле $ Off, но поставлю галочку напротив переключателя % Off? Эта форма становится намного более подверженной ошибкам. - person Brandan; 10.02.2012
comment
Это именно то, что я ищу, но не могу заставить его работать. Я отредактировал свой оригинальный пост с моей разметкой. - person chris_s; 10.02.2012
comment
в настоящее время происходит то, что отключенное радио остается отключенным, а ввод текста под ним все еще доступен. - person chris_s; 10.02.2012
comment
Вы отключили переключатель, а не текстовое поле. Мой код не пытается включать и отключать переключатели, а только текстовые поля. - person Brandan; 10.02.2012
comment
@Brandan извините за эту ошибку. Глаза были скрещены. Поменял отключенный на ввод текста. Однако текстовые поля не меняют отключенное состояние, когда я переключаюсь между радиостанциями. Я вырезал и вставил ваш jQuery. - person chris_s; 10.02.2012
comment
Если вы используете мой jQuery, вам нужно будет добавить соответствующие имена классов CSS (доллары или проценты) к текстовым вводам. Вот как я определяю, какое текстовое поле соответствует радио. Я добавил несколько комментариев к своему коду. Это проясняет ситуацию? - person Brandan; 10.02.2012
comment
@Brandan Ну, это не сработало, как я думал. Я обновил свой код выше. Прошу прощения за нубизм. Почему это не работает для меня? - person chris_s; 13.02.2012
comment
Мой скрипт работал с вашей разметкой, если я обернул ее в элемент <form>. Вы используете <form>? Я предполагаю, что вы должны быть, если вы отправляете эти данные на сервер. - person Brandan; 14.02.2012
comment
Да, он упакован в div <form> и <fieldset> вместе с другими входными данными. Не только те радио и текстовые вводы. Никакие другие входные данные не имеют значений, имен или классов, которые есть у них. Вот код. pastebin.com/9PfjefgL - person chris_s; 14.02.2012
comment
Я обновил свой ответ, чтобы он соответствовал вашей разметке. По сути, вам просто нужно быть более конкретным в ваших селекторах. Я использовал идентификаторы переключателей и имя класса .control-group, и, похоже, это сработало. - person Brandan; 15.02.2012

используйте радиокнопку изображения с двумя состояниями: выбрано и не выбрано, когда вы нажимаете радиоизображение, просто установите фокус на текстовое поле и переключитесь на выбранное вами радиоизображение, и наоборот.

person martti d    schedule 09.02.2012

Вы не можете сосредоточиться на двух элементах, это будет либо текстовое поле ввода, либо переключатель. Но вы должны использовать JavaScript или jQuery, когда вы нажимаете переключатель, чтобы сфокусироваться на поле ниже, или когда вы вводите значение в поле ниже, чтобы проверить переключатель выше.

Это может помочь вам, если вы хотите использовать jquery: http://api.jquery.com/val/ и http://api.jquery.com/focus/

person Boris    schedule 09.02.2012

Это ОЧЕНЬ грубый набросок, чтобы помочь вам, но вы можете сделать что-то вроде этого (при соблюдении определенного соглашения об именах):

<input type="radio" name="rGroup" id="radioDollarOff" onclick="changeMe(this);"/> &nbsp; <input type="text" name="textDollarOff" id="textDollarOff" onclick="changeMe(this);"/>
<br />
<input type="radio" name="rGroup" id="radioPctOff" onclick="changeMe(this);"/> &nbsp; <input type="text" name="textPctOff" id="textPctOff" onclick="changeMe(this);"/>

<script>
    function changeMe(inField) {
        var fieldId = inField.id;
        var type = fieldId.substring(0, 4);

        if(type == 'text') {
            var name = fieldId.substring(4);
            var radioButton = document.getElementById("radio" + name);
            radioButton.checked = true;
        }else {
            var name = fieldId.substring(5);
            var textField = document.getElementById("text" + name);
            textField.focus();
        }
    }
</script>
person Ascalonian    schedule 09.02.2012

jQuery — это то, что вам нужно. Предполагая, что ваши элементы имели следующие идентификаторы:

  • $ радиокнопка: деньги-радио
  • Текстовое поле $: деньги-текст
  • % радиокнопка: процент-радио
  • % текстовое поле: процентный текст

... код может выглядеть примерно так. Это позаботится об отключении текстовых полей и правильной фокусировке ввода.

<form>
    <table>
        <tr>
            <td>
                <input type="radio" id="money-radio" name="unit" value="money" />
                <label for="money-radio">$ Off</label>
            </td>
            <td>
                <input type="radio" id="percent-radio" name="unit" value="percent" />
                <label for="percent-radio">% Off</label>
            </td>
        </tr>
        <tr>
            <td>
                <input type="text" id="money-text" name="money-off" />
            </td>
            <td>
                <input type="text" id="percent-text" name="percent-off" />
            </td>
        </tr>
    </table>
</form>

<script type="text/javascript">
    $(function() {
        $('#percent-radio, #money-radio').change(function() {
            if ($('#percent-radio').val() == true) {
                $('#percent-text').removeAttr('disabled').focus();
            } else {
                $('#percent-text').attr('disabled', 'disabled');
            }

            if ($('#money-radio').val() == true) {
                $('#money-text').removeAttr('disabled').focus();
            } else {
                $('#money-text').attr('disabled', 'disabled');
            }
        }).change();
    });
</script>
person Zenexer    schedule 09.02.2012