Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Активность кнопки отправления при выделении некоторых элементов (https://javascript.ru/forum/dom-window/17288-aktivnost-knopki-otpravleniya-pri-vydelenii-nekotorykh-ehlementov.html)

Pug-dog&Elephant 13.05.2011 12:02

Активность кнопки отправления при выделении некоторых элементов
 
<input type='radio' name='top1' value='top1'>top1</input><br />
<input type='radio' name='top2' value='top2'>top2</input><br />

<input type='radio' name='bottom1' value='bottom1'>bottom1</input><br />
<input type='radio' name='bottom2' value='bottom2'>bottom2</input><br />

<input type='submit' value='Отправить' />

Вопрос такой. Как сделать так, чтобы кнопка отправления была неактивна до тех пор, пока не выделен элемент top1 или top2 и (одновременно) bottom1 или bottom2?

walik 13.05.2011 12:44

По моему лучше использовать чек боксы (по крайней мере в данном примере)
При смене состояния кнопок, проверяете:
<input type='checkbox' name='top1' value='top1' onchange="check();"/> top 1<br />
<input type='checkbox' name='top2' value='top1' onchange="check();" /> top 2<br />

<input type='checkbox' name='bottom1' value='top1' onchange="check();" /> bottom 1<br />
<input type='checkbox' name='bottom2' value='top1' onchange="check();" /> bottom 2<br />

<input type='submit' value='Отправить' name="submit" disabled="disabled"/>
<script>
function check() {
	var top1 = document.getElementsByName('top1')[0],
		top2 = document.getElementsByName('top2')[0],
		bottom1 = document.getElementsByName('bottom1')[0],
		bottom2 = document.getElementsByName('bottom2')[0],
		submit = document.getElementsByName('submit')[0];
	if ((top1.checked || top2.checked) && (bottom1.checked || bottom2.checked))
		submit.disabled = '';
	else
		submit.disabled = 'disabled';
}
</script>

Pug-dog&Elephant 13.05.2011 13:05

Нет, нужен именно radio, ибо у меня не должно быть возможности выбрать одновременно top1 и top2. Я так понимаю, что top1.checked -это только для input с типом checkbox?

А в конструкции if-else в JavaScript фигурные скобки не являются обязательными?

А если в форме будет несколько input с типом text, то как можно дополнить код, чтобы если хотя бы одно текстовое поле пустое, то кнопка отправления также была неактивна?

walik 13.05.2011 13:15

Цитата:

Сообщение от Pug-dog&Elephant
top1.checked -это только для input с типом checkbox?

Нет, для радио тоже работать будет.

Цитата:

Сообщение от Pug-dog&Elephant
у меня не должно быть возможности выбрать одновременно top1 и top2

У ваших радио разные имена, а значит одновремена все равно выбрать можно.
Дайте им одинаковые имена.

Цитата:

Сообщение от Pug-dog&Elephant
А в конструкции if-else в JavaScript фигурные скобки не являются обязательными?

Нет, фигурные скобки ставятся когда вам нужно выполнить несколько инструкций (в нашем случае только одну надо)

Цитата:

Сообщение от Pug-dog&Elephant
А если в форме будет несколько input с типом text, то как можно дополнить код, чтобы если хотя бы одно текстовое поле пустое, то кнопка отправления также была неактивна?

Обращаетесь к нему и проверяете свойство value.length если будет ноль (пустое) то не показывать кнопку.

Pug-dog&Elephant 13.05.2011 13:38

<input type='radio' name='top' value='top1' onchange="check();"/> top 1<br />
<input type='radio' name='top' value='top1' onchange="check();" /> top 2<br />

<input type='radio' name='bottom' value='top1' onchange="check();" /> bottom 1<br />
<input type='radio' name='bottom' value='top1' onchange="check();" /> bottom 2<br />

<input type='submit' value='Отправить' name="submit" disabled="disabled"/>
<script>
function check() {
	var top = document.getElementsByName('top')[0],
		bottom = document.getElementsByName('bottom')[0],
		submit = document.getElementsByName('submit')[0];
	if (top.checked && bottom.checked)
		submit.disabled = '';
	else
		submit.disabled = 'disabled';
}
</script>

Не работает... Кнопка не становится активной...

walik 13.05.2011 13:52

<input type='radio' name='top' value='top1' onchange="check();"/> top 1<br />
<input type='radio' name='top' value='top2' onchange="check();" /> top 2<br />
 
<input type='radio' name='bottom' value='bottom1' onchange="check();" /> bottom 1<br />
<input type='radio' name='bottom' value='bottom2' onchange="check();" /> bottom 2<br />
 
<input type='submit' value='Отправить' name="submit" disabled="disabled"/>
<script>
function check() {
    var top1 = document.getElementsByName('top')[0],
        top2 = document.getElementsByName('top')[1],
        bottom1 = document.getElementsByName('bottom')[0],
        bottom2 = document.getElementsByName('bottom')[1],
        submit = document.getElementsByName('submit')[0];
    if ((top1.checked || top2.checked) && (bottom1.checked || bottom2.checked))
        submit.disabled = '';
    else
        submit.disabled = 'disabled';
}
</script>

Pug-dog&Elephant 13.05.2011 14:04

Точно. Так вот зачем нужны эти коварные цифры в скобках

walik 13.05.2011 14:06

Ты получаешь массив элементов. И с помощью этих цифр мы получаем конкретный элемент. Отсчет начинается с нуля.
К примеру:
document.getElementsByName('top')[0] - Первый элемент с именем top
document.getElementsByName('top')[1] - Второй элемент с именем top

Pug-dog&Elephant 14.05.2011 09:12

Теперь вопрос по input.
<script>
function check() {
        var top1 = document.getElementsByName('top')[0],
        top2 = document.getElementsByName('top')[1],
        bottom1 = document.getElementsByName('bottom')[0],
        bottom2 = document.getElementsByName('bottom')[1],
        input = document.getElementsByName('middle')[0],
        submit = document.getElementsByName('submit')[0];
        if ((top1.checked || top2.checked) && (bottom1.checked || bottom2.checked) && input.value !== '')
           submit.disabled = '';
        else
           submit.disabled = 'disabled';
}
</script>


<input type='radio' name='top' value='top1' onchange="check();"/> top 1<br />
<input type='radio' name='top' value='top1' onchange="check();" /> top 2<br />

<input type='text' name='middle' value='Текст' onchange="check();" /><br />

<input type='radio' name='bottom' value='top1' onchange="check();" /> bottom 1<br />
<input type='radio' name='bottom' value='top1' onchange="check();" /> bottom 2<br />

<input type='submit' value='Отправить' name="submit" disabled="disabled"/>

Работает, но состояние кнопки изменяется только после того, как фокус будет убран с input. Возможно ли сделать так, чтобы состояние кнопки срабатывало без убирания фокуса с input?

walik 14.05.2011 09:28

Да, используй событие onkeydown или onkeyup вместо onchange

Pug-dog&Elephant 14.05.2011 09:54

onkeyup лучше всего подходит)

