Il y a un bouton sur la page comme suit
<button onclick="index.testClick()" >开始</button>
Le script js correspondant à cette page est le suivant
var index = {
testClick: function () {
index.createBtn(function() {
index.sleep(10000);
});
},
sleep: function (n) {
var start = new Date().getTime();
while (true) {
if(new Date().getTime() - start > n)
break;
}
},
createBtn: function (func) {
var button = $('<button>测试</button>');
button.bind("click",function(){
button.remove();
func();
});
$('body').prepend(button);
},
};
Pourquoi après avoir cliqué sur le bouton démarrer puis cliqué sur le bouton test, le bouton test se met réellement en veille (je l'ai remarqué sur la requête $.ajax synchronisée, simulée ici avec une boucle) avant d'être supprimé ? Ce n'est qu'en enveloppant sleep dans setTimeout que nous pouvons obtenir l'effet souhaité... ?
Cette question est en effet un peu petite... À première vue, je pensais que le code dormait volontairement 10 secondes. Cependant, la personne qui pose la question ne peut pas le comprendre D'après les commentaires dans la zone de commentaire ci-dessus, je sais probablement quoi. la question est...
Ce truc est lié au thread de l'interface utilisateur du navigateur. Le navigateur est monothread (ce fil est généralement appelé le thread de l'interface utilisateur du navigateur).
Chapitre 6 de l'interface utilisateur réactive rapide « JavaScript hautes performances », il y a deux paragraphes :
Il s'agit de la fonction de traitement des événements de clic. Une fois que js a supprimé le nœud DOM, func() continuera à s'exécuter immédiatement. Après 10 secondes, le processus sera inactif avant l'exécution de la tâche suivante et l'interface utilisateur sera mise à jour uniquement. alors le bouton disparaîtra de la page.
Une question dans la zone de commentaire d'une autre réponse ci-dessus : « Pourquoi cela ne se produit-il pas lors de son ajout ? »
La fonction ajoutée est comme ça,
Ce processus n'exécute pas func(). Essayez de déplacer cette fonction et de la remplacer par ceci
.Certainement bloqué aussi
Il se peut que vous ayez bloqué le fil de discussion, ce qui a bloqué le rendu graphique
Même si le bouton a été supprimé de l'arborescence dom.
Mais les graphiques n'ont pas redessiné la nouvelle arborescence DOM là où le bouton n'existe pas.
Je pensais que c'était simple avant. Cela devrait être la même chose que ce qui a été dit en bas, le rendu de l'écran était bloqué.
Par exemple, imprimez le journal avant func();:
Une fois le logo de sortie affiché, il reste bloqué. Le contenu complet ne s'affiche pas tant que sleep n'est pas exécuté :
Lorsque la mise en veille est exécutée, la page est bloquée et ne peut pas être utilisée du tout. En même temps, l'utilisation du processeur est très élevée (car il n'y a en théorie aucun intervalle dans cette boucle). Cela peut être la raison pour laquelle elle est bloquée. .