3

問題

スピナーがあり、前のフィールドからのぼかし、またはスピナーのフォーカスなど、ダイアログ ボックスでスピン プロセスを中断する場合、ダイアログが閉じられると、スピン上でマウスが押されたかのようにスピナーがスピン プロセスを続行します。ボタン、無限ループのように。

ポイントを説明するjsfiddleを作成しました.2つのスピナーと変更イベントの確認ダイアログで構成されています。

無限の回転を見るには:

  1. 例のページで説明されているように、確認ダイアログをトリガーします。
  2. ダイアログをクリアします (「OK」または「キャンセル」ボタンを使用できます)。
  3. スピナー コントロールのボタンの上にマウスを置きます。
  4. スピナーゴーを見てください!

\Edit - 発火していない mouseleave コードがあります。それが問題だと思います。これを手動で実現できるかどうかを調べます


試した回避策

  • 確認が表示される前に他のスピナーを無効にしてから、状態がクリアされることを期待して再度有効にしようとしましたが、うまくいきません。
  • 私の状況では、注文フォームでスピナーを使用しています。私は確認を最大数量チェックに使用します。ユーザーが確認した場合は値が許可され、そうでない場合は以前の値に戻されます。確認をスピンイベントに入れてみましたが、ユーザーがキーボードを使用して入力フィールドを更新すると、これは発生しません。
  • また、マウス/キーを押すたびに発生する停止イベントでも試しました。ただし、スピナーの最大数が 999 であり、確認が 12 などの非常に低いさまざまな値で表示されるため、これはうまく機能しませんでした。したがって、ユーザーが 130 を入力したい場合、入力時に確認ダイアログが表示されます。 3、これは予期しない動作です。このシナリオは発生する可能性が最も低いため、これが私の回避策になる可能性があることに注意してください。
  • また、スピン イベントでチェックするフラグを設定して、2 番目のスピナーのスピンをキャンセルできるようにしました。これは機能し、回転を防ぎますが、フラグが設定解除されるとすぐに問題が発生します。フォーカスと blus を 2 番目のスピナー (またはその他のスピナー) に適用しても効果はなく、実際のスピナー ボタンにぼかしを適用しても効果はありません。

すべてのブラウザに影響する jQuery UI 1.9 スピナーのバグを特定したと思います。これはマイルストーン 8 に存在します。修正されるまで、もう少し知識のある人がこれに対する回避策を教えてくれることを願っています (お願いします!)。発行されます...

これは jQuery UI ライブラリのバグだと思うので、jQuery フォーラムでこの質問をしました。そこで何か聞いたら、この質問を更新し続けます。

4

1 に答える 1

1

説明

これは ui.spinner のバグ (ほとんどの場合) であり、おそらく jQuery UI 開発者に通知する価値があります。

注: jQuery UI チームにチケットを提出したくない場合は、お知らせください。提出します。時間があればパッチを提供するかもしれません。

問題は、スピナーが開始されていることですmousedown(この場合、開始されますmousewheeelおよびkeydown) 残念ながら、confirm() の後まで起動されません。

FireFoxのには、 が開いconfirm()ている間、すべてのドキュメント イベントを停止するという優れた副作用もありconfirm()ます。スピナーは、スピナー/スピナー ボタンで(およびmouseup)で停止しますが、これらのイベントは発生しません。したがって、スピナーに戻り、停止イベントの 1 つが発生するまで、スピナーは継続的に実行されます。mouseoutkeyup

回避策

jQuery UI チームがこの問題を修正するまで、2 つの回避策があります。どのような処理を行う必要があるかによって異なります。1 つはタイムアウトを設定する方法で、もう 1 つはタイムアウト時にすべてのスピナー ボタンでイベントconfirm()をトリガーする方法です。mouseup

どちらが有用か (もしあれば) は、 の結果で何をしようとしているのかによって異なりますconfirm()

どちらもきれいではありませんが、これらは私が思いつく最善の回避策です。

回避策 1 - フェイク イベントのタイムアウト

var spinner = $( ".mySpinner" ).spinner({
    max: 100,
    min: -100,
    change: function( event, ui ) {
        confirm("Pressing cancel breaks the other spinner");
        setTimeout(function(){
            $('.ui-spinner-button').trigger('mouseup');
        },1);
    }
});

回避策 2 - confirm() のタイムアウト

var spinner = $( ".mySpinner" ).spinner({
    max: 100,
    min: -100,
    change: function( event, ui ) {
        setTimeout(function(){confirm("Pressing cancel breaks the other spinner");},1);
    }
});

その他のハック

プロパティにアクセスするために、スピナーの内部プライベート インスタンスを取得し、spinniningそれを true にマークしてから、_stop()メンバー関数を呼び出すことができます。ただし、これは非常に煩わしい修正です。別のルートは、停止が使用するタイムアウトをクリアすることですが、これも邪魔であり、将来の保証はありません。そのため、これらのハックの例は提供しません。

于 2012-07-03T18:08:39.860 に答える