2014-02-05 4 views
0

У меня есть простой скрипт для переключения изображения/текста на onmouseover. Код работает нормально, если не более 2 сообщений, но он становится ОЧЕНЬ медленным, когда число сообщений увеличивается.Медленное выполнение сценария JS

function showPost(ele, eve) { 
    var id = ele.id.replace("post-", ""); 
    if (typeof window['timerHide-' + id] !== "undefined") { 
     clearInterval(window['timerHide-' + id]); 
    } 
    var target = (eve.relatedTarget) ? eve.relatedTarget : eve.toElement; 
    var parent = $("post-" + id); 
    if (typeof target === "undefined" || target === parent || target.parentNode === parent || target.parentNode.parentNode === parent) { 
     return; 
    } 
    var img = $("post-img-" + id); 
    var txt = $("post-txt-" + id); 
    if (img.style.opacity === "") { 
     img.style.opacity = 1; 
    } 
    var opacity = img.style.opacity; 
    window['timerShow-' + id] = setInterval(function() { 
     if (opacity <= 0.1) { 
      clearInterval(window['timerShow-' + id]); 

      img.style.display = 'none'; 
      txt.style.display = 'block'; 
      txt.style.opacity = 1; 
     } 
     img.style.opacity = opacity; 
     img.style.filter = 'alpha(opacity=' + opacity * 100 + ")"; 
     opacity -= opacity * 0.1; 
    }, 1); 
}; 

Другая функция почти identitcal к этому для этого она скрывает переключены текст, за исключением.

Thx

+2

setInterval (Foo, 1) довольно требовательны, вы выполняете функцию обратного вызова каждую миллисекунду, рассмотрите более высокий интервал (и, в конечном счете, отрегулируйте шаг вашей анимации). – FabienAndre

+0

Возможно, вы даже столкнетесь с интервалами, короткими, чем время вызова => серьезные проблемы. –

+1

Это выглядит довольно страшно для решения проблемы, которая звучит так, будто ее можно решить с помощью чистого CSS или минимального сценария. Легче помочь, если вы предоставите jsfiddle своей попыткой. – tobi

ответ

0

Вы, кажется, сохраняя интервал ID к DOM элементу, попробуйте использовать переменную

var timerID = setInterval(function() 
if (opacity <= 0.1) 
{ 
    clearInterval(timerID); 
+0

Если вы находитесь в глобальной области действия, 'var foo; 'foo' в окне; // true' –

+1

При тестировании этого в консоли запись переменной в окно возвращает 0 в области setInterval. – Fletcher91

+0

Мне нужно * таймер * переменные должны быть глобальными для установки и очистки интервалов для каждого сообщения. Постскриптум function $ (ele) {return document.getElementById (ele);} == no JQuery – sitilge

Смежные вопросы