22.08.2017, 12:57
|
|
Профессор
|
|
Регистрация: 19.02.2015
Сообщений: 219
|
|
Склонение числительных окончаний
Добрый день! Пытаюсь сделать склонение числительных окончаний в слове "секунды", но у меня не совсем получается. Где у меня ошибка, помогите, пожалуйста. Большое спасибо!
$(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>
|
|
22.08.2017, 13:02
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,791
|
|
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;
}
|
|
22.08.2017, 13:15
|
|
Профессор
|
|
Регистрация: 19.02.2015
Сообщений: 219
|
|
Nexus,
так вот я и подобрал одну из функций, но где у меня ошибка, и что я делаю неправильно?
|
|
22.08.2017, 13:45
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,791
|
|
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 это, вероятно, не прокатит.
Последний раз редактировалось Nexus, 22.08.2017 в 13:51.
|
|
22.08.2017, 14:13
|
|
Профессор
|
|
Регистрация: 19.01.2012
Сообщений: 505
|
|
<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>
|
|
22.08.2017, 14:47
|
|
Профессор
|
|
Регистрация: 19.02.2015
Сообщений: 219
|
|
Вот так? Но так не работает. Что делаю не так? прошу прощения за кривые руки
$(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);
});
|
|
22.08.2017, 14:58
|
|
Профессор
|
|
Регистрация: 19.01.2012
Сообщений: 505
|
|
Сообщение от LADYX
|
var seconds = plural(['секунд','секунду','секунды']);
var delay = 1,
seconds = 7;
|
зачем вы переопределяете переменную? Как вы собираетесь использовать эту ф-ю потом?
|
|
22.08.2017, 15:09
|
|
Профессор
|
|
Регистрация: 19.02.2015
Сообщений: 219
|
|
Ну а как же тогда, я не понимаю. Я ведь наоборот определил переменную, а как же тогда будет выводится результат?
|
|
22.08.2017, 15:42
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,215
|
|
Сообщение от LADYX
|
Ну а как же тогда, я не понимаю.
|
Этим сможешь воспользоваться?
<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>
Последний раз редактировалось ksa, 22.08.2017 в 15:45.
|
|
22.08.2017, 15:56
|
|
Профессор
|
|
Регистрация: 19.01.2012
Сообщений: 505
|
|
|
|
|
|