VBsupport перешел с домена .ORG на родной .RU
Ура!
Пожалуйста, обновите свои закладки - VBsupport.ru
Блок РКН снят, форум доступен на всей территории России, включая новые терртории, без VPN
На форуме введена премодерация ВСЕХ новых пользователей
Почта с временных сервисов, типа mailinator.com, gawab.com и/или прочих, которые предоставляют временный почтовый ящик без регистрации и/или почтовый ящик для рассылки спама, отслеживается и блокируется, а так же заносится в спам-блок форума, аккаунты удаляются
Если вы хотите приобрести какой то скрипт/продукт/хак из каталогов перечисленных ниже: Каталог модулей/хаков
Ещё раз обращаем Ваше внимание: всё, что Вы скачиваете и устанавливаете на свой форум, Вы устанавливаете исключительно на свой страх и риск.
Сообщество vBSupport'а физически не в состоянии проверять все стили, хаки и нули, выкладываемые пользователями.
Помните: безопасность Вашего проекта - Ваша забота. Убедительная просьба: при обнаружении уязвимостей или сомнительных кодов обязательно отписывайтесь в теме хака/стиля
Спасибо за понимание
Задача такая, под аватаркой должен тикать таймер до даты указанной в доп поле профиля юзера. При достижении даты, выводится определённый текст, заданный в скрипте.
Скрипт есть, но работает он почему-то только 1 раз, при первом вызове скрипта на странице. У остальных юзеров он не работает. Подскажите решение задачи.
Код скрипта:
Code:
var userData;
function TrialIn(){
var now = new Date();
var endData = new Date(userData);
var totalRemains = (endData.getTime()-now.getTime());
if (totalRemains>1)
{
var RemainsSec=(parseInt(totalRemains/1000));
var RemainsFullDays=(parseInt(RemainsSec/(24*60*60)));
var secInLastDay=RemainsSec-RemainsFullDays*24*3600;
var RemainsFullHours=(parseInt(secInLastDay/3600));
if (RemainsFullHours<10){RemainsFullHours="0"+RemainsFullHours};
var secInLastHour=secInLastDay-RemainsFullHours*3600;
var RemainsMinutes=(parseInt(secInLastHour/60));
if (RemainsMinutes<10){RemainsMinutes="0"+RemainsMinutes};
var lastSec=secInLastHour-RemainsMinutes*60;
if (lastSec<10){lastSec="0"+lastSec};
var mcend = Date.parse("Jan 1, 2012, 00:00:00");
var mcnow = now.getTime();
var mc = ((mcend-mcnow)/10).toFixed(0).substr(8);
document.getElementById('trial').innerHTML = '<img src="http://sb.uploads.ru/2WaV9.png"></img><br>'+ RemainsFullDays+ " д. " +RemainsFullHours+ " ч. " +RemainsMinutes+ " м. "+lastSec+ " с.";
setTimeout("TrialIn()",10);
}
else {document.getElementById("trial").innerHTML = "Free for Trial !!!";}
}
function timerstart(extEndData){
userData = extEndData;
document.writeln('<span id="trial"></span>');
TrialIn(extEndData);
}
Кривущий, конечно, у вас скрипт, но конкретно та проблема о которой вы спрашиваете связана с id контейнера div, в котором вы показываете таймер. id он на то и id, что должен быть уникальным у каждого контейнера и метод getElementById возвращает не массив всех узлов с указанным id, а один. Вот почему у вас только у одного работает таймер.
И если вы за этот скрипт заплатили кому-то, выдерните ему руки.
@Shinigami
Простоузер
Join Date: Sep 2005
Posts: 38
Версия vB: 4.2.х
Пол:
Reputation:
Novice 5
Репутация в разделе: 5
0
Всё с миру по нитке
А вот подправленная версия, контейнер создается динамически, путем добавления в его ID номер сообщения в теме.
Code:
var size=50; //число таймеров
var TimeoutID=new Array (size); //Массив ID таймеров
var Timeout=new Array (size); //Массив времени таймеров
function showtime (n) {
var t=Timeout[n];
if (t>0) {
var RemainsSec=(parseInt(t/1000));
var RemainsFullDays=(parseInt(RemainsSec/(24*60*60)));
var secInLastDay=RemainsSec-RemainsFullDays*24*3600;
var RemainsFullHours=(parseInt(secInLastDay/3600));
if (RemainsFullHours<10){RemainsFullHours="0"+RemainsFullHours};
var secInLastHour=secInLastDay-RemainsFullHours*3600;
var RemainsMinutes=(parseInt(secInLastHour/60));
if (RemainsMinutes<10){RemainsMinutes="0"+RemainsMinutes};
var lastSec=secInLastHour-RemainsMinutes*60;
if (lastSec<10){lastSec="0"+lastSec};
document.getElementById('clock'+n).innerHTML = '<img src="http://sb.uploads.ru/2WaV9.png"></img><br>'+ RemainsFullDays+ " д. " +RemainsFullHours+ " ч. " +RemainsMinutes+ " м. "+lastSec+ " с."
Timeout[n]-=10;
window.setTimeout('showtime('+n+');',10);
}
else if (t<1) {
document.getElementById('clock'+n).innerHTML = '';
//Убрать строку выше - счётчик не будет исчезать
window.clearTimeout (TimeoutID[n]);
//Обработку по истечении времени ставить сюда
}
}
function inittime (n,userData) {
//Номер таймера или номер поста, строка даты
var now = new Date();
var endData = new Date(userData);
var totalRemains = (endData.getTime()-now.getTime());
document.writeln ('<p><span id="clock'+n+'"</span></p>');
if (totalRemains>1){
TimeoutID[n]=window.setTimeout('showtime('+n+')', 10);
Timeout[n]=totalRemains;
}
}
Проблема так и осталась (хотя в простеньком статичном html работает несколько таймеров), но таймер теперь тикает не у первого пользователя, а у какого-нибудь одного другого....
Спасибо! Поправил)
Но на работу это никак не повлияло :(
Sellrion
Kernel panic
Join Date: Aug 2007
Location: Екатеринбург
Posts: 2,536
Версия vB: 3.8.x
Пол:
Reputation:
Гуру 1921
Репутация в разделе: 793
0
Не удивительно. Вообще, я бы на вашем месте попросил кого-нибудь переписать скрипт. Потому, что тут вообще хз, что творится. Например, каждый вызов SetTimeout требует обновления хранимого идентификатора, зачем вообще использовать clearTimeout в вашем случае, когда SetTimeout планирует код к выполнению только однократно, t - это целое число, если оно не больше нуля, значит и меньше единицы, какой смысл во втором условии. Зачем вызывать код каждые 10 миллисекунд? Секундного интервала для часов много чтоли? Потом, тут я могу ошибаться, но post.postcount - это количество постов у юзера, а не порядковый номер сообщения. Ну и т.д...
Вообще, если ваш код работает на статичной страничке, значит надо смотреть чего вы там на форуме еще понаделали.
Last edited by Sellrion : 05-07-2014 at 10:50 PM.
@Shinigami
Простоузер
Join Date: Sep 2005
Posts: 38
Версия vB: 4.2.х
Пол:
Reputation:
Novice 5
Репутация в разделе: 5
0
Sellrion, благодарю за наставления! В целом на форуме своих модернизаций почти нет (они незначительные, без всяких скриптов). Плюс пяток популярных модулей. В общем будем экспериментировать дальше...
P.S. post.postcount - всё же порядковый номер сообщения в теме. )
Last edited by Shinigami : 05-08-2014 at 10:58 AM.
post.postcount - всё же порядковый номер сообщения в теме.
может лучше postid взять? Всё-таки уникальней будет
Sellrion
Kernel panic
Join Date: Aug 2007
Location: Екатеринбург
Posts: 2,536
Версия vB: 3.8.x
Пол:
Reputation:
Гуру 1921
Репутация в разделе: 793
0
Дак вы ссылку на форум дайте.) Может посмотрим, что у вас там.
@Shinigami
Простоузер
Join Date: Sep 2005
Posts: 38
Версия vB: 4.2.х
Пол:
Reputation:
Novice 5
Репутация в разделе: 5
0
Вроде справились. Решили остановиться на статическом таймере.
Вот рабочий тестовый вариант, возможно кому-то пригодится:
Code:
var userData;
var nPost;
function TrialIn(){
var now = new Date();
var endData = new Date(userData);
var totalRemains = (endData.getTime()-now.getTime());
if (totalRemains>1)
{
var RemainsSec=(parseInt(totalRemains/1000));
var RemainsFullDays=(parseInt(RemainsSec/(24*60*60)));
var secInLastDay=RemainsSec-RemainsFullDays*24*3600;
var RemainsFullHours=(parseInt(secInLastDay/3600));
if (RemainsFullHours<10){RemainsFullHours="0"+RemainsFullHours};
var secInLastHour=secInLastDay-RemainsFullHours*3600;
var RemainsMinutes=(parseInt(secInLastHour/60));
if (RemainsMinutes<10){RemainsMinutes="0"+RemainsMinutes};
var lastSec=secInLastHour-RemainsMinutes*60;
if (lastSec<10){lastSec="0"+lastSec};
document.getElementById('trial'+nPost).innerHTML = RemainsFullDays+ " д. " +RemainsFullHours+ " ч. " +RemainsMinutes+ " м. ";
}
else {document.getElementById('trial'+nPost).innerHTML = "Время пришло!";}
}
function timerstart(extEndData,i){
userData = extEndData;
nPost = i;
document.writeln('<span id="trial'+i+'"></span>');
TrialIn();
}