J'ai une barre de défilement sur un élément div.
Sur plusieurs navigateurs (j'ai testé ceci sur les versions récentes de Chrome et Firefox sur MacOS et Linux), il semble que les navigateurs s'assurent que le code lié à onscroll est appelé avant le reptage déclencher par le défilement.
En d'autres termes, le violon suivant ne clignote pas et clignote lorsque vous défilez http://jsfiddle.net/m2E65/1/ :
var onscroll = function() { var y = $("#container").scrollTop() + 30; var z = 0 for (var c=0; c<y*10000; c++) { z+=c; } $("#label").text("bocal : "+z); $("#label").css("top", y); }; $('#container').scroll(onscroll);
Cependant, sur Linux Chromium v28 sur Ubuntu, il brille. Presque aussi peu que si nous avons différé onscroll en utilisant setTimeout ( http://jsfiddle.net/m2E65/2/ ):
$('#container').scroll(function() { window.setTimeout(onscroll, 0); });
Sur ce même navigateur, même en utilisant requestAnimationFrame comme dans http://jsfiddle.net/m2E65/4/ scintille aussi mal (voir ci-dessous)
var onscroll = function() { var y = $("#container").scrollTop() + 30; var z = 0 for (var c=0; c<y*10000; c++) { z+=c; } $("#label").text("bocal : "+z); $("#label").css("top", y); window.requestAnimationFrame(onscroll); }; window.requestAnimationFrame(onscroll);
Ma question est :
1. Out of Document Object Model (DOM) Niveau 3 Spécifications des événements Document W3C:
Un agent utilisateur doit expédier cet événement lorsqu'une vue de document ou un élément a été déroulé . Ce type d'événement est expédié après l'apparition du défilement.
Mon interprétation de ces deux phrases est qu'un navigateur doit expédier l'événement de scroll
après le processus de défilement complété, y compris la peinture.
2. Je ne pense pas qu'il existe un moyen de garantir que, sur tous les navigateurs, le code disparaîtra avant le repeint. Peut-être que vous pourriez tenter d'attraper toutes les façons dont un utilisateur peut défiler, spontanément, je pensais:
wheel
mousedown
mousedown
déclenchera. 3. Votre premier violon me clignote sur:
Il ne clignote pas dans:
Maintenant, il pense que spécialement WebKit-Browsers (sauf Chrome) ne pas repeindre avant d'appeler l'événement de scroll
et qu'il n'y a pas de bon moyen d'éviter cela.