Как мне изменить значение текстового поля на основе значения поля выбора?

#jquery #textbox #listbox #onchange

#jquery #текстовое поле #список #onchange

Вопрос:

Я искал в Интернете и на этом веб-сайте простое и адаптируемое решение, но, увы, безрезультатно.

Требуемый процесс:

  1. Пользователь выбирает <option> из <select> списка. например, имя.
  2. Значение текстового поля, доступного только для чтения, автоматически заполняется на основе выбранного <option> . например, номер телефона, соответствующий имени.
  3. Наконец, <select> поле и текстовое поле должны иметь свои собственные значения. т.е. имя и номер телефона соответственно.

Базовая разметка:

Когда это изменится, обновите значение моего текстового поля:

 <select id="name" name="name">
<option value="Elvis">Elvis</option>
<option value="Frank">Frank</option>
<option value="Jim">Jim</option>
</select>
  

Значение, зависящее от значения вышеуказанного поля:

 <input type="text" id="phonenumber" name="phonenumber" value="">
  

Мой вопрос:

Как мне достичь этого, используя jQuery или обычный Javascript? Пожалуйста, ответьте на это с точки зрения новичка на стороне клиента.

Решение (благодаря corroded):

Я добавил следующее в заголовок моего документа:

  <script type="text/javascript" src="jquery.js"></script>          
 <script type="text/javascript">  
 $(document).ready(function() {                                       
    $("#name").live("change", function() {
      $("#phonenumber").val($(this).find("option:selected").attr("data-phonenumber"));
    })
 });                                     
 </script>
  

…и следующее в теле моего документа:

 <select id="name" name="name">
<option value="" selected="selected">Please select...</option>
<option value="Elvis" data-phonenumber="11111">Elvis</option>
<option value="Frank" data-phonenumber="22222">Frank</option>
<option value="Jim" data-phonenumber="33333">Jim</option>
</select>

<input type="text" id="phonenumber" name="phonenumber" value="" readonly="readonly">
  

Для получения дополнительной информации об использовании data-somename в качестве атрибута, как предложено corroded, обратитесь к следующим ссылкам:

http://ejohn.org/blog/html-5-data-attributes/

http://blogs.sitepoint.com/rel-not-a-custom-attribute/

Ответ №1:

добавьте значение «данные-номер телефона» в свои параметры:

 <option value="Elvis" data-phone-number="77777">Elvis</option>
  

в вашем jquery:

 $("#name").live("change", function() {
  $("#phonnumber").val($(this).find("option:selected").attr("data-phone-number"));
})
  

рефакторинг по мере необходимости 🙂

Комментарии:

1. @Dominor — если вам нравится этот ответ, почему бы вам не проверить его и не пометить как правильный?

2. Это сработало отлично, большое спасибо corroded! Я не представлял, что могу создать атрибут и вызвать его таким образом. Спасибо, что обратили внимание на мое третье условие, касающееся моего требования, чтобы поле выбора и текстовое поле имели отдельные значения. Я добавил полностью закодированное решение к своему вопросу для ясности и записи.

3. @eykanal: Я был в процессе этого. Соблюдая приличия, я отвечал в виде комментария другим участникам, которые предоставили ответ на мой вопрос. Не волнуйтесь, я тоже ненавижу выходить, не закрывая за собой дверь на форумах сообщества, основанных на поддержке. 😉

4. @Dominor — не проблема, и спасибо. Я увидел вашу низкую репутацию и подумал, что вы, возможно, новичок, поэтому решил дружески подтолкнуть.

5. просто примечание, обычно принято использовать префикс «data-» для всего, что касается дополнительных данных в ваших атрибутивных тегах, поскольку все остальное, вероятно, выдаст какое-то предупреждение или еще что-то (не уверен .. но лучше всего использовать ссылку на data-tag) здесь: ejohn.org/blog/html-5-data-attributes

Ответ №2:

Вы можете попробовать это.

 $('#name').change(function(){
    $('#phonenumber').val($(this).val());
});
  

Если вы хотите, чтобы в нем отображался номер телефона, просто настройте свой HTML-код так, чтобы значением каждого параметра был номер телефона. Например.

 <option value="5555555555">Frank</option>
  

Комментарии:

1. Привет, mhiggins, спасибо за ответ, но, как упоминалось в postiv, предыдущее решение corrodded сделало свое дело. Я отвечу на тот же вопрос, что и вы: позволяет ли ваше решение, чтобы поле выбора и текстовое поле могли публиковать разные значения (см. Мое третье условие в разделе «Желаемый процесс:»)?

2. Доминор, ты прав. Он будет работать. Атрибут data будет работать просто отлично, как описано выше. Вы также могли бы поместить другое значение в тег rel и вызвать его, заменив эту строку $('#phonenumber').val($(this).attr('rel'));

3. После небольшого беглого изучения вашего предложения я наткнулся на статью, в которой утверждается, что REL никогда не следует использовать в качестве пользовательского атрибута и, более того, его следует использовать только в тегах a и link ( blogs.sitepoint.com/rel-not-a-custom-attribute ). Должен ли я отнестись к этому серьезно? Прошу прощения, если я кажусь тупым — я ценю ваше время.

4. @dominor : Совсем не тупой. Исследования никогда не бывают плохими. В этой статье есть очень веские аргументы. В конце автор оставляет открытым вопрос «делайте то, что лучше всего подходит в вашей ситуации». На самом деле для этого нет четкого ответа. Если вам нужно передать данные, а для этого нет средства, вы импровизируете. Во многих приложениях, которые я создал, я без проблем использовал тег rel. Если вы можете гарантировать, что все, кто использует ваш код, будут в браузере, совместимом с HTML5, тогда вы захотите использовать атрибут data.

Ответ №3:

Я бы сделал что-то вроде:

 <select id="name" name="name">
  <option value="0123456789">Elvis</option>
  [...]
</select>
  

и затем

 $('#name').change(function(){
  var thisphone = $(this).val();
  $('#phonenumber').val(thisphone);
});
  

или

 $('#name').change(function(){
  $('#phonenumber').val($(this).val());
});
  

в зависимости от того, как вы хотите работать со своими переменными

Комментарии:

1. Спасибо за ответ postiv, но предыдущее решение corroded сделало свое дело. Допускает ли ваше решение, чтобы поле выбора и текстовое поле могли публиковать разные значения (см. Мое третье условие в разделе «Желаемый процесс:»)?

2. Нет, это не сработает. Но ответ corrodded отличный. но это недопустимо для W3C, но оно выполняет свою работу!

Ответ №4:

Вы также можете сделать это, не связывая поле выбора и телефонные номера так тесно друг с другом. Используйте нотацию JSON для настройки объектов, содержащих всю информацию о вашем персонаже, например:

 <script type="text/javascript">
    var people = {
        Elvis:  {
            phone: "555-5555"
            },
        Frank: {
            phone: "123-4567"
            },
        Jim: {
            phone: "987-6543"
            }
        };

    window.onload = function() {
        var list = document.getElementById("name");
        list.onchange = function() {
            document.getElementById("phone").value = people[this.value].phone;
        }   
    }
</script>
  

По сути, мы просто создаем три объекта: «Элвис», «Фрэнк» и «Джим» внутри более крупного объекта под названием «люди». У каждого объекта есть свойство phone, к которому вы можете получить доступ с помощью точечной записи, как это сделал я (т. Е. people[«Элвис»].phone), или обозначения массива (т. Е. people.Элвис [«телефон»]]).

Чтобы упростить задачу, я использую ключевое слово «this», поскольку при вызове из обработчика событий «onchange» оно ссылается на объект, который вызвал событие — поле выбора. Итак, «this.value» относится к значению в поле выбора.

Теперь ваш выбор остается довольно простым:

 <select id="name" name="name">
    <option value="Elvis">Elvis</option>
    <option value="Frank">Frank</option>
    <option value="Jim">Jim</option>
</select>

<br />
<input type="text" id="phone" />
  

Комментарии:

1. Спасибо за альтернативный подход и обзор. Я успешно протестировал это. Интересно, как вы использовали .notation, структурировав значение phone для каждого из имен. Это дало мне представление об архитектуре JavaScript. Как вы подразумевали, это, безусловно, упрощает разметку поля выбора. Я сохраню это в закладках, чтобы проанализировать на более позднем этапе, если мне это потребуется, хотя я буду использовать подход corroded в основном потому, что я заинтересован в ознакомлении с jQuery.