Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Странная проверка соответствия регулярного выражения. (https://javascript.ru/forum/jquery/61371-strannaya-proverka-sootvetstviya-regulyarnogo-vyrazheniya.html)

Tesla 15.02.2016 15:03

Странная проверка соответствия регулярного выражения.
 
Доброго времени суток, уважаемые форумчане!

Сразу к делу:
<input type="text" class="BossInp" id="BossFam" />


$('.BossInp').change(function(){

var RegBoss = /[a-zA-Zа-яА-ЯёЁ]{3,20}$/gi;

var BossIn = $('.BossInp').val();

var result = RegBoss.test(BossIn);

var BossFaml = $('#BossFam').val();

var BossFamRes = RegBoss.test(BossFaml);

});


Имеется несколько тегов инпут, объединенных в класс BossInp и имеющих уникальные ID.
Задача скрипта в проверке соответствия содержимого тегов <input type="text" /> регулярному выражению RegBoss.

Странность (по крайней мере для моего печального понимания js) в том,

что в случае с "var result = RegBoss.test(BossIn);" проверка проходит корректно. Но "var BossFamRes = RegBoss.test(BossFaml);" возвращает false в любом случае. Весь мозг себе сломал и вынужден беспокоить Вас.

Благодарю за понимание!

destus 15.02.2016 15:15

Потому что var
BossIn = $('.BossInp').val();

возвращает набор данных из которого берется первый элемент, а
$('#BossFam').val();
возвращает значение конкретного инпута с id BossFam. Возможно, этот инпут не идет первым в наборе, возвращаемым
var BossIn = $('.BossInp').val();


Советую вывести отладочные сообщения на экран типа
alert(BossIn);
alert(BossFaml);

Tesla 15.02.2016 15:34

Цитата:

Сообщение от destus (Сообщение 407875)
Потому что var
BossIn = $('.BossInp').val();

возвращает набор данных из которого берется первый элемент, а
$('#BossFam').val();
возвращает значение конкретного инпута с id BossFam. Возможно, этот инпут не идет первым в наборе, возвращаемым
var BossIn = $('.BossInp').val();


Советую вывести отладочные сообщения на экран типа
alert(BossIn);
alert(BossFaml);

речь идет об одном и том же поле для ввода.
скрипт повешен на собитие изменения в классе. и проверяет, на сколько я понимаю, текущий элемент т.к. протестировал остальные поля ввода.
Alert - пробовал, от куда и знаю значения.
Могу, конечно написать аналогичные функции для всех 18 полей, но хотелось бы поступить разумнее)

рони 15.02.2016 15:45

Tesla,
$('.BossInp').change(function(){

var RegBoss = /[a-zA-Zа-яА-ЯёЁ]{3,20}$/gi;

var BossIn = this.value;

var result = RegBoss.test(BossIn);

alert(result)

});

destus 15.02.2016 15:47

Тогда уберите глобальный поиск в регулярке. Это происходит, потому что свойство lastindex равно длине строки и регулярное выражение сопоставляется с пустой строкой. Подробнее https://developer.mozilla.org/ru/doc...gExp/lastIndex

var RegBoss = /[a-zA-Zа-яА-ЯёЁ]{3,20}$/i;


<input type="text" class="BossInp" id="BossFam" value="AAA" />
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script>
var RegBoss = /[a-zA-Zа-яА-ЯёЁ]{3,20}$/i;
            var BossIn = $('.BossInp').val();
            var result = RegBoss.test(BossIn);
            var BossFaml = $('#BossFam').val();
            var BossFamRes = RegBoss.test(BossFaml);
            alert(result);
            alert(BossFamRes);
</script>

Tesla 15.02.2016 16:03

Цитата:

Сообщение от destus (Сообщение 407889)
Тогда уберите глобальный поиск в регулярке. Это происходит, потому что свойство lastindex равно длине строки и регулярное выражение сопоставляется с пустой строкой. Подробнее https://developer.mozilla.org/ru/doc...gExp/lastIndex

var RegBoss = /[a-zA-Zа-яА-ЯёЁ]{3,20}$/i;


<input type="text" class="BossInp" id="BossFam" value="AAA" />
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script>
var RegBoss = /[a-zA-Zа-яА-ЯёЁ]{3,20}$/i;
            var BossIn = $('.BossInp').val();
            var result = RegBoss.test(BossIn);
            var BossFaml = $('#BossFam').val();
            var BossFamRes = RegBoss.test(BossFaml);
            alert(result);
            alert(BossFamRes);
</script>

Destus, огромное Вам человеческое спасибо за уделенное время!
Вы просто гений :)


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