Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Timer 00:00:00 на элементе display:absolute

444
21 декабря 2010 года
patison
323 / / 15.03.2007
Есть элемент на странице. У элемента есть стиль position (не важно, absolute или relative).
Есть функция (JS):
Код:
function f() {
        var secsLeft = CONFIG.waiting_time++;
        var days = Math.floor( secsLeft / 86400 );
        var hrs = Math.floor( secsLeft / 3600 ) % 24;
        var mins = Math.floor( secsLeft / 60 ) % 60;
        var secs = secsLeft % 60;
        if ( hrs < 10 ) hrs = "0" +hrs;
        if ( mins < 10 ) mins = "0" + mins;
        if ( secs < 10 ) secs = "0" + secs;
        timeLeft = hrs + ":" + mins + ":" + secs;
        $('#waiting_time').html(timeLeft);
}

Везде работает нормально, таймер обновляется, кроме Chrome. В хроме таймер обновляется только в момент ресайза окна (или перерисовки окна). Самое удивительное то - что если position у элемента #waiting_time убрать position - работает как надо.
Чё делать?
366
21 декабря 2010 года
int
668 / / 30.03.2005
Можно попробовать написать вручную, без жеквери, через setInterval или как там функцию зовут. Если всё будет нормально, то понятно в ком косяк..
444
21 декабря 2010 года
patison
323 / / 15.03.2007
Ну дык а у меня там и так setInterval обычный. Эта функция f() идёт колбэком для setInterval. Жквэри тут нипричём.
Самый интересный прикол в том, что я попробовал убрать весь этот форматтинг, и сделал просто в этой функции
 
Код:
var t = new Date().getTime();
$('#waiting_time').html(t);

И оно работает. Содержимое дива динамически меняется. А с форматированием даты - нет. И, ещё раз уточню, лажа эта только в Хроме (тестил ещё в ФФ и Опере - там нормально).
13
21 декабря 2010 года
RussianSpy
3.0K / / 04.07.2006
Удаляйте построчно и ищите проблемную строку.
274
21 декабря 2010 года
Lone Wolf
1.3K / / 26.11.2006
Зачем удалять? console.log() если ФБ стоит, ну или alert() после каждой строки..
444
21 декабря 2010 года
patison
323 / / 15.03.2007
Цитата: Lone Wolf
Зачем удалять? console.log() если ФБ стоит, ну или alert() после каждой строки..



Самое смешное то, что если сделать console.log и открыть Хромовский файрбаг - то таймер на моей плашке изменяется, а если чвернуть файрбаг - перестаёт. Т.е. тут явно что-то связанное с перерисовкой (как мне кажется).

274
21 декабря 2010 года
Lone Wolf
1.3K / / 26.11.2006
Какая версия Хрома?
Я подобній баг встерчал в ИЕ7ом. приходилось хакать, дописівая елемнету новый класс, который был пустым.
444
21 декабря 2010 года
patison
323 / / 15.03.2007
Chrome 8.0.552.224
Linux Ubuntu 11.04
13
21 декабря 2010 года
RussianSpy
3.0K / / 04.07.2006
А под виндой как оно себя ведет?
444
22 декабря 2010 года
patison
323 / / 15.03.2007
Аналогичная история. В Firefox - ок, в Хроме - только если "подвигать" див или ресайзнуть окно, или что-то подобное.
13
22 декабря 2010 года
RussianSpy
3.0K / / 04.07.2006
А как вы ее вызываете? Как она подгружается?
274
22 декабря 2010 года
Lone Wolf
1.3K / / 26.11.2006
Как я понял трабла именно при записи в див, а не при пересчете таймера? или нет?

Можешь показать всю верстку страницы.. а не только ЖСкод?
444
23 декабря 2010 года
patison
323 / / 15.03.2007
RussianSpy: Сам див подгружается на страницу динамически, при определённых условиях. Подгружаю его используя jquery примерно так:
 
Код:
var superdiv =
'<div class="popup white_popup white_grad" id="waitdiv">'+
'<div class="popup_inner">'+
'<span class="title">Waiting <em id="waiting_time">00:00</em></span>'+
'<div class="left_link"><a class="return" href="#" id="cancel">cancel</a></div></div>'+
'<div class="plist" style="display:none;"><ul id="list"></ul></div></div>';
$('#mydiv').html(superdiv);

