jQuery触发器不会触发两次

时间:2014-05-29 17:40:28

标签: jquery backbone.js

app.helpers.Template.compileTemplate(tmplPath, tmplData).done(function(html) {
    view.$el.html(html);

    view.$('input, select, textarea').focus(function() {
        console.log('focus')
    })

    view.$('input, select, textarea').trigger('focus');
});

每次创建视图时,我都会渲染视图的html并在所有表单元素上触发焦点事件。我创造的第一个视图,一切都很好,我得到了#34;焦点"在我的控制台中。第二次以及之后的所有时间都没有调用回调...

也许有助于知道它总是与呈现的HTML相同,它只是不同的视图。

1 个答案:

答案 0 :(得分:0)

尝试绑定到绑定处理程序后未被销毁的父/祖先元素,然后使用选择器来标识要捕获焦点事件的元素。也许类似的东西(虽然你必须修改它以适合你的布局 - 没有关于你的应用程序的任何其他信息,以此为基础):

$("html").on("focusin", "input, select, textarea", function(e) { 
    /* your handler...might have to check e to see which element initiated the event */
});

传统上,这是不可能的,因为focus事件没有冒泡,但jQuery试图解决这个问题: http://api.jquery.com/on/#additional-notes

  

焦点和模糊事件由W3C指定为不冒泡,但jQuery定义了跨浏览器的焦点和焦点输出事件。当焦点和模糊用于附加委托事件处理程序时,jQuery会映射名称并分别将它们作为focusin和focusout传递。为了保持一致性和清晰度,请使用冒泡事件类型名称。“

更新

实际上,如果您使用骨干网,则有一种指定的方法:视图的events属性。请参阅this page上的“倾听事件”部分。

  

要将侦听器附加到视图,我们使用Backbone.View的“events”属性。请记住,事件侦听器只能附加到“el”属性的子元素。让我们在我们的按钮上附加一个“点击”听众。