С Новым годом! Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/34: Рейтинг темы: голосов - 34, средняя оценка - 4.59
2 / 2 / 0
Регистрация: 26.04.2010
Сообщений: 134

Почему не срабатывает условие if else?

03.07.2019, 18:04. Показов 7429. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.

есть код:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
if (name.length<3)
            fail = "Имя не меньше 3-х символов";
        else if(phone.length < 17)
        fail = "Вы ввели не корректный номер телефона";
 
        else if(email.length >0)
        {
          if(email.split('@').length - 1 === 0 || email.split('.').length -1 === 0 || email2[1]==='')
            fail = "Вы ввели не корректный Email";
        }
        else if(message.length < 20)
            fail = "Сообщение не менее 20 символов";
где до последнего else не доходит ход. Если к примеру сделать так:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
        if (name.length<3)
            fail = "Имя не меньше 3-х символов";
        else if(phone.length < 17)
        fail = "Вы ввели не корректный номер телефона";
 
 
          else if(email.split('@').length - 1 === 0 || email.split('.').length -1 === 0 || email2[1]==='')
            fail = "Вы ввели не корректный Email";
        
        else if(message.length < 20)
            fail = "Сообщение не менее 20 символов";
все условия отрабатывают. Почему так?

Добавлено через 1 час 11 минут
Как понимаю когда срабатывает length > 0 получается true в условиях и на этом дальнейшие else не срабатывают. Надо как понимаю false вернуть из этого условия если под условие не сработало..только не знаю как это сделать

Добавлено через 20 минут
Или в случае else подусловия написать - return false ?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.07.2019, 18:04
Ответы с готовыми решениями:

