Javascript 是否每次呈现主干视图时都使用jQuery选择相同的元素

Javascript 是否每次呈现主干视图时都使用jQuery选择相同的元素,javascript,jquery,twitter-bootstrap,Javascript,Jquery,Twitter Bootstrap,是否有必要为渲染的每个主干视图选择相同的DOM元素并对其执行某些操作?在任何时候都只存在此视图中的一个 例如,假设引导的选项卡(tabbable插件)必须用于特定的主干视图产品。在render函数中包含选项卡插件的初始化代码是否正确 render: function() { this.$el.html( this.template( this.model.toJSON() ) ); // Activate Twitter Bootstrap Tabs $('.tab-

是否有必要为渲染的每个主干视图选择相同的DOM元素并对其执行某些操作?在任何时候都只存在此视图中的一个

例如,假设引导的选项卡(tabbable插件)必须用于特定的主干视图
产品
。在
render
函数中包含选项卡插件的初始化代码是否正确

render: function() {

    this.$el.html( this.template( this.model.toJSON() ) );

    // Activate Twitter Bootstrap Tabs
    $('.tab-bar').tab();
    $('.tab-bar .tab:first').tab('show');
    $('.tab-bar .tab').click(function(e) {
        e.preventDefault();
        $(this).tab('show');    });

    return this;
}
或者有没有一种方法可以只调用此选择器一次,它将为类为
.tab bar
的所有元素(包括那些尚未存在的元素)触发

类似地,如果我想在第一个选项卡上使用click处理程序

$('.tab:first').click(function(){
    console.log('hey!')'
}

我是否将其放置在该视图的
render
函数中?如果我这样做,如果视图被多次渲染,它是否会创建许多
单击
事件监听器?

您需要在initialize方法中绑定事件监听器,而不是在渲染中绑定事件监听器。除非要多次重新呈现DOM元素

编辑


您需要在initialize方法中绑定事件侦听器,而不是在render中。除非要多次重新呈现DOM元素

编辑


在DOM元素存在之前绑定到它可以吗?类似于绑定到
$('.tab:first')
然后使用
render
渲染它。我将使用不同的模型属性/数据重新渲染相同的视图。因此,与DOM一样,DOM元素将被渲染,然后关闭,然后再次渲染(很可能使用不同的模型数据)。它有点像弹出框的视图,不能将事件侦听器绑定到不存在的DOM元素。最好是在视图中的events对象中设置一些事件处理程序。我会更新我的答案。谢谢你的编辑。我似乎无法在
事件
对象中使用Twitter引导的
.tab()
,我想,
do\u something
方法将接收名为
事件
的参数。您可以使用它访问创建单击事件的DOM元素。然后可以使用
$(event.currentTarget)
将其转换为jQuery对象,然后可以使用.tabs()方法。在DOM元素存在之前可以绑定到它吗?类似于绑定到
$('.tab:first')
然后使用
render
渲染它。我将使用不同的模型属性/数据重新渲染相同的视图。因此,与DOM一样,DOM元素将被渲染,然后关闭,然后再次渲染(很可能使用不同的模型数据)。它有点像弹出框的视图,不能将事件侦听器绑定到不存在的DOM元素。最好是在视图中的events对象中设置一些事件处理程序。我会更新我的答案。谢谢你的编辑。我似乎无法在
事件
对象中使用Twitter引导的
.tab()
,我想,
do\u something
方法将接收名为
事件
的参数。您可以使用它访问创建单击事件的DOM元素。然后可以使用
$(event.currentTarget)
将其转换为jQuery对象,然后可以使用.tabs()方法。
window.myView = Backbone.View.extend({

    events: {
        'click #someElementID': 'do_something',
    },

    initialize: function(){
        _.bindAll(this, 'render', 'do_something');
    },

    .....

    do_something: function(e){
        console.log("A click was made!", e.currentTarget);
    }

});