【问题标题】:Backbone js button click event not firing骨干js按钮单击事件未触发
【发布时间】:2014-01-27 10:12:25
【问题描述】:

我在初始化主路由器时有一个 ajax 函数,这似乎阻碍了signin.js 中我的登录按钮的事件。当我单击登录按钮时,它不会执行其功能,而是浏览器将输入放在 URL 上(即用户名和密码)。 但是当我在initialize上去掉ajax函数后,就可以成功登录了。

我已经包含了一些我正在处理的代码。谢谢

main.js

initialize: function(){
    $.ajax({
      type: "GET",
      url: "something here",
      contentType: "application/json",
      headers: {
          'someVar': something here
      },
      statusCode: {
          404: function() {
              console.log('404: logged out');
              if (!this.loginView) {
                  this.loginView = new LoginView();
              }
              $('.pagewrap').html(this.loginView.el);
          },
          200: function() {
              console.log('200');
              if (!this.homeView) {
                  this.homeView = new HomeView();
              }
              $('.pagewrap').html(this.homeView.el);
          }
      }
    });
  // return false;         
},

signin.js

var SigninView = Backbone.View.extend ({
    el: '#signin-container',
    events: {
        "click #btn-signin" : "submit"
    },
    submit: function () {
        console.log('signin');
        $.ajax({ ... });
        return false;
    }
});
var toSignin = new SigninView();
window.anotherSigninView = Backbone.View.extend({
    initialize: function() {},
    render: function() {}
});

home.js

window.HomeView = Backbone.View.extend ({
    initialize: function() {
        this.render();
    },
    render: function() {
        $(this.el).html( this.template() );
        return this;
    }
});

一些html

<form id="signin-container">
<table id="tbl-signin">
    <tr>
        <td><div class="input-box"><input class="input-text" type="text" name="username" placeholder="Username"></div></td>
        <td><div class="input-box"><input class="input-text" type="password" name="password" placeholder="Password"></div></td>
        <td><input id="btn-signin" class="button" value="Sign In"></td>
    </tr>
    <tr>
        <td class="opt"><input class="checkbox" type="checkbox" name="rememberMe" value="true"><label class="opt-signin">Remember Me?</label></td>
        <td class="opt"><a class="opt-signin" href="#">Forgot Password?</a></td>
        <td></td>
    </tr>
 </table>
 </form>

【问题讨论】:

  • 您可以包含您的 HomeView 代码吗?你在哪里实例化了 SigninView ?
  • 我添加了homeView,不过没什么特别的。 var signinView = new SigninView(); 我把它放在 signin.js 的底部,如果你问的是这个
  • 如果删除 ajax 函数的两行:$('.pagewrap').html( ... ; 它仍然有效?
  • 好吧,它会失去它的用途,我将无法测试homeView中的登录按钮
  • 对不起,我以为你在使用 链接。我的回答阻止了链接默认行为。

标签: javascript jquery ajax backbone.js


【解决方案1】:

您需要在click 处理程序中阻止submit 按钮的默认行为。你可以这样做:

var SigninView = Backbone.View.extend ({
    el: '#signin-container',
    events: {
        "click #btn-signin" : "submit"
    },
    submit: function (event) {
        event.preventDefault();
        console.log('signin');
        $.ajax({ ... });
    }
});

或者,您可以考虑使用不会尝试提交与其关联的表单的 html button 元素。

【讨论】:

  • 实际上我在 ajax 函数之后确实有return false;。但还是不行console.log('signin');
  • 结果是一样的,问题出在主干之内,不在html中
  • 我不同意。提交按钮正在尝试提交表单,这就是您在 URL 中看到表单值的原因。试试我更新的答案。
  • 哦,对,这是一回事。但是我的工作 ajax 函数(如果初始化被注释掉)在它没有在 URL 上发布输入的情况下正常工作
  • 您的初始化函数引用了一个 LoginView,但您发布的视图称为 SigninView。这可能是个问题吗?
【解决方案2】:

好的,我知道你的问题是什么:)

这是一个恢复您的代码jsfiddle.net/26xf4/6 的示例。问题是你没有打电话给new SigninView(); (实例化视图)因此它的事件永远不会被绑定。

因此,在此示例中,尝试取消注释 ligne 43 并且您的代码将按预期工作,因为当您实例化 View (new SigninView()) 时,其构造函数会调用 delegateEvents() 函数(您在代码中看不到这一点,它在backbone.js中)启用您在视图中声明的事件:

events: {
    "click #btn-signin" : "submit"
},

【讨论】:

  • 你能解释一下吗?
  • 即使我的signinView 中没有render 函数?
  • 试过new SigninView().render(); 现在可以工作了,谢谢!你能解释一下为什么会这样吗?
  • 如果你愿意,你不需要打电话给render,我更新了我的答案。
  • 所以有另一个视图指向同一个 el #signin-container 并且它在您的 SigninView 视图之后实例化,因此第一个视图的事件绑定丢失了。
【解决方案3】:

我不知道你的 HTML 模型,我最好的猜测是你在这里捕捉到了不正确的事件。如果您正在提交表单,您应该捕获submit form 事件而不是click #some-button。因为即使你在表单中捕获click 按钮事件并返回false,表单仍然会被提交,因为这是两个不同的事件

【讨论】:

  • 我试过改成submit #buttonName还是一样
  • 你能把你的HTML也放在这里吗?它可能会有所帮助
  • 顺便说一句,你需要听 form 本身,如 submit #form-id 而不是 submit #buttonName
  • 那你需要把"click #btn-signin" : "submit"改成"submit #signin-containe" : "submit"
  • 即使我的input 标签中没有type="submit"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多