jQuery&;主干单击事件未触发

jQuery&;主干单击事件未触发,jquery,events,backbone.js,Jquery,Events,Backbone.js,我知道这个问题出现过无数次,但我已经找到了答案,没有一个有用 JS小提琴: 在小提琴中,当我绑定一个普通的$(“#login btn”)时。单击();事件它工作良好,虽然它不在我自己的设置(与铬)。主干单击事件无论如何都不起作用 这是我自己的代码中标题的外观 <link href="assets/admin/css/bootstrap.css" rel="stylesheet" type="text/css"> <link href="assets/admin/css/boot

我知道这个问题出现过无数次,但我已经找到了答案,没有一个有用

JS小提琴:

在小提琴中,当我绑定一个普通的$(“#login btn”)时。单击();事件它工作良好,虽然它不在我自己的设置(与铬)。主干单击事件无论如何都不起作用

这是我自己的代码中标题的外观

<link href="assets/admin/css/bootstrap.css" rel="stylesheet" type="text/css">
<link href="assets/admin/css/bootstrap-responsive.css" rel="stylesheet" type="text/css">
<link href="assets/admin/css/style.css" rel="stylesheet" type="text/css">
<script src="assets/admin/js/jquery-1.9.1.min.js"></script>
<script src="http://documentcloud.github.com/underscore/underscore-min.js"></script>
<script src="http://documentcloud.github.com/backbone/backbone-min.js"></script>
<script src="assets/admin/backbone/login.js"></script>
<script src="assets/admin/js/bootstrap.min.js"></script>


我知道在页脚中包含这些元素是最好的做法,但目前,虽然存在此问题,但这并不重要(?)

您将视图元素设置为:

var LoginView = Backbone.View.extend({
  initialize: function() {
    this.el = $('#login-container');
  }
});
每个主干视图在创建时都会获得一个分离的DOM节点作为其
el
。当您这样设置
this.el
时,主干并不知道您已经更改了元素,并且仍在侦听原始分离节点上的事件

尝试在视图上声明
el
属性。这是将视图绑定到预先存在的图元的正确方法:

var LoginView = Backbone.View.extend({
  el: "#login-container",
});
如果需要在视图的生命周期内动态设置视图的
el
,则应使用
view.setElement
,它使主干能够将
事件绑定到新元素:

var LoginView = Backbone.View.extend({
  initialize: function() {
    this.setElement($('#login-container'));
  }
});
根据评论进行编辑:听起来像是在页面完全加载之前尝试初始化视图。主干找不到
#login container
元素,因此ergo不会绑定事件。您也可以用您的小提琴来验证这一点:在小提琴设置中将
onLoad
设置更改为
No wrap
,瞧,没有处理任何事件

您应该仅在DOM就绪后初始化应用程序:

$(document).on('ready', function() {
  var newLogin = new Login();
  var loginView = new LoginView({model: newLogin});      
});
或相同的快捷方式:

$(function() {
  var newLogin = new Login();
  var loginView = new LoginView({model: newLogin});      
});

我必须在没有jQuery的情况下设置el,才能使它在JSFIDLE中工作el:'body'

正如其他答案所解释的,要使
事件
起作用,您需要使用
el
属性
el
属性是通过引用
el
属性中的元素注册事件所必需的。但在某些情况下,html尚未生成。在这些情况下,您可以使用
标记名
而不是
el
<代码>标记名
对于动态生成元素非常有用,就像
document.createElement
一样

主干el节点定义视图控制器的工作空间。仅el内的节点将受影响、侦听或更改主干渲染方法

将el设置为尽可能靠近要使用视图控制器维护的区域,以避免与其他视图控制器相交或不必要的父子关系

想象View1包含View2的区域,并在其节点上进行渲染。如果View2保存节点的引用,则View2将不再工作,因为它们可能会在View1的渲染中被打断


因此,请注意视图交叉口及其风险。主干是一个库,而不是一个框架,不会保护您不做愚蠢的事情。

chrome开发者控制台中有错误吗?没有,直接通过jQuery从控制台绑定点击事件似乎是可行的。我试过使用.on()等。。它们都不起作用。主干网只是失败了。
第一个tagAh只是一个格式错误,看看小提琴,这基本上就是我的代码。这适用于JSFIDLE,但不适用于我的本地代码。。这越来越烦人了。jQuery点击事件在本地也不起作用,我想这就是问题所在?啊,我分别尝试了这两种方法,但从未一起尝试过,谢谢@SamV:我们可以在路由器中而不是在
文档中初始化视图吗?准备好了吗?@Domo我不知道,我现在使用Angular,但从未进入主干网!打开一个新问题或谷歌:)@SamV没关系,亲爱的。谢谢
$(function() {
  var newLogin = new Login();
  var loginView = new LoginView({model: newLogin});      
});