Почему не срабатывает условие?
Уважаемые специалисты, подскажите пожалуйста, почему игнорируется оператор условного перехода в 25 строке и как это исправить) (Заранее...

Почему условие не срабатывает?
если имя допусти И .Оно состоит из одной буквы, то strlen($_POST) &lt; 2 должно сработать. Но оно не срабатывает. Что не так? if...

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

9
54 / 11 / 0
Регистрация: 28.11.2017
Сообщений: 50
03.07.2019, 18:06
Логика if-else-if аналогична switch, то есть должно сработать только какое-то одно условие, которое исключает все остальные. Такая схема не годится когда нужно проверить разные не связанные условия. В этом случае блоки if должны быть отдельными, а условие зависящее от другого условия должно быть вставлено внутрь этого условия без всякого else, как кстати, правильно и сделано в первом варианте: если имейл не пустой проверяем как он написан, только там дальше неправильно стоит else if, который непонятно зачем нужен и к какому if относится (вообще-то к ближайшему). Конструкция if-else-if вас просто запутывает. А всё же просто как валенок: если такое-то условие, то ... , если такое, то... Без всяких else. Всё усложняет привязка разных условий к одной переменной. А вдруг случится что и волки сыты и овцы целы, то надо и тех и других в одну строку конкатенировать.
0
2 / 2 / 0
Регистрация: 26.04.2010
Сообщений: 134
03.07.2019, 22:29  [ТС]
А как сделать что бы остальные условия тогда не проверялись? Мне то надо что бы по очереди потерялись сверху вниз условия и первое же несоответствие давало некий результат. Все бы ничего да только одно из условий имеет подусловие..так то все как раз устраивало.. что то вроде goto есть? Или другой вариант..
0
Эксперт JS
2037 / 1096 / 409
Регистрация: 29.04.2016
Сообщений: 2,625
03.07.2019, 23:52
shivara52,

https://codepen.io/Mr_Sergo/pen/gNKKZN
HTML5
1
2
3
4
5
<input type="text" placeholder="name" class="name"><br><br>
<input type="text" placeholder="phone" class="phone"><br><br>
<input type="text" placeholder="email" class="email"><br><br>
<input type="text" placeholder="message" class="message"><br><br>
<button>Проверить</button>
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
let name = document.querySelector('.name');
let phone = document.querySelector('.phone');
let email = document.querySelector('.email');
let message = document.querySelector('.message');
 
document.querySelector('button').addEventListener('click',()=> {
    let fail = '';
 
    if(name.value.length < 3)
    fail += "Имя не меньше 3-х символов\n";
 
    if(phone.value.length < 3)
    fail += "Вы ввели не корректный номер телефона\n";
 
    if(email.value.length < 3)
    fail += "Вы ввели не корректный Email\n";
 
    if(message.value.length < 3)
    fail += "Сообщение не менее 3 символов\n";
 
    alert(fail);
});
Немного упростил что бы вам было понятней, надеюсь разберетесь.

Добавлено через 3 минуты
В случае совпадения какого-то условия в fail добавляем ту или иную ошибку совмещенным оператором +=
\n добавляет в строку знак переноса
0
2 / 2 / 0
Регистрация: 26.04.2010
Сообщений: 134
04.07.2019, 09:06  [ТС]
Данный вариант не подходит. Я нашел решение данного вопроса.
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
    function check_email(email,email2)
    {
        if(email.length >0)
        {
            console.log('Длина > 0 - Начало');
            if(email.split('@').length - 1 === 0 || email.split('.').length -1 === 0 || email2[1]===''){
                fail = "Вы ввели не корректный Email";
                console.log(fail);
                console.log('есть ошибка');
                return true;
            }
            else
            {console.log('длина > 0 - нет ошибки в email');return false;}
        }
        else
        {console.log('путое поле email - дальше не проверяем');return false;}
    }
 
...
 
        var email = $("#email").val();
        var email2 = email.split('.');
...
 
 if (name.length<3)
            fail = "Имя не меньше 3-х символов";
        else if(phone.length < 17)
        fail = "Вы ввели не корректный номер телефона";
        else if(check_email(email,email2) === true)
            fail = "Вы ввели не корректный Email";
        else if(message.length < 20)
            fail = "Сообщение не менее 20 символов";
        else
        if(response.length === 0)
            fail = "Пройдите проверку что вы не робот!";
 
        if(check === false)
             fail = "Подтвердите согласие на обработку персональных данных!";
...
В данном варианте все работает. Тем не менее спасибо за попытки помочь. Я ценю всех людей здесь пытающихся помочь. Удачи всем.
0
54 / 11 / 0
Регистрация: 28.11.2017
Сообщений: 50
04.07.2019, 10:29
На 29-й строке сравнение с true лишнее, функция и так возвращает булево значение. Да и сама функция - лишняя. Можно блоки из функции запихать туда же на 29-ю строку, только там не возвращать булево значение, а присваивать строку. А там где сейчас 33-я продолжить else if для if верхнего уровня.
А чем не устроила идея выводить сразу все ошибки пользователя, чтобы он их разом все исправил, а не издеваться над ним, отрезая хвост по кусочкам? Хотя, статистикой ошибок пользователя заваливать тоже не стоит. Было бы прикольно, чтобы под каждым импутом сразу выводилась своя ошибка. Разве трудно поместить под каждый импут дивчик с маленьким, красным, конкретным текстом, а самим импутам задать обработчики на событие keyup, где будет та же самая проверка, только теперь для value конкретного импута. Тут логика будет обратная - пока удовлетворяет неправильным условиям задавать дивам дисплей блок, набрал правильно - дисплей none. Тут же в блоке и сам бордюр импута наверно можно в красный покрасить, как в каком-то кино видел.
0
2 / 2 / 0
Регистрация: 26.04.2010
Сообщений: 134
04.07.2019, 19:14  [ТС]
По поводу сразу все выводить в мобильной версии у меня это больше места занимало бы. По поводу 29й строки согласен. Вообще я сырой вариант выложил как только получилось. По поводу функции мне показалось так проще и в ту же систему условий вписывается. Под каждым input вывод ошибки не практичен. А вот идея с цветом бордюра как самого простого варианта отображения корректности ввода неплохая идея. Вспомнилось..на некоторых сайтах галочки справа например появляются напротив поля которое ввели корректно и крестик если нет.

Спасибо за идеи. Думаю кое что внедрю у себя.

Добавлено через 4 минуты
А по поводу замены фунции на условия.. не получилось у меня иначе.мне надо было сначала анализировать пустой ли email..а уж потом проверять что конкретно введено..если бы без проверки на пустое..вопрос бы не возник..функция же решила данный вопрос
0
Эксперт JS
2037 / 1096 / 409
Регистрация: 29.04.2016
Сообщений: 2,625
04.07.2019, 19:27
Цитата Сообщение от shivara52 Посмотреть сообщение
идея с цветом бордюра как самого простого варианта отображения корректности ввода неплохая идея
Две ошибки:
юзер оставил поле пустым, а оно обязательно к заполнению и
это же поле должно содержать не менее 5 символов
Как юзер поймет в чем он ошибся по цвету бордера?

Наверное тогда уж как-то совместить
Цитата Сообщение от shivara52 Посмотреть сообщение
Под каждым input вывод ошибки
и
Цитата Сообщение от shivara52 Посмотреть сообщение
идея с цветом бордюра
0
54 / 11 / 0
Регистрация: 28.11.2017
Сообщений: 50
05.07.2019, 03:59
Цитата Сообщение от shivara52 Посмотреть сообщение
А по поводу замены фунции на условия.. не получилось у меня иначе.мне надо было сначала анализировать пустой ли email..а уж потом проверять что конкретно введено..если бы без проверки на пустое..вопрос бы не возник..функция же решила данный вопрос
Почему не получается?
Вот, на примере известного стиха сделана такая же конструкция, а заодно это образец культурного взаимодействия с пользователем.
Представьте, что вместо вопросов стоят нормальные условные выражения, результат которых true или false. Так вот я специально, также как и у вас, один блок вставляю в другой. Очевидно, что, чтобы взять книги нужно залезть в шкаф, поэтому блок про книги внутри блока про шкаф. Но это никак не ломает течение логики. Тронули книги - строка про шкаф перепишется на книги. Или если присвоение строки про шкаф будет идти else в блоке про книги, то и переписывать не надо. Таких вставок в глубину могло быть сколько угодно, но в результате код вернёт только какую-то одну претензию к пользователю.
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
let str = '';
 
if (Вы сидите на диване?) {
    str = `Встаньте с этого дивана,
           А не то там будет яма`
}
else if (Вы ходите по ковру?) {
    str = `Не ходите по ковру —
           Вы протрёте там дыру.`
}
else if (Лезете на кровать?) {
    str = `И не трогайте кровать —
           простынь можете помять.`
}
else if (Трогаете шкаф?) {
    str = `И не надо шкаф мой трогать —
           У вас слишком острый ноготь.`;
    
    if (Берёте книги?) {
        str = `И не надо книги брать —
               Их вы можете порвать.`
    }
}
else if (Просто стоите и боитесь сделать что-то не то?) {
    str = `И не стойте на пути…`
}
else if (Вы чё, робот?) {
    str = `Ах, не лучше ль вам уйти?`
}
0
2 / 2 / 0
Регистрация: 26.04.2010
Сообщений: 134
05.07.2019, 22:05  [ТС]
Принцип понял. Спасибо большое. Потренируюсь в этом вопросе
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.07.2019, 22:05
Помогаю со студенческими работами здесь

Не срабатывает условие. Почему?
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int _tmain(int argc, _TCHAR* argv) { ...

Double.NAN - почему условие не срабатывает?
Не пойму, почему условие не срабатывает. Значения переменных в отладчике Double.NaN. Скрин прилагаю.

Почему срабатывает первое условие? проверка баланса
Почему срабатывает условие if ($get_balance &gt; 0), хотя баланс в базе стоит 0. $get_balance = mysqli_query($CONNECT,&quot;SELECT...

Почему не срабатывает условие при проветке атрибутов?
Пытаюсь перебрать атрибуты элемента в цикле, и в зависимости от текущего значения атрибута, нужно или удалить этот атрибут или оставить. Но...

Не срабатывает условие в цикле while не могу понять почему
При решении задачки в которой необходимо сделать игру Однорукий Бандит, наткнулся при тестировании что одно из условий цикла while не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru