Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   работа settimeout с разной скоростью (https://javascript.ru/forum/css-html/6168-rabota-settimeout-s-raznojj-skorostyu.html)

arma 15.11.2009 17:18

работа settimeout с разной скоростью
 
Никто не замечал что settimeout в разных браузерах работает с разной скоростью? К примеру ставлю задержку 10 - в FF, chrom, safari работает одинаково быстро, в Opera просто ОЧЕНЬ быстро, а в ие(любом) ООЧень медлинно, - если скажем увеличиваю картинку, так вобще практически слайдшоу получается.
Нет ни у каво идей как это компенсируется, или выравнивается?

Octane 15.11.2009 19:11

Давайте вы сначала код покажите, чтобы мы не гадали, что там за мистика со временем творится?

arma 15.11.2009 19:55

код показывать не буду, поскольку вы мозги сломаете :), но смысл мне кажется я уже догоняю: у меня запускается одновременно несколько таймеров, для всех браузеров это нормально, а вот ие тупит... Тормозит. Как будто он думает так: ага, таймер хочет запустится, стоп а вот ещё один, и ещё... нет, давайте-ка я всех поочереди, ибо я уродское, гадкое, и навсё наплюющее творение майкрософт :)
Я прав?

А несколько таймеров - это когда мышкой ведёш по ряду картинок, по наведению все картинки увеличиваются, по убиранию уменьшаются.

PepeL 15.11.2009 21:09

не прав! нет плохих браузеров есть плохие программисты :)

arma 15.11.2009 21:12

я спрашивал не про хороший/плохой ли браузер

Riim 15.11.2009 21:21

arma, тебе видней конечно о чем ты спрашивал, но вот я тоже сперва подумал, что в посте №3 вопрос о браузерах. По вопросу из первого поста, возможно, поможет эта статья: http://javascript.ru/tutorial/events/timing

arma 15.11.2009 21:34

Octane, код скажем такой:
<img id="1" src="fig.gif" count="0" width="100" height="100" onmouseover="dotime(this.id)" />
<img id="2" src="fig2.gif" count="0" width="100" height="100" onmouseover="dotime(this.id)" />
<img id="3" src="fign.gif" count="0" width="100" height="100" onmouseover="dotime(this.id)" />

function dotime(id)
{
  размер фотки++
  if (document.getElementById(id).count<10)
  {
    setTimeout(function(){dotime(id), 10);
    document.getElementById(id).count++;
  }
  else
  {
    chekout(id);
  }
}

function chekout(id)
{
  если мыш вылезла за пределы изображения
  {
    out(id);
  }
  else
  {
    setTimeout(function(){chekout(id), 10);
  }
}
function out(id)
{
  размер фотки--;
  if (document.getElementById(id).count>0)
  {
    setTimeout(function(){out(id), 10);
    document.getElementById(id).count--;
  }
}

поясню, что функция chekout ждёт, когда мыш вылезет за картинку, т.к. onmouseout бывает не срабатывает, когда по картинке очень быстро провести мышкой, или резко её с неё убрать.

arma 15.11.2009 21:48

Riim, я считаю, что веб-програмирование, - это бесконечная борьба с браузерами. В данной задаче меня выбешивает ИЕ, чаще бывает иначе. В посте 3 я спрашмвал, правильно ли то, что ие тупит из за того, что запущенно много таймеров, а про браузеры у меня своё сложившиеся мнение, которое веб-програмисту обсуждать с другими веб-програмистами просто тупа (а ля я считаю что этот круче, этот хуже... - заказчику на это глубако пливать).

За статью спасибо. Интересно.

Octane 15.11.2009 22:54

Зачем передавать id, если можно передать ссылку на элемент, чтобы не выполнять потом поиск этого элемента с помощью getElementById? :D

<img src="fig.gif" count="0" width="100" height="100" onmouseover="dotime(this)" alt="" />

function dotime(node)
{
  //размер фотки++
  if (node.count<10)
  {
    setTimeout(function(){    dotime(node)   }, 10);
    node.count++;
  }
  else
  {
    chekout(node);
  }
}

Кстати, так заметно быстрее должно заработать. Оптимизируйте, сделать один таймаут не сложно.

arma 15.11.2009 23:02

я думал ссылка на элемент по таймауту не передаётся :blink:
Блин, когда много пишеш некогда проверять, лиш бы работало :)
Спасибо!

arma 22.11.2009 04:13

да что мне не говори, что не делай, в 8 ие тормоза всё одно есть. В 6 нет, а в 8 есть. Конэчно это может быть из-за винды семёрки... Хотя врятли) 8 тупит при выше описанных действиях. Я с этим смерился:) Заказчикам проДЕМОНстрировал проект в опере :) Что делать... совесть болит, а кашелёк толст :)

