2

select要素がその値を変更するたびに実行する機能を設定しています。通常のonchangeイベントを使用する代わりに、300ミリ秒ごとに実行され、変更された値を検出した場合にのみハンドラーを呼び出します。Form.Element.Observerこれがあなたにとって何か意味があるのなら、私はプロトタイプを使用しています。

現在、Firefoxでは、ユーザーがにカーソルをoption合わせて時限値チェック関数が起動すると、ブラウザーが値が変更されたと通知するため、ハンドラーが呼び出されます。私がやりたいのは、オプションにカーソルを合わせるだけでなく、ユーザーが実際にオプションを選択したことを検出できるようにすることです。プロトタイプのドキュメントで、彼らはこのバグ(またはあなたの見方によっては機能)を明示的に指摘していることを認識していますが、動作を正規化できるようにしたいと思います。

ある意味、これは以前にStackOverflowで見た質問( HTMLのselect要素が展開されているかどうかを検出する(手動で状態を追跡することなく) )に似ていますが、誰かがその方法を教えてくれることを望んでいましたこれは、特定の選択要素に対してのみ、展開ではなく閉じられた場合に発生します。

私が何を意味するのかをよりよく理解するには、http://jsfiddle.net/KxQd6/をチェックして、select要素をいじり、コンソールログをチェックしてください。

4

2 に答える 2

2

SELECTこれは、あなたが言及したさまざまな段階で要素の変更を制御する方法を示す例です。

(ユーザー、dom-load、およびjsの更新)

このコードはevent.simulate、イベントを発生/シミュレートするクロスブラウザの方法を提供するを利用します。


CODEフィドル

document.observe('dom:loaded', function() {
    var select = $('box_1'),
        button_1 = $('change_via_ajax'), 
        button_2 = $('change_via_script'), 
        results = $('results');

    // create observer on our select
    select.observe('change', function(e) {
        var d = new Date()
            t = d.getHours() + ':' + d.getMinutes() + ':' + d.getSeconds();
        results.insert(new Element('div')
               .update(t + ' - Change was fired, value is now [' + this.value + ']'));
    });

    button_1.observe('click', function() {
        new Ajax.Request('/echo/json/', {
            onComplete: function(j) {
                select.options[Math.round(Math.random() * 2)].selected = true;
                select.simulate('change');
            }
        });
    });

    button_2.observe('click', function() {
        select.options[0].selected = true;
        select.simulate('change');
    });
});​
于 2012-09-28T13:45:34.107 に答える
0

https://github.com/harvesthq/chosenを見てください(特にhttps://github.com/harvesthq/chosen/blob/master/coffee/chosen.proto.coffee lines 68-89)。SELECT要素の現在の状態を判断する方法はありません。マウス、キーボード、およびUIイベントの一連のイベントオブザーバーを使用して、多かれ少なかれ確実に追跡するだけです。

于 2012-10-04T08:18:13.277 に答える