2013-04-13 92 views
0

我試圖手動觸發一個點擊事件後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; 

我試圖手動觸發click事件,但它沒有被觸發。如果我要將觸發器延遲500秒的setTimeout,它將起作用。我不知道爲什麼.... thx

+2

,有什麼特別的原因,你觸發點擊不調用,, sayHi的」功能 – hjuster

+0

我真實的項目 - 觸發點擊錨有DOM屬性,它是方法的邏輯的一部分。這就是爲什麼它依賴於錨點。 – dmb

回答

0

您正在調用尚未創建的元素上的click事件。你應該在渲染完成時調用函數,或者你可以調用this.sayHi()而不是觸發點擊。

0

hjuster是正確的。 $(document.body)等待「文檔就緒」事件,並且在文檔準備好之前調用新的_testView。您可以將您的初始化更改爲 - 在文檔準備就緒後,將觸發器排隊執行。

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

我加了var「自我」,因爲你不能引用「這個」讓你_testView對象的功能。

它的工作原理in this fiddle

0

你不想硬編碼的DOM elemets的方式。

您可以有一個單獨的模板文件或將<a href="#">alert hi</a>設置爲模板變量。

var testView = Backbone.View.extend({ 
    template: _.template("<a href='#'>alert hi</a>") 
}); 

那麼事件表應罰款

+0

是的 - 對我的真實項目我真的使用了下劃線的模板方法,這只是爲了簡化這個調用不起作用。 – dmb

0

我找到了答案。我查看了Backbone核心,我發現在將事件附加到視圖之前,首先調用initialize方法。

View = Backbone.View = function(options) { 
    this.cid = _.uniqueId('view'); 
    this._configure(options || {}); 
    this._ensureElement(); 
    this.initialize.apply(this, arguments); 
    this.delegateEvents(); 
    };