Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Отсчёт времени и изменение числа по наступлению даты события (https://javascript.ru/forum/dom-window/16303-otschjot-vremeni-i-izmenenie-chisla-po-nastupleniyu-daty-sobytiya.html)

loen 02.04.2011 22:44

Отсчёт времени и изменение числа по наступлению даты события
 
Здравствуйте. У меня такой вопрос. Как реализовать такой js скрипт. Допустим мы имеем число b и дату a. Задаём определенную дату, любую. Дальше, спустя, допустим, 10 дней, к дате прибавляется 10 дней, а к числу b прибавляется единица. И так по кругу. Но надо что бы число даты не было больше чем дней в месяце, ну вы сами понимаете :). Думаю объяснил всё понятно.
Спасибо заранее :)

melky 03.04.2011 12:13

function work(options){

/*
      {  FUNC callback [,INT time]  [, STR type] [, STR || ARR args] }
      понятно ? :)
*/


// аргумент должен быть один - OBJ или ARR
if(arguments.length !== 1)  throw(new Error('Undefined Arguments'));

// если это массив (у хеша нет длины), то делаем то что надо ..  *!*в [ [scope] ] window*/!*
if( !!options.length  ) {  options[0].apply(window,options[1]);return; }

// без функции, которую надо исполнить ( колбек ) , не работаем 
if( !options.callback )  throw(new Error('I need Callback!'));

// одновременно подставляем строку в аргументы колбека, если они не указаны. И, если это не массив (надо массив), то преобразуем в массив. *!* тут будет баг, если аргументы будут хешем.( args:{a:'a',b:"b"} ) */!*
if( (options.args=options.args||'').constructor.toString().indexOf("Array") == -1 ) options.args = [ options.args ];

// коэффициент, т.к. setTimeout требует время в милисекундах
var k = 1000;

switch(options.type){
  
  case'minute': k *= 60;  
  break;

  case'hour': k *= 3600; // 60*60
  break;

  case'day' : k *= 86400; // 60*60*24
  break;

  // если не указан, то остается тысячей. я убрал default
}

/* если время не указано, то оно будет 1 секундой , умноженной на коэф.
   заметим, что функции передается уже массив
*/
setTimeout( function(){ work( [  options.callback, options.args  ]  ); } , (options.time||1)*k );

}



work( { time:3, callback: alert  } )

work( { time:7, callback: alert, args : "Callback number two"  } )

work( { time:1, callback: alert, args: { a:'a',b:'b'  }  } ) // демонстрация бага. хотя.. если сделать alert({ a:'a',b:'b'  }), то будет то же самое!

// кстати, как вы думаете, в каком порядке будут исполнены функции?

alert({ a:'a',b:'b'  })


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