1

HTML がレンダリングされた直後にクリック イベントを手動でトリガーしようとしていますが、機能していません。

単純化して機能していないことを確認するために、次のコードを試しました。

var _testView = Backbone.View.extend({

   events : {
    'click a' : 'sayHi'
   },

   initialize : function() {
    this.render();
    this.$el.find('a').trigger('click');
   },

   render : function() {
    $(document.body).html(
        this.$el.html('<a href="#">alert hi</a>')
    );
   },

   sayHi : function() {
    alert('Hi');
    return false;
   }

});

var y = new _testView;

クリック イベントを手動でトリガーしようとしていますが、トリガーされません。トリガーを 500 の遅延で setTimeout に入れる場合、それは機能します。理由がわからない.... thx

4

3 に答える 3

1

私は答えを見つけました。Backbone コアを調べたところ、イベントをビューにアタッチする前に、initialize メソッドが最初に呼び出されていることがわかりました。

View = Backbone.View = function(options) {
    this.cid = _.uniqueId('view');
    this._configure(options || {});
    this._ensureElement();
    this.initialize.apply(this, arguments);
    this.delegateEvents();
  };
于 2013-04-14T08:33:58.427 に答える
-1

ジャスターは正しいです。$(document.body) は「ドキュメントの準備完了」イベントを待機し、ドキュメントの準備が整う前に new _testView を呼び出しています。initialize をこれに変更できます。ドキュメントの準備ができた後に実行するトリガーをキューに入れます。

initialize : function() {
    this.render();
    var self = this;   
    $(function(){
        self.$el.find('a').trigger('click');
    });
},

関数で_testViewオブジェクトを取得するために「this」を参照できないため、変数「self」を追加しました。

このフィドルで動作します

于 2013-04-13T21:27:16.930 に答える