Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Цикл завешивает страницу, помогите (https://javascript.ru/forum/jquery/42250-cikl-zaveshivaet-stranicu-pomogite.html)

Romingood 18.10.2013 20:44

Цикл завешивает страницу, помогите
 
Привет всем! Сорри за вопрос чайника!

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

Как быть?
Пытаюсь делать вот так:


<div><input type="button" value="Начать закачку объектов в базу" class="startbutton"><br>
<input type="checkbox" class="startcheckbox">Снять флажок для остановки процесса</div>

и далее уже в JS пишу


$('.startbutton').click(function(){
$(".startbutton").hide("fast");
$('.startcheckbox').attr('checked','checked');

$.each(pic, function(ind, val) { пошел цикл
});
</code>

Но всё зависает как только нажал startbutton
даже кнопка не исчезает, а только после цикла уже пропадает, когда мне это совсем не нужно.

А вот чекбокс кстати устанавливается в Checked.
но... снять его я не могу.

Как сделать легкий цикл? Чтобы в процессе можно было вводить что нть на странице.

или какой-нибудь более простой способ вручную НАЧАТЬ цикл и потом иметь возможность его ВРУЧНУЮ ПРЕРВАТЬ.

как?

danik.js 18.10.2013 21:38

Два решения:
1) Не использовать цикл. Использовать таймер через setInterval
2) Использовать WebWorker

Romingood 18.10.2013 22:57

Цитата:

Сообщение от danik.js (Сообщение 277140)
Два решения:
1) Не использовать цикл. Использовать таймер через setInterval
2) Использовать WebWorker

Насчет WebWorker начал копать, спасибо за наводку.

Что касается первого пункта, как же я обойдусь без цикла?
Если у меня на этой же странице чуть выше ПХП-шка генерирует массив, и он всегда разный.

1, 2, 55 элементов, или 2000...

Объясню с самого начала.
Их Пхп в Jquery передаю переменные так:

<input type=hidden id='num' value='массив ссылок через запятую'>";

дальше их принимаю и разбираю в массив уже в Яваскрипте

pic = $('#num').val().split(",");

И по каждому элементу массивав мне нужно выполнить определенные действия. Я умею только так:

$.each(pic, function(ind, val) { действия }

Может, как-то еще можно принять массив изх ПХП и выполнить действия над элементами массива (например, открыть все ссылки, или показать все картинки, не суть... )?

В принципе, всё работает, у меня там через Аякс открывается пхп файл и выдает результат. И так до 50 раз. Всё ок.

Но в процессе работы страница виснет в плане ввода, то есть я не могу остановить процесс. Че-то там выводит мне в дивы, пашет, но не отвечает на внешние раздражители )))

danik.js 19.10.2013 06:33

Цитата:

Сообщение от Romingood
не отвечает на внешние раздражители

Естественно. Потому что UI в одном потоке с твоими вычислениями. А значит пока что-то высчитывается UI виснет. Используй setInterval, делая вычисления пошагово, давая возможность юзеру нажать cancel.

BETEPAH 19.10.2013 10:54

Цитата:

Сообщение от danik.js
Используй setInterval

А я почему-то не люблю setInterval. Возможно, я просто не умею его готовить, но мне почему-то при его применении постоянно представляется наложение одних на другие вызовов функций, длительность исполнения которых может вдруг затянуться. Первая еще не закончила выполняться, а следом уже вторая подпирает.
Предпочитаю в таких случаях использовать setTimeout в конце функции с вызовом этой же функции.
danik.js, я заблуждаюсь?

danik.js 19.10.2013 14:30

Цитата:

Сообщение от BETEPAH
danik.js, я заблуждаюсь?

Не думаю. Возможно setTimeout подойдет лучше.


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