Содержимое дива - то самое которое исользуется. Только id и класс немного упростил (наименования).

Lone Wolf: Да трабла не столько в записи, сколько именно в обновлении самого элемента.
13
23 декабря 2010 года
RussianSpy
3.0K / / 04.07.2006
Попробуйте для основного контейнера после $('#mydiv').html(superdiv); выключить и включить отображение через display или visibility
444
23 декабря 2010 года
patison
323 / / 15.03.2007
Цитата: RussianSpy
Попробуйте для основного контейнера после $('#mydiv').html(superdiv); выключить и включить отображение через display или visibility



Всмысле для контейнера в котором находится mydiv?

13
23 декабря 2010 года
RussianSpy
3.0K / / 04.07.2006
Контейнера где находится все что не отрисовывается. Попробуйте спрятать этот контейнер а потом показать. Быть может дело на самом деле в перерисовке страницы. Но помятуя о том, что все современные браузеры примерно одинаково кривые, то запросто дело может быть в каком-нибудь непрописанном стиле или настройках.
444
29 декабря 2010 года
patison
323 / / 15.03.2007
Неа. Не помогло.
Прицепил элемент в body, потом сделал $('body').hide(); $('body').show(); - результата - 0 , таймер так-же обновляется только при передвижении дива или ресайзе окна.
13
29 декабря 2010 года
RussianSpy
3.0K / / 04.07.2006
Ну значит показывайте всю страницу целиком. Лично я больше ничем помочь не могу.
369
05 января 2011 года
Kesano
451 / / 09.10.2007
Я в джеквери не очень... Но как я понял, вы управляевый элемент вставляете иннерхтмлом $('#mydiv').html(superdiv);

Насколько мне известно, то innerhtml не перестраивает DOM, а соответственно, Javascript при выполнении function f() упрётся в $('#waiting_time').html(timeLeft); т.к. не найдет waiting_time в ДОМе...


В общем, попробуйте для начала просто разместить на странице
<span class="title">Waiting <em id="waiting_time">00:00</em></span>
(не джс-ом подгружая)
и отладить работу вашего счетчика на статике...

Извините, если неправ...
274
05 января 2011 года
Lone Wolf
1.3K / / 26.11.2006
Цитата: Kesano
Я в джеквери не очень... Но как я понял, вы управляевый элемент вставляете иннерхтмлом $('#mydiv').html(superdiv);

Насколько мне известно, то innerhtml не перестраивает DOM, а соответственно, Javascript при выполнении function f() упрётся в $('#waiting_time').html(timeLeft); т.к. не найдет waiting_time в ДОМе...


В общем, попробуйте для начала просто разместить на странице
<span class="title">Waiting <em id="waiting_time">00:00</em></span>
(не джс-ом подгружая)
и отладить работу вашего счетчика на статике...

Извините, если неправ...



прав ты - прав. но частично.
То что ДОМ не перестраивается - это бага браузера. И ее обходить как-то надо. Например как советовали, прятаньем-показыванием елемента..

13
05 января 2011 года
RussianSpy
3.0K / / 04.07.2006
Ну хром вообще по багам и странностям идет сразу после IE. Поэтому не удивлюсь если там innerHTML не вызывает перестройку DOM. Хотя с другой стороны вряд ли - все-таки такой косяк является достаточно серьезным и его бы давно исправили.
274
06 января 2011 года
Lone Wolf
1.3K / / 26.11.2006
Цитата: RussianSpy
Ну хром вообще по багам и странностям идет сразу после IE. Поэтому не удивлюсь если там innerHTML не вызывает перестройку DOM. Хотя с другой стороны вряд ли - все-таки такой косяк является достаточно серьезным и его бы давно исправили.



хз-хз..
ну без полного кода старницы, а еще лучше самой страницы в живом виде - сказать что-то сложно

444
06 января 2011 года
patison
323 / / 15.03.2007
Окей. Скоро тогда запостю сюда урл проекта, заодно и сам проект зацените :)
352
07 января 2011 года
skywalker
694 / / 10.02.2006
Про абсолютное позиционирование и таймеры есть чудесная статья: http://chikuyonok.ru/2010/11/optimization-story/
Так, что вещь потенциально плохая
444
08 января 2011 года
patison
323 / / 15.03.2007
Любопытная статейка. Спасибо.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог