За последние 24 часа нас посетил 62151 программист и 1800 роботов. Сейчас ищут 2105 программистов ...

вызов функции

Тема в разделе "JavaScript и AJAX", создана пользователем Апельсин, 28 июн 2010.

  1. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    Есть функция - таймер обратного отсчета. Нужно сделать фишку как на аукционах - типа перечень товаров на странице и под каждым идет отсчет времени до окончания приема ставок. Как для одного блока запустить таймер - не проблема. А как для нескольких?
    [js]function timer(timestamp)
    {
    var d = new Date();
    var timerspan = ge('timer');
    var r = timestamp - d.getTime();

    if(r > 0)
    {
    var result = '';

    var m1 = Math.floor(r / 86400000);//day
    var m2 = Math.floor((r - 86400000 * m1) / 3600000);//hours
    var m3 = Math.floor((r - 86400000 * m1 - m2 * 3600000) / 60000);//minutes
    var m4 = Math.floor((r - 86400000 * m1 - m2 * 3600000 - m3 * 60000) / 1000);


    if(m1 >= 1) result += m1+'д. ';
    result += m2+'ч. '+m3+'м. '+m4+'сек.';

    timerspan.innerHTML = result;
    }
    else timerspan.innerHTML = 'Истекло';
    }
    function aa()
    {
    var a = timer(1277857786000);
    }

    setInterval(aa, 1000);[/js]
    <span id="timer"></span>

    timer() принимает метку времени в микросекундах от 1970г, потом отнимает текущее время и преобразует в норм. вид.
    Вот допустим, будет куча спанов <span id="timer2"></span>, <span id="timer3"></span> ... как для каждого стартовать timer() ?
     
  2. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Например так:

    [js]function run(general) {
    for(var i = 0; ;i++) {
    var timeable = document.getElementById(general + "-" + i);

    if(typeof(timeable) != "undefined") {
    // Start
    } else break;
    }
    }[/js]
     
  3. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    Всеравно непонятно. Еще раз для себя повторюсь :)

    [js]function timer(timestamp)
    {
    var d = new Date();
    var timerspan = ge('timer-1');
    var r = timestamp - d.getTime();

    if(r > 0)
    {
    var result = '';

    var m1 = Math.floor(r / 86400000);//day
    var m2 = Math.floor((r - 86400000 * m1) / 3600000);//hours
    var m3 = Math.floor((r - 86400000 * m1 - m2 * 3600000) / 60000);//minutes
    var m4 = Math.floor((r - 86400000 * m1 - m2 * 3600000 - m3 * 60000) / 1000);

    if(m1 >= 1) result += m1+'д. ';
    result += m2+'ч. '+m3+'м. '+m4+'сек.';

    timerspan.innerHTML = result;
    }
    else timerspan.innerHTML = 'Истекло';
    }[/js]

    <span id="timer-1">1277857786000</span><br>
    <span id="timer-2">1277257786000</span>
    Функция + 2 спана. Допустим, в timer() передаем время путем изъятия числа из тега через innerHTML. Теперь у функции есть время и доступ к спану, чтобы "щелкать" секунды счетчика. Как запустить одновременно для двух этих спанов? Если привязать к каждому спану событие, например, onclick то все ясно. Но это не то.
     
  4. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Опишу алгоритм:

    1. При загрузке документа существует куча span-ов с разным временем.
    2. Собираем по какому-нибудь критерию все эти span-ы
    3. По-одиночке читаем из них время, формируем объект Date именно с этого времени
    4. Начинаем отсчет для каждого span-a путем привязки к нему функции.

    Чуть позже напишу пример.
     
  5. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    а еше есть timer для jquery
     
  6. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    Padaboo
    Не, пока без jquery делаю.
     
  7. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Простейший пример без математических рассчетов:

    HTML:
    1. <title>Sample</title>
    2.  
    3. function Run(id) {
    4.     setInterval(function() {
    5.         id.innerText = new Number(id.innerText) + 1;
    6.     }, 1000);
    7. };
    8.  
    9. window.onload = function() {
    10.     for(var i = 1;; i++) {
    11.       var element = document.getElementById("sample-" + i);
    12.        
    13.         if(element) {
    14.             Run(element);
    15.         } else break;
    16.     }
    17. }
    18.  
    19. </head>
    20.  
    21. <span id="sample-1">1277737244</span>
    22. <span id="sample-2">1277737251</span>
    23. <span id="sample-3">1277737264</span>
    24.  
    25. </body>
    26. </html>
     
  8. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    [js]<script language="javascript">
    function timer(id)
    {
    var d = new Date();
    var timestamp = ge('start-'+id).innerHTML;
    var r = timestamp - d.getTime();

    if(r > 0)
    {
    var result = '';

    var m1 = Math.floor(r / 86400000);//day
    var m2 = Math.floor((r - 86400000 * m1) / 3600000);//hours
    var m3 = Math.floor((r - 86400000 * m1 - m2 * 3600000) / 60000);//minutes
    var m4 = Math.floor((r - 86400000 * m1 - m2 * 3600000 - m3 * 60000) / 1000);

    if(m1 >= 1) result += m1+'д. ';
    result += m2+'ч. '+m3+'м. '+m4+'сек.';

    ge('timer-'+id).innerHTML = result;
    }
    else ge('timer-'+id).innerHTML = 'Истекло';
    }

    function Run(id)
    {
    setInterval(function(){timer(id);}, 1000);
    }

    window.onload = function()
    {
    for(var i = 1;; i++)
    {
    var element = ge('start-'+i);

    if(element) Run(i);
    else break;
    }
    }

    </script>[/js]
    HTML:
    1. <span id="timer-1"></span><span id="start-1" style="display:none">1277857786000</span><br>
    2. <span id="timer-2"></span><span id="start-2" style="display:none">1277857386000</span>
    Все работает как надо. Единственное не то, что дублировать спан пришлось для хранения точки отсчета.

    Apple
    Спасибо, помог.
     
  9. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Зачем?
    Существуют атрибуты, в них можно хранить что угодно.
    Смотри:

    HTML:
    1. <span id="timer-2" start="10" finish="20">Something here</span>
    [js]window.onload = function() {
    var element = document.getElementById("timer-2");

    // Читаем атрибуты
    var time_start = element.getAttribute("start");
    var time_finish = element.getAttribute("finish")
    }[/js]

    Я писал очень большой проект для одного московского пентхауса, там на странице было около 500 блоков.
    Каждый блок был ячейкой таблицы и у каждого из блоков мог быть свой цвет, привязанный контент, и, главное, непосредственная связь с навигационным меню, в котором было всего 20 элементов, но у них была тесная взаимная связь с обоими менюшками.
    Как бы это сделать без атрибутов?
    Все способы в десятки раз более затратные.
     
  10. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    Apple
    Хм, я думал впихнуть в какойто атрибут стартовое число (в title="" например и юзать как getElementById('any').title). Не знал про то что свои произвольные можно задавать.
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    много чего еще можно, пока не ввели строгую спецификацию... надеюсь, что никогда ее не введут...
     
  12. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Ты о чем? Какая нафиг спецификация?
    Есть спецификация XML, которая позволяет эти манипуляции на всех уровнях.
    Это абсолютно допустимо размечать не только свои атрибуты, но и теги, и объекты.
     
  13. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я не про xml
    хотят же в html впендюрить строгость. когда если че не так - броузер не игнорит, а ненавидит всех и вся.