Dlaczego wpisując wszystko na wejściu # Q wisi całą stronę?

<html>
<head></head>
<body>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="q">
<input>
<script type="text/javascript">
$("#q").keydown(function() {
    while(true) {
    }
});
</script>
</body>
</html>

http://jsfiddle.net/9cw2pjym/

Zachowanie, których chciałbym spodziewać się, że obdarzenie wątku, że poszczególne wydarzenie kieliszkowe blokuje, ale strona pozostałaby responsywne. Zrobiłem test, ponieważ byłem ciekawy wiedzieć, czy ten kod uniemożliwiłby użytkownikowi wpisanie na wejściu # q. Jednak idzie daleko poza tym: Całym blokami stron (próbowałem na Chrome, Firefox i Safari).

Poszedłem naprzód i próbowałem tego:

setTimeout(function() {
    while(true){}
}, 5000);

Po 5 sekundach pojawia się strona. Nie ma więcej interakcji. Czy nie powinno być również na innym wątku? Czy JavaScript i wszystkie inne interakcje ze stroną działającej na tym samym wątku?

0
Rafael Almeida 16 sierpień 2014, 20:18

2 odpowiedzi

Najlepsza odpowiedź

Zasadniczo większość interfejsów użytkownika i specjalnie przeglądarek są pojedyncze gwintowane. Dają umiejętności wielowątkowości przez dość złożony model zdarzenia. Ale od razu zrobi jedną rzecz.

Jednakże, ponieważ HTML5 nie jest już całkiem prawidłowo, oferuje obsługę obsługi wielu gwintowanych za pomocą Webworkers do obliczeń w tle.

2
ced-b 16 sierpień 2014, 16:22

JavaScript jest pojedynczym gwintem. Tak więc, chociaż Settimeout rozpoczyna timer, zdarzenie wywołania zwrotnego jest wywoływane wyłącznie na wątku UI. To jest powód po 5 sekundach Your while(true){} Forever Loop zawiesza wątek UI.

5
gp. 16 sierpień 2014, 16:21