Pug-dog&Elephant 17.05.2011 11:01

Продолжаю задавать вопросы. В одно из полей нужно вводить только числа и символ точки. Нагуглил скрипт
function check(input) {        //метод, проверяющий значение поля input
   var resultint="";           //здесь сохранит итоговый результат
   var accept = "1234567890."; //допустимые символы
  
   for (var i = 0; i < input.length; i++) {      //проходим циклом по введенному в поле значению
  
   var symbol="";                                //текущий символ
      for (var j = 0; j < accept.length; j++){   //вложенный цикл, проверяем каждый символ поля на допустимость
         if(input.charAt(i)==accept.charAt(j)) { //если символ разрешен
            symbol=input.charAt(i);
            resultint+=symbol;                   //добавляем его к resultint, таким образом, формируя его
         }
      }
   }
   document.getElementByName('price').value = resultint;
}

<input type='text' name='price' value='' onkeyup='checkNewAd();' onblur='check(this.form.price.value);'/>

Но он не работает :(

Есть ли какие иные пути фильтрации вводимых данных через JavaScript?

Update 1:
Нашёл также http://javascript.ru/forum/misc/1230...h-dannykh.html
Но всё равно не могу заставить работать
function check() {        //метод, проверяющий значение поля input
var price = document.getElementByName('price')[0];
price.value = price.value.replace(/[^0-9\.]/g,'');
}

<input type='text' name='price' value='' onkeyup='checkNewAd(); check();'/>


Часовой пояс GMT +3, время: 21:42.