ロジックの最初の部分が間違っています。.progressbar
プログレスバーを正しい元の状態にリセットします。ただし、.animate
css を変更するだけでは、実際にはバーを「進めている」わけではありません。
代わりにマウスが要素の上にある間に、何らかの計算/期間にわたって値を設定する必要があります。
例(編集):
html
<div id="progressbar"></div>
js
$(function () {
var progress = 0;
var updateTime = 30; // ms
var updateTimeout;
$("#progressbar").mouseenter(function () {
updateTimeout = setTimeout(animateFilling, updateTime);
});
$("#progressbar").mouseleave(function () {
progress = 0;
updateProgressbar();
clearTimeout(updateTimeout);
});
updateProgressbar(); // init the bar
function animateFilling() {
if (progress < 100) {
progress++;
updateProgressbar();
updateTimeout = setTimeout(animateFilling, updateTime);
} else {
// TODO - done loading
}
}
function updateProgressbar() {
$("#progressbar").progressbar({
value: progress
});
}
});
更新されたデモはこちら
マウスオーバー/マウスアウトのバグ編集
OPで指摘されているように、mouseoverとmouseoutを使用すると、カーソルがdom要素を離れていなくても進行状況バーが再トリガーされます(その結果、進行状況バーが高速化またはリセットされます)。
これは、プログレス バーの内側の要素と、こちらで説明されているイベント バブリングによるものです。これは、代わりに mouseover / mouseout を使用することで回避できます。