Я пытаюсь получить систему обратного отсчета с несколькими днями и минутами события из базы данных. Таких событий может быть много. После получения даты события я передаю эти значения в функцию javascript, которая на стороне клиента запускается каждую 1 секунду с помощью функции setTimout. Это отлично работает для одного события. Однако для многих событий как мне достичь той же функциональности. т.е. я хочу запускать функцию javascript для каждого события.

Я получаю некоторые переменные php из базы данных. например

while($row = mysql_fetch_array($query)){
$a = $row['day'];
$b = $row['minutes'];

}

Теперь мне нужно передать все эти значения внутри функции javascript. Если бы было только одно событие, я мог бы напрямую передать значения php. Но для нескольких событий я не понимаю, что делать. Я пробовал использовать функцию javascript внутри цикла while, но получаю ошибку function not defined, и это очевидно, потому что php запускается до javascrip. Любая логика или помощь приветствуются.

Благодарность

0
codingbbq 7 Авг 2010 в 13:17

2 ответа

Лучший ответ

В вашем PHP сначала создайте свой массив данных. Неважно, как вы это делаете, но в итоге это может выглядеть примерно так:

$data = array(
   array('day' => 1, 'minutes' => '15'),
   array('day' => 0, 'minutes' => '45'),
   array('day' => 15, 'minutes' => 52'),
   // etc.
);

Затем (все еще с PHP создайте функцию Javascript, например:

var data = <?= json_encode($data) ?>;  // encode your PHP data into JSON notation
var interval = setInterval(function() {
   for (var i=0; i<data.length; i++) {
      // do something with your data
      // data[i].day   ... data[i].minutes ... etc.
   };
}, 1000);   // run every 1 sec

Обратите внимание, что чем больше у вас данных, тем медленнее будет выполняться setInterval. Просто помните, что Javascript медленнее по сравнению с другими языками. Кроме того, setInterval предпочтительнее setTimeout в вашем случае, чтобы избежать накопления ваших вызовов в долгосрочной перспективе, поэтому вам не следует полагаться ни на setTimeout, ни на setInterval в течение 1 секунды. interval, но у вас должна быть переменная для расчета точного промежутка времени между каждым вызовом.

Что-то типа;

var last_time = new Date().getTime();

Затем внутри вашей функции setInterval узнайте, как долго последняя функция вызывалась с последнего раза (или впервые с момента загрузки страницы)

var cur_time = new Date().getTime();
var timespan = (cur_time - last_time) / 1000; // millis > sec
last_time = cur_time; // update last_time
...
0
Yanick Rochon 7 Авг 2010 в 09:36

Не запускайте N функций в JS, запустите ту, которая будет выполнять N операций. Передайте значения из PHP в виде массива JS, и в обработчике тайм-аута выполните итерацию по этому массиву. Ваш JS будет выглядеть примерно так:

// This line generated by PHP:
var thingies = ["Thingy 1", "Thingy 2", "Thingy3"];

// This is static JS:
function thingy() {
  for (var i in thingies) {
    processThingy(thingies[i];
  }
  setTimeout(thingy, 1000);
}

Или, как вариант, вы можете загрузить thingies с помощью AJAX позже; принцип тот же.

1
Amadan 7 Авг 2010 в 09:28