Склонение числительных окончаний
Добрый день! Пытаюсь сделать склонение числительных окончаний в слове "секунды", но у меня не совсем получается. Где у меня ошибка, помогите, пожалуйста. Большое спасибо!
$(document).ready(function() { $('.timer').prepend('<div class="left">Окно можно будет закрыть через <span></span> секунд</div>'); decOfNum(5, ['секунда', 'секунды', 'секунд']); var delay = 1, seconds = 7; $('.left span').text(seconds); $('.pop_up').delay(delay * 1000).fadeIn(800, function() { var int; int = setInterval(function() { if (seconds > 1) { $('.left span').text(seconds - 1); seconds--; } else { $('.left').remove(); $('.pop_up .close').show(); clearInterval(int); } }, 1000); $('.timer').ready(function (declOfNum(number, titles) { cases = [2, 0, 1, 1, 1, 2]; return titles[ (number%100>4 && number%100<20)? 2 : cases[(number%10<5)?number%10:5] ]; }); }); }); jQuery('.close').click(function(e) { e.preventDefault(); jQuery('.pop_up').fadeOut(0); }); <style>.pop_up { display: none; background: red; border: 1px solid red; color: white; } .close { display: none; cursor: pointer; }</style> <div class="pop_up">Я модальное окно <div class="timer"> <div class="close">Закрыть окно</div> </div> </div> |
LADYX, гугл по запросу «plural js» возвращает несколько годных вариантов реализации вашей задумки)
К примеру: // © [url]https://gist.github.com/tomfun/830fa6d8030d16007bbab50a5b21ef97[/url] function getNoun(number, one, two, five) { let n = Math.abs(number); n %= 100; if (n >= 5 && n <= 20) { return five; } n %= 10; if (n === 1) { return one; } if (n >= 2 && n <= 4) { return two; } return five; } |
Nexus,
так вот я и подобрал одну из функций, но где у меня ошибка, и что я делаю неправильно? |
LADYX,
Ошибка наверняка в этом участке кода: $('.timer').ready(function(declOfNum(number, titles) { cases = [2, 0, 1, 1, 1, 2]; return titles[(number % 100 > 4 && number % 100 < 20) ? 2 : cases[(number % 10 < 5) ? number % 10 : 5]]; }); Во-первых, событие «ready» для блока .times не произойдет, пока его самостоятельно не запустишь (не уверен); Во-вторых, тела у обработчика события «ready» нет; В-третьих, у тебя в коде синтаксическая ошибка. Я такого объявления функции/класса в js никогда не видел. Видел такое только в Java, однако в js это, вероятно, не прокатит. |
<script> function plural(arr) { var get = [0,1,2,2,2,0,0,0,0,0]; return function(num) { if( String.prototype.slice.call(num, -2,-1) === '1' ) return arr[0]; num = String.prototype.slice.call(num, -1); return arr[ get[num] ]; } } var sec = plural(['секунд','секунду','секунды']); for(var i=0; i<=31; i++) { document.write('через '+i+' ' + sec(i) + '<br>'); } </script> |
Вот так? Но так не работает. Что делаю не так? прошу прощения за кривые руки
$(document).ready(function() { $('.timer').prepend('<div class="left">Можно будет закрыть через <span></span> секунд</div>'); var seconds = plural(['секунд','секунду','секунды']); var delay = 1, seconds = 7; $('.left span').text(seconds); $('.pop_up').delay(delay * 1000).fadeIn(800, function() { var int; int = setInterval(function() { if (seconds > 1) { $('.left span').text(seconds - 1); seconds--; } else { $('.left').remove(); $('.pop_up .close').show(); clearInterval(int); } }, 1000); }); }); function plural(arr) { var get = [0,1,2,2,2,0,0,0,0,0]; return function(num) { if( String.prototype.slice.call(num, -2,-1) === '1' ) return arr[0]; num = String.prototype.slice.call(num, -1); return arr[ get[num] ]; } } jQuery('.close').click(function(e) { e.preventDefault(); jQuery('.pop_up').fadeOut(0); }); |
Цитата:
|
Ну а как же тогда, я не понимаю. Я ведь наоборот определил переменную, а как же тогда будет выводится результат?
|
Цитата:
<script type='text/javascript'> function test(Sec){ switch (Sec%20) { case 1: return 'секунду'; case 2: case 3: case 4: return 'секунды'; }; return 'секунд'; }; for (var i=0; i<100; i++){ document.write('через '+i+' '+test(i)+'<br />'); }; </script> |
|
Цитата:
До туда я не долистал... |
Я понял, где моя ошибка и как нужно было сделать. Спасибо вам!
И еще, скажите, пожалуйста, закрытие окна я пишу как отдельной функцией jQuery('.close').click(function(e) { e.preventDefault(); jQuery('.pop_up').fadeOut(0); }); Конечно же, все работает, но это правильно? или же это можно как-то сократить? |
правильно
|
Огромное спасибо за помощь, и удачи вам!
|
Вроде рабочий вариант... :D
<script type='text/javascript'> function test(Sec){ if (Sec>10 && Sec<15) return 'секунд'; switch (Sec%10) { case 1: return 'секунду'; case 2: case 3: case 4: return 'секунды'; }; return 'секунд'; }; for (var i=0; i<200; i++){ document.write('через '+i+' '+test(i)+'<br />'); }; </script> |
:write: полная версия plural и не только
https://javascript.ru/forum/misc/351...tml#post231512 |
Цитата:
рони, слишком много математики, имхо. И читать сложно, и проц напрягать... |
Вот блин, снова не получается, да что же я не так делаю? Я прошу прощения. Смотрите, добавил функцию cookie, где при нажатии на "больше не показывать окно", ставится cookie, но мало того что явно делаю что-то не так, так еще и синтаксическая ошибка. jQuery Cookie Plugin v1.4.1 к сайту подключен. Помогите, пожалуйста?
jQuery(document).ready(function($) { if (typeof $.cookie('pop_up') === 'undefined') { var date = new Date(); var period = 3; //например, на 3 дня date.setTime(date.getTime() + period * 24 * 60 * 60 * 1000); $.cookie('pop_up', 'yes', { expires: date, path: '/' }); $('.timer').prepend('<div class="left">Можно будет закрыть через <span></span></div>'); var msg = plural([' секунд',' секунду',' секунды']); var delay = 1, seconds = 3; $('.left span').text(seconds+msg(seconds)); $('.pop_up').delay(delay * 1000).fadeIn(800, function() { var int; int = setInterval(function() { if (seconds > 1) { $('.left span').text((seconds - 1)+msg(seconds - 1)); seconds--; } else { $('.left').remove(); $('.pop_up .close').show(); clearInterval(int); } }, 1000); }); }); function plural(arr) { var get = [0,1,2,2,2,0,0,0,0,0]; return function(num) { if( String.prototype.slice.call(num, -2,-1) === '1' ) return arr[0]; num = String.prototype.slice.call(num, -1); return arr[ get[num] ]; } } } jQuery('.close, .close_cookie').click(function(e) { e.preventDefault(); jQuery('.pop_up').fadeOut(0); }); ну и в html соответственно изменения: <div class="pop_up">Я модальное окно <div class="timer"> <div class="close">Закрыть окно</div> <div class="close close_cookie">Больше не показывать</div> </div> </div> Еще раз прошу прощения за беспокойство! |
Цитата:
<script type='text/javascript'> function test(Sec){ var val=Sec%100; if (val>10 && val<15) return 'секунд'; switch (Sec%10) { case 1: return 'секунду'; case 2: case 3: case 4: return 'секунды'; }; return 'секунд'; }; for (var i=0; i<200; i++){ document.write('через '+i+' '+test(i)+'<br />'); }; </script> |
Часовой пояс GMT +3, время: 02:40. |