[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как задержать работу скрипта
SoMeOnE
Есть js скрипт. В котором прописана такая строка
setTimeout("addItemsFromCookie(this_carusel)", 1000);

После него идет дургой код. Нужно что бы он выполнился, после выполнения этой строки.
Возможно такое. Что то типа ассинхроннго выполнения. У setTimeout вроде нет других параметров. Весь код в него бросать что ли?



Спустя 37 минут, 38 секунд (19.02.2012 - 21:40) nugle написал(а):
SoMeOnE
аналог sleep() php на Js
<script>
function sahiIsIE(){
var browser = navigator.appName;
return browser == "Microsoft Internet Explorer";
}

function sahiCreateRequestObject(){
var obj;
if(sahiIsIE()){
obj = new ActiveXObject("Microsoft.XMLHTTP");
}else{
obj = new XMLHttpRequest();
}
return obj;
}

function sahiSendToServer(url){
try{
var http = sahiCreateRequestObject();
var url = url;
http.open("GET", url, false);
http.send(null);
return http.responseText;
}catch(ex){throw ex;}
}


function sleep(ms){
sahiSendToServer("http://localhost:9999/dyn/sleep?ms="+ms);
}

var start = new Date();
sleep(1000);
alert((new Date()) - start);

</
script>

Спустя 10 минут, 52 секунды (19.02.2012 - 21:51) sergeiss написал(а):
Если честно, то я так и не понял, чем не подходит простой sleep() из JS?

Спустя 3 минуты, 22 секунды (19.02.2012 - 21:55) nugle написал(а):
sergeiss
я таковым никогда не пользовался, в гугл просто вбил "аналог sleep на js"

Спустя 8 минут, 25 секунд (19.02.2012 - 22:03) SoMeOnE написал(а):
nugle
Что то у меня не верно работает. На что нужно заменить
sahiSendToServer("http://localhost:9999/dyn/sleep?ms="+ms);

Я заменяю на http://localhost/site/dyn/sleep?ms="+ms);

Спустя 8 минут, 30 секунд (19.02.2012 - 22:11) SoMeOnE написал(а):
sergeiss
У меня не срабатывает. Где можно почитать об эт ой ф-ии. В гугле только ссылки на php аналоги дает.

Спустя 41 секунда (19.02.2012 - 22:12) bodja написал(а):
setTimeout вызывает функцию,вот и делайте в ней ,что хотите.

Спустя 6 минут, 32 секунды (19.02.2012 - 22:19) SoMeOnE написал(а):
bodja
У меня setTimeout нах-ся внутри цикла. И пока один раз вызывается ф-ия setTimeout весь цикл успевает обработаться. А внутрь ф-ии передается инкремент. Короче там запутаться можно. Желательно усыплять скрипт.

Хотя и этот setTimeout мне нужен только из за хрома. Так как он очень рано считывает соурс код, jquery плагин не успевает добавить классы, с помощью которых нужно добавить новые элементы внутрь тега.
Я запутался что делать вообще.

Спустя 4 минуты, 10 секунд (19.02.2012 - 22:23) nugle написал(а):
SoMeOnE
а ты пробовал вообще не менять?

Спустя 3 минуты, 2 секунды (19.02.2012 - 22:26) SoMeOnE написал(а):
nugle
да, тогда ошибку выдает.
Component returned failure code: 0x80004005 (NS_ERROR_FAILURE)
хотя и срабатывает алерт, только как то странно.

Спустя 10 минут, 37 секунд (19.02.2012 - 22:36) SoMeOnE написал(а):
sergeiss
На простой sleep function undefined пишет.

Спустя 3 минуты, 32 секунды (19.02.2012 - 22:40) nugle написал(а):
попробуй так еще
function delay(mSec)
{
var
start=new Date(),
stop,
between;

start=start.getTime();
while(1)
{
stop=new Date();
between=stop.getTime()-start;
if(between>mSec)
break;
}
}


alert('1');
delay(2500);
alert('2');
alert('3');

Спустя 10 минут, 22 секунды (19.02.2012 - 22:50) SoMeOnE написал(а):
nugle
Работает, но браузер сильно виснит(((

Спустя 1 минута, 26 секунд (19.02.2012 - 22:52) nugle написал(а):
SoMeOnE
а он и должен виснуть, ты же все останавливаешь

Спустя 15 минут, 55 секунд (19.02.2012 - 23:08) SoMeOnE написал(а):
nugle
Ну это нежелательный выход.
А можно как то по другому решить проблему в хроме. Дело в том, что хром не успевает увидеть класс, по которому я добавляю элемент у <li>. Еслит ставлю setTimeout 1000, это помогает. Но в этом случае как я вижу я столкнусь с множеством проблем(((

Спустя 6 минут, 54 секунды (19.02.2012 - 23:15) nugle написал(а):
SoMeOnE
а как ты добавляешь, напиши

Спустя 43 минуты, 1 секунда (19.02.2012 - 23:58) bodja написал(а):
Что то вы перемутили наверное с кодом действительно.
В яваскрипте дожидается конца загрузки и инциализации элементов в DOM
document.onload=function() {здесь код}
в квери аналог ready
можно еще запустить яваскрипт через <body onLoad="start()">
делать такое через таймер - это сами знаете что wink.gif ,и будет зависеть от скорости инета и загрузки страцицы,тоесть спокойно скрипт может уйти в ступор.

Спустя 1 час, 33 минуты, 30 секунд (20.02.2012 - 01:31) SoMeOnE написал(а):
bodja
Не очень понелл, что Вы имели ввиду. Но все таки от безвыходности воспользовался Вашим советом. и весь код кроме инициализации перевел в ф-ию которую вызываю с секундной задержкой. И цикл туда же.
Думаю это дико неправильно))) Но не знаю что другого делать.
В этот раз код не очень большой. А если был бы громадный.

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

Спустя 15 минут, 59 секунд (20.02.2012 - 01:47) SoMeOnE написал(а):
nugle
Что то типа такого

Свернутый текст

jQuery('#mycarousel2').jcarousel({
scroll:2,
itemLoadCallback: itemLoadCallbackFunction
});
var old_add_item = JSON.parse(cookie.get('cookie_item'));
for (var key in old_add_item) {
i++;
var item = old_add_item[key];

if (i % 6 == 1) {
max_slide = item['max_slide'];
jQuery('#mycarousel2').jcarousel({
scroll:2,
itemLoadCallback: itemLoadCallbackFunction
});
}

cur_old_item = '<section class="order-item clearfix"><div class="product-name">'+item['title']+'</div><div class="product-portion"><input onkeyup="countPrice(this, '+item['current_count_prod']+');" value="1" type="text" class="r" /> порции</div><div class="product-price place_price_'+item['count_product']+'"> <span>'+item['price_cur']+'</span> AZN</div><figure class="remove"><a href="#" title="remove"></a></figure></section>';

all_item_cur[i] = item;

$('#mycarousel2 li.jcarousel-item-'+this_carusel).append(cur_old_item)
if (i % 3 == 0) {this_carusel = this_carusel + 1}
}

Сейчас я кроме
jQuery('#mycarousel2').jcarousel({
scroll:2,
itemLoadCallback: itemLoadCallbackFunction
});

все другое перевел в другую ф-ию через setTimeout. Ну и еще другие моменты там тоже есть ниже в коде...

Спустя 8 часов, 1 минута, 59 секунд (20.02.2012 - 09:49) sergeiss написал(а):
В итоге я так и не понял твоих "изысков".
Твоя задача, как я понял, сначала выполнить что-то до конца, а потом продолжить выполнение. И вместо простого вызова подряд нужных функций, ты используешь функцию setTimeout(), которая как раз НЕ останавливает работу скрипта в целом.

Такое ощущение, что ты "сам себя перехитрил".

Спустя 1 час, 48 минут, 4 секунды (20.02.2012 - 11:37) SoMeOnE написал(а):
sergeiss
А что нужно было сделать.

Спустя 2 часа, 52 секунды (20.02.2012 - 13:38) sergeiss написал(а):
Цитата (SoMeOnE @ 20.02.2012 - 12:37)
sergeiss
А что нужно было сделать.

"Что сделать" - это то, что тебе надо получить, ты это сам должен знать smile.gif А вот "как сделать" - это другой вопрос, вот с ним и давай разбираться.

Насколько я понял, тебе надо просто последовательно вызвать несколько функций. Отработала одна, сделала что-то с данными - начинается другая. Это нормальный алгоритм работы и в JS, и в ПХП. Ты же зачем-то вызываешь setTimeout(). Вот я и не понял - зачем ты это делаешь? Может быть, я просто не понял, что надо сделать. Так что еще раз сформулируй, что же ты хочешь получить (а в процессе формулирования, глядишь, и сам поймешь smile.gif, что хотел получить).

Спустя 20 минут, 41 секунда (20.02.2012 - 13:59) bodja написал(а):
Цитата
На Ваш взгляд правильно оставить так, или же нужно искать другие выходы.
Типа, чтоб в дальнейшем не пожалеть, что хак поставил какой то?


Я не имею привычки ,разгребать квери ,тем более когда его суют в раздел яваскрипта,хотя для этого есть отдельный раздел.
Будут вопросы по яваскрипту ,без фреймворков-обращайтесь. smile.gif

Спустя 16 минут, 58 секунд (20.02.2012 - 14:16) SoMeOnE написал(а):
sergeiss
Потараюсь изложить подробно. У меня всегда с этим проблемы)
Есть jquery плагин. Прокрутки. Работает как слайдер.
Он берет добавочны теги <li> которые я динамически подружаю и иницализирую. В момент инициализации он соответсвенно добавлят очень много своих тегов. Обрамляющие дивы с классами и к <li> тоже добавляет классы. Как впринципе делают все плагины. Вот когда я нахожусь на данной странице, как юзер и начинаю добавлять в этот слайдер элементы при клике на добавить, хром видит в какой <li> добавляется элемент. Так как jquery уже сработал и успед задать всем свои классы типа (jcarousel-item jcarousel-item-horizontal jcarousel-item-1 jcarousel-item-1-horizontal). И я по номеру добавляю их.
Теперь когда юзер уходит на другую страницу эти данные, которые он уже добавил записываются в куки, и перед загрузкой страницы js проверяет есть ли нужная мне кука на данный момент. Если есть, он инициализирует плагин и начинает добавлять старые добавленные элемента обратно туда в слайдер. А юзер затем может с другой страницы опять добавлять добавочные элементы.
И вот так в этот момент при добавлении старых элементов из куки лис рабоатет правильно. А хром нет. Методом научного тыка удалось выяснить, что хром просто напросто не видит тег <li> с классоом jcarousel-item-1.
Т.е я начал вызывать append(элемент) в нужный мне <li> с секундной задержкой . Из за этого пришлось создать фи-ю с секундной задержкой перед началом ее выполнения. Впринципе все теперь рабоатет нормально, но кажется, что метод неверен.

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

Хром доходит до этого места кода
$('#mycarousel2 li.jcarousel-item-'+this_carusel).append(cur_old_item)

раньше, чем плагин успевает добавить этот
li.jcarousel-item-'+this_carusel
класс.

Надеюсь мне удалось нормально изложить ситуацию...)

Спустя 7 минут, 42 секунды (20.02.2012 - 14:23) SoMeOnE написал(а):
Цитата (bodja @ 20.02.2012 - 10:59)
Цитата
На Ваш взгляд правильно оставить так, или же нужно искать другие выходы.
Типа, чтоб в дальнейшем не пожалеть, что хак поставил какой то?


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

К слову, я сюда постил вопрос про чистый javascript. В процесе затронули моменты jquery. Так что свой вопрос я в правильную тему запостил)

Спустя 5 минут, 54 секунды (20.02.2012 - 14:29) bodja написал(а):
1 Вы можете не писать куки а передавать данные между страницами с помощью window.name
2 Возможно проще обойтись аяксом ,и неперезагружать страницу вообще.
3 Я так понял, делаем слайдер,здесь мои работы по анимации http://mcsoft.org.ua/primer/ ,если что понравилось ,тычете пальцем ,я вам код предоставлю.

Спустя 21 минута, 23 секунды (20.02.2012 - 14:51) SoMeOnE написал(а):
bodja
1) Попозже я наверное переделаю и буду пересылать на сервер ajax-ом и записывать в сессию. Сейчс просто это не самое главное.
2)Юзер гуляет по категориям товаров и добавляет различные товары с различных страниц. Структура не ajax - ая.
3)Насчет слайдера. Слайдера делать времени не было. Соответственно был выбран в сети близкий к дизайну плагин. Хотя конечно, возможно самая главная проблема в самом слайдере. Слишком громоздкий наверное. Но менять уже поздно. Тем более, что вроде бы рабоатет)

