Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   Очерёдность событий в разных браузерах. (https://javascript.ru/forum/css-html/57919-ocherjodnost-sobytijj-v-raznykh-brauzerakh.html)

geekay 26.08.2015 11:31

Очерёдность событий в разных браузерах.
 
Имеется функция на javascript, вызывающая скрипт php на стороне сервера. На время выполнения этого скрипта php нужно показать некое сообщение для пользователя. По какой-то причине вот этот код:
document.getElementById('text_wait').style.visibility="visible";
выполняется на Firefox, то есть я вызываю функцию, надпись становится видимой, после выполнения скрипта она исчезает.
Chrome и Vivaldi каким-то образом "оптимизируют" этот код, и интерфейс пользователя "подвисает", сообщение не появляется, пользователю страшно =) Вот полный ков функции:
<script>
function onApplyChanges(){

    document.getElementById('text_wait').style.visibility="visible";

    xmlhttp=new XMLHttpRequest();
    xmlhttp.onreadystatechange=function(){
        if (xmlhttp.readyState==4 && xmlhttp.status==200){
            document.getElementById('text_wait').style.visibility="hidden";
            switch (xmlhttp.response){
                case "0":
                    rebootRedirect();
                    break;
                case "1":
                    alert("Ошибка! Не задан файл для распаковки.")
                    break;
                case "2":
                    alert("Ошибка! Не найден загруженный файл.")
                    break;
                case "3":
                    alert("Ошибка! Несовпадение контрольной суммы.")
                    break;
                case "4":
                    alert("Ошибка при распаковке файла.")
                    break;
                case "7":
                    alert("Ошибка! В обновлении отсутствует один или больше файлов.")
                    break;
                case "8":
                    alert("Ошибка! В обновлении файл веб-интерфейса.")
                    break;
                default:
                    alert("Неизвестная ошибка: "+xmlhttp.response);
                    break;

            }
        }
    }
    xmlhttp.open('POST', 'php/unpack.php', false);
    xmlhttp.setRequestHeader("Content-type", "application/x-www-Form-urlencoded");
    xmlhttp.send();
};
</script>

ksa 26.08.2015 13:18

Цитата:

Сообщение от geekay
document.getElementById('text_wait').style.visibil ity="visible";

После этого, все остальное запускай через setTimeout().
Как вариант...

function onApplyChanges(){
    document.getElementById('text_wait').style.visibility="visible";
	setTimeout(function(){
		xmlhttp=new XMLHttpRequest();
		xmlhttp.onreadystatechange=function(){
			if (xmlhttp.readyState==4 && xmlhttp.status==200){
				document.getElementById('text_wait').style.visibility="hidden";
				switch (xmlhttp.response){
					case "0":
						rebootRedirect();
						break;
					case "1":
						alert("Ошибка! Не задан файл для распаковки.")
						break;
					case "2":
						alert("Ошибка! Не найден загруженный файл.")
						break;
					case "3":
						alert("Ошибка! Несовпадение контрольной суммы.")
						break;
					case "4":
						alert("Ошибка при распаковке файла.")
						break;
					case "7":
						alert("Ошибка! В обновлении отсутствует один или больше файлов.")
						break;
					case "8":
						alert("Ошибка! В обновлении файл веб-интерфейса.")
						break;
					default:
						alert("Неизвестная ошибка: "+xmlhttp.response);
						break;

				}
			}
		}
		xmlhttp.open('POST', 'php/unpack.php', false);
		xmlhttp.setRequestHeader("Content-type", "application/x-www-Form-urlencoded");
		xmlhttp.send();
	},1);
};

geekay 26.08.2015 13:38

Во, спасибо! Сам придумал именно такой вариант. Мне, как сишнику, кажется кривоватым :)

ksa 26.08.2015 13:40

Цитата:

Сообщение от geekay
Мне, как сишнику, кажется кривоватым

Это нормальный подход в JS. :nono:
Поскольку скрипт выполняется однопоточно. Вот статейка на это дело...


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