2

backbone.js でこのイベントをトリガーし、関数呼び出しを遅らせようとすると、event.type が mouseenter から mouseover に変更されます。

app.newsroomPageElementView = Backbone.View.extend({
 events: {
    'mouseenter .featured-image': 'imageHover',
    'mouseleave .featured-image': 'imageHover'
 },
imageHover: function (e)  {
         Y.log(e.type); // this outputs out mouseenter
        _.delay(function(){ 
         Y.log(e.type); // this outputs mouseover
        }, 500);
    },    
});

500ミリ秒後にマウスがすでに「入力」されているため、実際にはマウスオーバーです。トリガーされたときにマウスがイベントの上にあるためですか?

4

1 に答える 1

1

これは、Backbone が再利用するオブジェクトへの参照をユーザーに渡しているために発生しています。

ご存じのとおり、イベントの後にはmouseenterイベントが続きmouseoverます。のハンドラーがないmouseoverため、通常は気にしません。

イベントが発生するmouseenterと、ハンドラーがこのオブジェクトで呼び出されますe。これは、Backbone 内のオブジェクトへの参照です。をログに記録しますが、ハンドラーtypeでそのオブジェクトへの参照を保持します。delay

次に、イベント ハンドラーが返され、制御が Javascript スレッドに戻されます。mouseoverイベントが発生します。あなたのコードはそれを無視するかもしれませんが、Backbone は先に進み、渡されたオブジェクトを再利用し、mouseoverイベントに関する情報をそこに入れます。

次に、遅延が期限切れになりe、イベントの種類を調べるために使用します...これですべてのmouseoverイベント データが取得されたので、それが表示されます。

これは私たち全員にとって有益な教訓となるはずです。まず、JS はオブジェクト参照を扱うことに注意してください。コード以外の何かが作成したオブジェクトを保存し、スレッドを中断すると、そのオブジェクトが変更される可能性があります。同様に、配列またはオブジェクトを返すメソッドがある場合は、その配列またはオブジェクトへの参照を返していることを知っておいてください...したがって、コードを呼び出して配列またはオブジェクトの内容を変更すると、混乱する可能性があります。public getter を持つ private フィールドがある場合、これは特に危険です。注意しないと、意図せずにコードがオブジェクトの内部を変更できるようにする参照を渡すことができます!

于 2013-02-11T00:00:02.693 に答える