Спустя 6 часов, 54 минуты, 59 секунд (20.02.2012 - 21:46) bodja написал(а):
SoMeOnE

Это мне знакомо,я свой маг уже третий раз переделываю,хотя уже все работало на аяксе и DOM.
Себастьян мой диз раскритиковал,анимацию переношу на флеш,на этот раз будет бомба...
я так думаю. biggrin.gif biggrin.gif biggrin.gif

Спустя 57 минут, 23 секунды (20.02.2012 - 22:43) sergeiss написал(а):
Цитата (SoMeOnE @ 20.02.2012 - 15:16)
Т.е я начал вызывать append(элемент) в нужный мне <li> с секундной задержкой . Из за этого пришлось создать фи-ю с секундной задержкой перед началом ее выполнения. Впринципе все теперь рабоатет нормально, но кажется, что метод неверен.

Вот в таком описании понятнее smile.gif Я не буду обсуждать оптимальность данного подхода, честно говоря не знаю, может так и нормально.

Но давай вот что посмотрим. Ты хочешь что-то сделать, но не знаешь, готов ли к данному моменту определенный элемент. ОК. Кто тебе мешает проверить существование этого элемента, в случае его отсутствия взять еще задержку на какое-то время? И так до тех пор, пока либо не истечет некоторое пороговое время, либо пока не появится элемент, с которым ты уже можешь работать. Это будет более универсально, для любой ситуации, для любой (разумной) тормознутости браузера.

Спустя 1 час, 5 минут, 37 секунд (20.02.2012 - 23:49) SoMeOnE написал(а):
sergeiss
Ну а вот как делать задержку, я так и не разобрался. Тот метод, про который ты говорил просто (sleep) не работает. Пишет нет такой ф-ии. Те методы, которые предлогали, очень тормазнуто себя ведут, и не совсем корректно срабатывают.
Быстрый ответ:

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