Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.08.2017, 12:57
Аватар для LADYX
Профессор
Отправить личное сообщение для LADYX Посмотреть профиль Найти все сообщения от LADYX
 
Регистрация: 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>
Ответить с цитированием
  #2 (permalink)  
Старый 22.08.2017, 13:02
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,795

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;
  }
Ответить с цитированием
  #3 (permalink)  
Старый 22.08.2017, 13:15
Аватар для LADYX
Профессор
Отправить личное сообщение для LADYX Посмотреть профиль Найти все сообщения от LADYX
 
Регистрация: 19.02.2015
Сообщений: 219

Nexus,
так вот я и подобрал одну из функций, но где у меня ошибка, и что я делаю неправильно?
Ответить с цитированием
  #4 (permalink)  
Старый 22.08.2017, 13:45
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,795

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.
Ответить с цитированием
  #5 (permalink)  
Старый 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>
Ответить с цитированием
  #6 (permalink)  
Старый 22.08.2017, 14:47
Аватар для LADYX
Профессор
Отправить личное сообщение для LADYX Посмотреть профиль Найти все сообщения от LADYX
 
Регистрация: 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);
});
Ответить с цитированием
  #7 (permalink)  
Старый 22.08.2017, 14:58
Аватар для Белый шум
Профессор
Отправить личное сообщение для Белый шум Посмотреть профиль Найти все сообщения от Белый шум
 
Регистрация: 19.01.2012
Сообщений: 505

Сообщение от LADYX
  var seconds = plural(['секунд','секунду','секунды']);
  var delay = 1,
    seconds = 7;
зачем вы переопределяете переменную? Как вы собираетесь использовать эту ф-ю потом?
Ответить с цитированием
  #8 (permalink)  
Старый 22.08.2017, 15:09
Аватар для LADYX
Профессор
Отправить личное сообщение для LADYX Посмотреть профиль Найти все сообщения от LADYX
 
Регистрация: 19.02.2015
Сообщений: 219

Ну а как же тогда, я не понимаю. Я ведь наоборот определил переменную, а как же тогда будет выводится результат?
Ответить с цитированием
  #9 (permalink)  
Старый 22.08.2017, 15:42
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,228

Сообщение от 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.
Ответить с цитированием
  #10 (permalink)  
Старый 22.08.2017, 15:56
Аватар для Белый шум
Профессор
Отправить личное сообщение для Белый шум Посмотреть профиль Найти все сообщения от Белый шум
 
Регистрация: 19.01.2012
Сообщений: 505

LADYX,
https://jsfiddle.net/a5udxz9s/

ksa,
Цитата:
через 92 секунд
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите исправить склонение fAmOus Элементы интерфейса 7 31.08.2012 03:02
склонение по падежам genius_kld Общие вопросы Javascript 1 04.04.2012 15:39
Как сделать склонение? sardonyx Элементы интерфейса 0 24.09.2011 21:58