eval 11.04.2011 17:09

столкнулся тоже с такой проблемой ))
скрипт выполняет следующее : появление дива
одновременно с добавлением прозрачности, изменяю позицию топ ...
(пример подсказок вконтакте - только вверх + размеры окна 500х400)
в IE и сафари плавней чем в других и это печально !
выдал что-то страшное в виде условия :
var crsSpeed=(/MSIE/.test(navigator.userAgent)) ? 1 : ((/Safari/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent)) ? 5 : 18);

crsSpeed ставлю в setTimeout

для IE попытался увеличить количество пикселей для позиции в 2 раза

сафари на ура - а вот в IE чуток ухудшилась эффектность появления на зато почти идентичная скорость

использовал для сравнения console.time() и console.timeEnd() колебания в 50-70ms !

смотрел вконтакте у них кстати похожая картина с изменение числа пикселей для IE (эффектность то не та...:))

в итоге прочитав то что нашел в инете по этому поводу и взглянув на свой код пришел к выводу что пора браться за оптимизацию, в этом многие беды - подобной проблемы

не надо сильно критиковать за страшное условие сверху ... только осваиваюсь с js :)

если у кого то есть какие то соображения по этому поводу, я не против посмотреть на решения которые нашли другие... потому что мое мне кажется "отсталым"


спустя пару часов отдыха, пришла мысль : что бы при появлении присваивать не по 0.1 opacity, а по 0.2 и соответственно не 10 раз вызывать метод(как для нормальных браузеров:)) а 5 конкретно для IE 8, немного поправил значения в условии
var crsSpeed=(/MSIE\s8/.test(navigator.userAgent)) ? 2 : ((/Safari/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent)) ? 22 : 14);
результат console.time показал у chrome, firefox, opera, IE 8 (250-280ms -- кстати IE 8 : 250 :)) погрешность 20-30ms что очень радует.
итог IE*2 = cross browser :) - кстати safari 5.0.4 так же как и IE 8 пришлось запускать 5 раз и setTimeout 22
можно сказать что в моем случаи решение найдено почти идеально.
может не по теме но все же : console time для ie - мне кажется нужная вещь ))
//console.time implementation for IE
if(window.console && typeof(window.console.time) == "undefined") {
    console.time = function(name, reset){
        if(!name) { return; }
        var time = new Date().getTime();
        if(!console.timeCounters) { console.timeCounters = {} };
        var key = "KEY" + name.toString();
        if(!reset && console.timeCounters[key]) { return; }
            console.timeCounters[key] = time;
        };
    console.timeEnd = function(name){
        var time = new Date().getTime();
        if(!console.timeCounters) { return; }
        var key = "KEY" + name.toString();
        var timeCounter = console.timeCounters[key];
        if(timeCounter) {
            var diff = time - timeCounter;
            var label = name + ": " + diff + "ms";
            console.info(label);
            delete console.timeCounters[key];
        }
        return diff;
    };
}

Кто знает может кому-то пригодится подобный взгляд на setTimeout...


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