Сделать текстовое поле обязательным, если в выпадающем списке выбрано определенное значение

#javascript #html

#javascript #HTML

Вопрос:

В форме у меня есть следующее обязательное выпадающее окно:

 <select id="SelectBox" name="SelectBox" required>
<option value="">Please Select ...</option>
<option value="val1">val1</option>
<option value="val2">val2</option>
<option value="val3">val3</option>
<option value="val4">val4</option>
</select>
  

У меня также есть следующее текстовое поле:

 <input type="text" name="textbox" id="textbox">
  

Я пытаюсь сделать текстовое поле обязательным, только если val4 выбрано из выпадающего списка с использованием требуемого атрибута (красная рамка вокруг текстового поля). Я сделал это с помощью группы переключателей, но нужно сделать то же самое с этим выпадающим списком.

Любая помощь будет принята с благодарностью. Спасибо.

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

1. Используете ли вы jquery?

2. Добавление required атрибута не требует автоматического ввода текста в элементе. Должен ли ввод текста также требоваться в #textbox элементе?

3. @guest271314 #textbox будет использоваться в jQuery, который не помечен тегом.

4. @NewToJS » #textbox будет использоваться в jQuery, который не помечен». ? Как #textbox селектор связан с jQuery?

5. @guest271314 ну, поскольку входные ID textbox данные и jQuery использует # для определения ID ‘s и . для определения a class , использование #textbox будет относиться к использованию селектора jQuery. Как еще вы могли бы использовать #textbox чистый javascript?

Ответ №1:

Это должно сработать, чтобы сделать ввод текста атрибутом required и добавить красную рамку, если вы выберете параметр val4 только в поле выбора.

  var select = document.getElementById("SelectBox");
 var textBoxElement = document.getElementById("textbox");

 select.onchange = function(){

    var selectedString = select.options[select.selectedIndex].value;

    if(selectedString == 'val4'){

       textBoxElement.required = true;
       textBoxElement.style.border="1px solid red";

    }else{

       textBoxElement.required = false;
       textBoxElement.style.border="";
    }   
}
  

Смотрите рабочую скрипку: https://jsfiddle.net/nwk1tkb7/5 /

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

1. Что, если я выберу val2 после выбора val4.

2. странно… Я вижу, что jfiddle работает, но когда я обращаюсь к своей странице, он не работает. Может ли быть причина? Страница, которую я использую, находится на сайте WordPress, но я не думаю, что это имеет значение, потому что другие функции JS работают. Затем я также скопировал и вставил ваш html и JS на обычную HTML-страницу, и это все равно не сработало. И я добавил теги открывающего и закрывающего скрипта.

Ответ №2:

Один из подходов, который я бы предложил, заключается в следующем:

 // use of a named function, to be called via Elememt.addEventListener:
function elementRequiredIf(event) {

  // 'this' will be the <select> element in this example, however
  // the 'this' is automatically passed from Element.addEventListener
  // (as is the 'event' object, though we don't use that here):
  var changed = this,

  // here we find the conditionally-required element, using
  // the id of the element stored in the custom data-* attribute
  // of the <select> element, here we retrieve that attribute-
  // value from the dataset object, stored as a property of the
  // Element:
    requiredElement = document.getElementById(changed.dataset.required_elem_id),

  // as above, we use the same approach to retrieve the
  // value that makes the other element required:
    ifRequiredValueIs = changed.dataset.required_if_value;

  // here we set the required property of the element to
  // true (if the <select> value is equal to the required
  // value, or false if they are unequal:
  requiredElement.required = changed.value === ifRequiredValueIs;
}

// here we find the <select> element via its id,
// and bind an event-listener for the 'change' event,
// which, upon a change event being fired, calls the
// named function (note the deliberate, required, lack
// of parentheses following the function name):
document.getElementById('SelectBox').addEventListener('change', elementRequiredIf);
  

 function elementRequiredIf() {
  var changed = this,
    requiredElement = document.getElementById(changed.dataset.required_elem_id),
    ifRequiredValueIs = changed.dataset.required_if_value;
  requiredElement.required = changed.value === ifRequiredValueIs;
}

document.getElementById('SelectBox').addEventListener('change', elementRequiredIf);  
 input:required {
  box-shadow: 0 0 0.5em #f00;
}  
 <form>
  <select id="SelectBox" name="SelectBox" data-required_elem_id="textbox" data-required_if_value="val4" required>
    <option value="">Please Select ...</option>
    <option value="val1">val1</option>
    <option value="val2">val2</option>
    <option value="val3">val3</option>
    <option value="val4">val4</option>
  </select>

  <input type="text" name="textbox" id="textbox">
  <button type="submit">Submit</button>
</form>  

Демонстрация JS Fiddle.

Ссылки:

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

1. Установка required атрибута не требует автоматического ввода текста в элементе. По <form> -прежнему может быть отправлено без какого-либо текстового значения в элементе; например, пустая строка в качестве значения. OP не уточнил, требуется ли пользователю фактический ввод текста в элемент.

2.@guest271314: настройка required , безусловно, не позволяет Chrome отправлять форму без ввода, хотя, по общему признанию, я не тестировал кроссбраузерность. Также стоит отметить, что я устанавливаю required свойство, а не атрибут (который не всегда отражает обновленное значение свойства).

3. В jsfiddle попробуйте выбрать val4 , сфокусироваться на #textbox элементе, нажать клавишу пробела, нажать Submit

4. Да, это делает элемент обязательным, если OP хочет знать, как определить наличие значения, то это отдельная тема, которая полностью отсутствует в заданном вопросе. Я рад добавить подробности, если требуется, но это пока не запрошено.