2012-03-08 3 views
0

у меня есть следующий сценарий:Javascript задержавшись скрипт меняет порядок появления

posting();  
pause(time);  
postSent(postUrl, fields); 

function postSent(postUrl, fields) 
{ 
    $.ajax({          
    url : postUrl, 
    type : "POST", 
    data : fields, 
    cache : false, 
    error : function(xhr, textStatus, errorThrown) { 
     var answer = xhr.responseText;   
    answer = answer.split(":"); 
    answer = answer[0].replace(/}/g,"").replace(/{/g,"").replace(/"/g,""); 
    if (answer == "id") 
    { 
      isPostSent = true;    
    } 
    else 
    { 
     isPostSent = false;   
    }   

    }   
    }); 
} 

function pause(milliseconds) { 
var dt = new Date(); 
while ((new Date()) - dt <= milliseconds) { /* Do nothing */ } 
} 

function posting() 
{ 
var table = ''; 
table += '<table border="0" rules="none" cellpadding="5" style="z-index:+10; position:fixed; top:35%; left:35%; box-shadow: 0px 0px 5px 5px #888888;" rules="none" border="0" bgcolor="#edeff4">'; 
table += '<td align="center">'; 
table += '<img src="images/loading.gif" id="post_status_image">'; 
table += '</td>'; 
table += '<tr >'; 
table += '<td align="center">שולח הודעה, אנא המתן...</td>'; 
table += '</tr>'; 
table += '<tr>'; 
table += '<td align="center" id="post_status"></td>'; 
table += '</tr>'; 
table += '<tr >'; 
table += '<td align="center" ><img id="post_close" src="images/close1.png" onclick="closePop()" style="visibility:hidden;"></td>'; 
table += '</tr>'; 
table += '</table>'; 
document.getElementById('post').innerHTML = table; 
} 

время устанавливается на 3000 милисекунд. моя проблема в том, что я хочу опубликовать() функцию, чтобы показать таблицу на экране (ее вид экрана загрузки), а затем приостановить сценарий. Фактически, по какой-то причине сценарий сначала приостанавливается, и только после того, как он заканчивается, он показывает мне экран загрузки ... как получилось?

+0

Это не является пауза, просто использовать 'setTimeout' – Esailija

+0

но SetTimeout не останавливает мой сценарий .. я хочу, чтобы мой сценарий, чтобы полностью остановиться и ждать время я 've setted –

+0

Это не останавливает ваш скрипт - ваш скрипт вычисляет даты в течение 3 секунд без каких-либо причин. Поскольку этот скрипт использует все доступные ресурсы для страницы, ничего другого не может произойти - все будет заморожено. – Esailija

ответ

2

браузеры запустить JavaScript и рендеринга все в одном потоке. Таким образом, все три функции JS будут завершены до обновления страницы. Вот почему вы должны never реализовать функцию паузы в JS, которая основана на цикле while и проверяет время. Вместо этого вам нужно использовать setTimeout() и поместить любой код, который необходимо запустить после паузы в обратном вызове, который вы передаете setTimeout().

Использование Пример кода:

posting(); 
setTimeout(function() { 
    postSent(postUrl, fields); 
}, 3000); 
+0

нормально, но после того, как функции postSent я есть: 'postSent (postUrl, поля);' 'если (isPostSent)' '{' ' updatePostPicture (истина); '' } '' else' '' { 'updatePostPicture (ложь);.' ' }' ' }' ' document.getElementById ('post_close') style.visibility =" видимый "; ' , где я должен положить его на паузу? –

+0

_Everything_, который вы хотите запустить после паузы, должен идти в функции, которую вы передаете 'setTimeout()' (или в функции, которые вы вызываете оттуда). В вашем случае вы также используете '$ .ajax()', поэтому было бы более целесообразно поместить некоторые или все из этого кода в обратный вызов успеха Ajax (хотя я заметил, что вы, похоже, не имеете обратного вызова успеха, просто обратный вызов ошибки, который я нахожу немного странным, если вы хотите что-то сделать после подтверждения того, что запрос прошел). – nnnnnn

+0

ok сделаю, я попробую. спасибо! @nnnnnn –

-1

В собственном javascript нет функции ожидания или паузы. Но мы можем добиться такого.

function sleep(milliseconds) { 
    var start = new Date().getTime(); 
    for (var i = 0; i < 1e7; i++) { 
    if ((new Date().getTime() - start) > milliseconds){ 
     break; 
    } 
    } 
} 

Я создал скрипку по адресу: http://jsfiddle.net/6DQBP/

Сценарий взят из: http://www.phpied.com/sleep-in-javascript/

Я нашел этот URL, после того, как я ответил. Может быть полезно.

+0

Если вы еще раз взглянете на вопрос, вы увидите, что функция 'pause()' OP похожа на вашу функцию 'sleep()', за исключением того, что ваш конец будет завершен либо при завершении цикла for, либо при указанном числе миллисекунды прошли, в зависимости от того, что наступит раньше. Вы должны _never_ кодировать что-то подобное в JS, потому что он блокирует браузер до тех пор, пока пауза не закончится (и если вы попытаетесь сделать паузу слишком долго, браузер фактически прервет ее с подсказкой к пользователю, спрашивая, хотят ли они отменить длительный сценарий). Вы должны реструктурировать код для использования 'setTimeout()' вместо этого. – nnnnnn

+0

Спасибо, да, я знаю об этом. Я не рекомендую эту технику, ваше решение лучше, чем это. Но я думаю, что @Asaf Nevo выглядит примерно так, как я опубликовал. – arunes

+0

Это точно так же, как и «паузой» в ОП кроме хуже: о – Esailija

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

  • Нет связанных вопросов^_^