[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Хочу поделится опытом clearInterval
Xes
intervalFotoUp = setInterval("AnimationFotoUp()", 500);

при присвоении два (и более) раз setInterval одной и той же переменной. Например создали интервал, через секунду еще раз его создали.
Создаются два разных интервала причем второй имеет неизвестный мне идентификатор т.к. написание два раза подряд clearInterval не помогает.

В своем случае я сделал так:
Убиваем существующий интервал и возобновляем его вновь.
//Поднять фото. Прием ответа сервера.
function FotoUpShow(){
if(ResponseParse.otvet.flag == true){
if(!window.ObjectsAnimationFotoUp)
ObjectsAnimationFotoUp = {};
var time = new Date();
time = time.valueOf();
ObjectsAnimationFotoUp[time] = ResponseParse.otvet;
if(window.intervalFotoUp)//Вот тута
clearInterval(intervalFotoUp);//Вот тута
intervalFotoUp = setInterval("AnimationFotoUp()", 500);
}else{


Кто сталкивался с подобным почему два интервала создается, если я их к одному и тому же идентификатору присваиваю?
Или почему тогда они (два) не пропадают при написании два раза подряд строки
clearInterval(intervalFotoUp);




Спустя 1 час, 4 минуты, 35 секунд (15.10.2011 - 19:07) redreem написал(а):
так во всех браузерах? может это глюк в каком-то просто?

Спустя 4 часа, 28 минут, 28 секунд (15.10.2011 - 23:36) Xes написал(а):
Цитата (redreem @ 15.10.2011 - 16:07)
так во всех браузерах? может это глюк в каком-то просто?

В опере и лисе.

Спустя 1 час, 33 минуты, 29 секунд (16.10.2011 - 01:09) Invis1ble написал(а):
Может просто не нужно два раза вызывать setInterval() ?
Думаю, тут аналогия с php примерно такая:
ты 2 раза вызываешь mysql_connect(), при этом (если не ошибаюсь) будет соответственно созданно 2 различных коннекта. И если ты напишешь
$dbh = mysql_connect('host', 'user', 'pass');

то получится, что ты создал 2 коннекта, но идентификатор у тебя есть только от последнего => при попытке дисконнекта ты сможешь закрыть только последнее соединение
mysql_close($dbh);

На мой взгляд, вполне логично применить эти умозаключения и к setInterval()

Спустя 7 часов, 3 минуты, 46 секунд (16.10.2011 - 08:13) redreem написал(а):
ну вот видимо разарботчкики оперы и лисы решили что это действо целиком и полностью лежит на совести прогера (мало ли что прогеру в голову придет), а остальные подумали, что лучше нахх закрыть енту дырку. вот и все. берем на заметку и спим спокойно smile.gif

Спустя 2 дня, 14 часов, 52 минуты, 8 секунд (18.10.2011 - 23:05) killer8080 написал(а):
Цитата (redreem @ 16.10.2011 - 08:13)
, а остальные подумали, что лучше нахх закрыть енту дырку. вот и все. берем на заметку и спим спокойно

Бред какой то. ТС взял и, непонятно почему, использовал одну переменную для двух вызовов setInterval, логика мне вообще не понятна. Естественно там будет храниться только идентификатор последнего таймера. Откуда там может взяться предыдущий. О каких дырках идёт речьuser posted image

Спустя 7 минут, 11 секунд (18.10.2011 - 23:12) Invis1ble написал(а):
не удержался smile.gif
о дырках в голове

Спустя 3 часа, 16 минут, 22 секунды (19.10.2011 - 02:29) redreem написал(а):
автор не использовал одну переменную явно и логически. дублирование - это уже последствия человеческого фактора и относится к классу неявных ошибок. не понимаете суть - че трепаться?

Спустя 1 час, 54 минуты, 3 секунды (19.10.2011 - 04:23) Invis1ble написал(а):
Цитата
автор не использовал одну переменную явно и логически. дублирование - это уже последствия человеческого фактора и относится к классу неявных ошибок.

Да ты что? А сколько же он использовал?
Цитата
при присвоении два (и более) раз setInterval одной и той же переменной


Спустя 1 час, 26 минут, 52 секунды (19.10.2011 - 05:49) redreem написал(а):
читаем код. моделируем ситуацию.

Спустя 10 минут, 40 секунд (19.10.2011 - 06:00) Invis1ble написал(а):
Как можно что-то корректно "смоделировать", если он даже не показывает собственно вызов функции?

Спустя 4 часа, 43 минуты, 5 секунд (19.10.2011 - 10:43) killer8080 написал(а):
Цитата (redreem @ 19.10.2011 - 02:29)
дублирование - это уже последствия человеческого фактора и относится к классу неявных ошибок. не понимаете суть - че трепаться?

Человек ошибся в логике программирования, а вы вместо того чтоб указать ему на ошибку, несёте какую то чушь про дырки в браузерах.
Цитата (redreem @ 19.10.2011 - 05:49)
читаем код. моделируем ситуацию.

Что моделировать? Вызвал интервал, присвоил идентификатор. Вызвал снова интервал, присвоил той же переменной, первый идентификатор потерял безвозвратно. И что?

Спустя 22 часа, 46 минут, 40 секунд (20.10.2011 - 09:30) redreem написал(а):
Можешь XeS ответит прав я или нет всетаки?
Invis1ble, очевидно, что вызов функции происходит по реакции пользователя. Пользователь быстро тыкает подряд 2 раза и все.

killer8080, если у вас нет глубокого опыта отладки js-интерфейсов, то очевидно, чушь несете вы.

Спустя 37 минут, 26 секунд (20.10.2011 - 10:07) killer8080 написал(а):
Цитата (redreem @ 20.10.2011 - 09:30)
killer8080, если у вас нет глубокого опыта отладки js-интерфейсов, то очевидно, чушь несете вы.

Каюсь, нет у меня такого опыта ph34r.gif я не знаю как можно вернуть предыдущее значение переменной, после присвоения ей нового. smile.gif

PS почему нельзя просто признать, что ошибся huh.gif

Спустя 4 минуты, 9 секунд (20.10.2011 - 10:11) Invis1ble написал(а):
Цитата
if(window.intervalFotoUp)

возможно, попросту это не кроссбраузерная проверка

Спустя 6 минут, 41 секунда (20.10.2011 - 10:18) redreem написал(а):
killer8080, ошибся? я предположил реальный сценарий, который вполне реален. Если дело в другом, то возможно, я не утверждал на 100% что только так и никак иначе.

Спустя 4 минуты, 30 секунд (20.10.2011 - 10:23) killer8080 написал(а):
Цитата (Invis1ble @ 20.10.2011 - 10:11)
Цитата
if(window.intervalFotoUp)

возможно, попросту это не кроссбраузерная проверка

Нет, тут как раз всё нормально. Глобальные переменные в JS являются свойствами объекта window, и таким способом можно корректно проверять наличие переменной.
Тут в другом дело, раз вызовов может быть много, нужно было просто пихать идентификаторы в массив. Например так
var timers = [];

timers[] = setInterval("someFunc()", 500);
timers[] = setInterval("someFunc()", 500);
timers[] = setInterval("someFunc()", 500);

а убивать их всех разом, в цикле

for(var i = 0; i < timers.length; i++){
clearInterval(timers[i]);
}
timers = [];

не видя кода трудно советовать что то более конкретное.

Спустя 18 минут, 29 секунд (20.10.2011 - 10:41) redreem написал(а):
автор не просил решения, он просто поделился наблюдением о поведении clearInterval. если говорить о решении, то да, самое правильное строить очередь вручную массивом.

Спустя 1 минута, 34 секунды (20.10.2011 - 10:43) redreem написал(а):
хотя тут тоже надо смотреть на реальную страницу. возможно логика интерфейса не подразумевает анимационную очередь. тогда нужно держать флаг: animationInProcess и если он true - запрещать создание нового интервала.

Спустя 12 минут, 39 секунд (20.10.2011 - 10:55) Invis1ble написал(а):
массив - это конечно хорошо, но. Я тут ради принципа набросал тестовый код, так вот ТС попросту морочит голову - и в Opera и в FF и в GC - везде все корректно работает.
<!DOCTYPE html>
<html>
<head>
<title>
test</title>
<script
type="text/javascript" src="js/jquery-1.5.1.min.js"></script>
<script
type="text/javascript">
function
func() {
$('#container').append('Hello world<br />');
}

function func2() {
if (window.interval)
clearInterval(interval);
interval = setInterval(func, 1000);
}

$(document).ready(function() {
$('#button').click(function() {
func2();
});
});
</script>
</head>
<body>
<div
style="margin: 50px auto" id="container"></div>
<input
type="button" id="button" value="test" />
</body>
</html>

Спустя 3 минуты, 17 секунд (20.10.2011 - 10:59) killer8080 написал(а):
Пардон, я тут тоже накосячил. В js так нельзя
timers[] = setInterval("someFunc()", 500);

нужно так
timers.push(setInterval("someFunc()", 500));
Цитата (redreem @ 20.10.2011 - 10:43)
хотя тут тоже надо смотреть на реальную страницу. возможно логика интерфейса не подразумевает анимационную очередь. тогда нужно держать флаг: animationInProcess и если он true - запрещать создание нового интервала.

согласен, не зная логику приложения ничего конкретно сказать нельзя :)

Спустя 2 минуты, 17 секунд (20.10.2011 - 11:01) Invis1ble написал(а):
Причем тут логика приложения, ТС пишет про clearInterval (читаем название топика).
Так вот я заявляю - все работает. Логика приложения - это уже другой вопрос, непосредственно к clearInterval не имеющий отношения.

Спустя 30 минут, 59 секунд (20.10.2011 - 11:32) killer8080 написал(а):
Invis1ble
про логику я сказал, потому что мне не понятно зачем нужно перезапускать интервал, если он уже работает. Контекст вызова AnimationFotoUp() ведь не меняется. user posted image

...
if(window.intervalFotoUp)//Вот тута
clearInterval(intervalFotoUp);//Вот тута
intervalFotoUp = setInterval("AnimationFotoUp()", 500);
...

Спустя 2 минуты, 51 секунда (20.10.2011 - 11:35) Michael написал(а):
Во, даете. smile.gif

Цитата (Xes)
Кто сталкивался с подобным почему два интервала создается, если я их к одному и тому же идентификатору присваиваю?

А что написано что не создадутся что ли? Идентификатор нужен только чтобы можно было по нему очистить потом.

Цитата (Xes)
В своем случае я сделал так:

Вполне корректный код. Так и делается если ты хочешь стартовать интервалы заново от момента получения аякс ответа.

Спустя 13 минут, 50 секунд (20.10.2011 - 11:49) Invis1ble написал(а):
Цитата
А что написано что не создадутся что ли? Идентификатор нужен только чтобы можно было по нему очистить потом.

так автор вроде как и пишет, что не очищается ранее созданный интервал (насколько я понял)

Спустя 8 часов, 26 минут, 5 секунд (20.10.2011 - 20:15) kirik написал(а):
Цитата (Xes @ 15.10.2011 - 11:03)
Например создали интервал, через секунду еще раз его создали.
Создаются два разных интервала причем второй имеет неизвестный мне идентификатор

Так всё верно.. intervalFotoUp находится в глобальной области видимости, и вызывая несколько раз подряд FotoUpShow() значение intervalFotoUp перезаписывается новым ID таймера, а старый, соответственно, теряется. И обратиться к первому уже никак не получится.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.