似乎按键只能在焦点元素上执行?我不完全同意这一点,必须有一种类似于单击事件的方法来执行按键事件吧?
我有一个视图,一次只能处理一个项目。我有一个mouseenter-mouseleave函数,它会向鼠标所在的项目添加一个类。当该项目接收到该类时,我希望能够使用按键事件在该项目上运行一个函数。
显然,这是一个小障碍,但我想找出需要做什么。下面是一个示例视图。
基本上,如果我能弄清楚如何触发
我理解这段代码中的一些问题,它无法知道我们何时在该视图中运行keypress,我必须添加一个条件或其他内容来查找活动类,因此当我执行keypress时,它知道我正在谈论哪个模型,这里描述得非常模糊,但我知道有些地方不对,只是不确定如何解决? 我的解决方案:
我有一个视图,一次只能处理一个项目。我有一个mouseenter-mouseleave函数,它会向鼠标所在的项目添加一个类。当该项目接收到该类时,我希望能够使用按键事件在该项目上运行一个函数。
显然,这是一个小障碍,但我想找出需要做什么。下面是一个示例视图。
var PlayerView = Backbone.View.extend({
tagName: 'div',
events: {
'click .points, .assists, span.rebounds, span.steals':'addStat',
'mouseenter': 'enter',
'mouseleave': 'leave',
'keypress': 'keyAction'
},
enter: function() {
this.$el.addClass('hover');
},
leave: function() {
this.$el.removeClass('hover');
},
keyAction: function(e) {
var code = e.keyCode || e.which;
if(code == 65) {
alert('add assist')
}
}
});
这里没有太多的逻辑,但我想写出类似这样的东西。
keyAction: function(e) {
var code = e.keyCode || e.which;
if(code == 65) {
var addAssist = parseInt(this.model.get('assists')) + 1;
this.model.save({assists: addAssist});
}
}
基本上,如果我能弄清楚如何触发
keyAction
方法,那么我就可以继续进行了。那么,在执行此类代码时,我错过了哪些注意事项呢?我确信有一些。我理解这段代码中的一些问题,它无法知道我们何时在该视图中运行keypress,我必须添加一个条件或其他内容来查找活动类,因此当我执行keypress时,它知道我正在谈论哪个模型,这里描述得非常模糊,但我知道有些地方不对,只是不确定如何解决? 我的解决方案:
initialize: function() {
this.listenTo(this.model, "change", this.render);
_.bindAll(this, 'on_keypress');
$(document).bind('keydown', this.on_keypress);
},
enter: function(e) {
this.$el.addClass('hover');
},
leave: function(e) {
this.$el.removeClass('hover');
},
on_keypress: function(e) {
// A for assist
if(e.keyCode == 65) {
if(this.$el.hasClass('hover')) {
var addThis = parseInt(this.model.get('assists')) + 1;
this.model.save({assists: addThis});
}
}
// R for rebound
if(e.keyCode == 82) {
if(this.$el.hasClass('hover')) {
var addThis = parseInt(this.model.get('rebounds')) + 1;
this.model.save({rebounds: addThis});
}
}
// S for steal
if(e.keyCode == 83) {
if(this.$el.hasClass('hover')) {
var addThis = parseInt(this.model.get('steals')) + 1;
this.model.save({steals: addThis});
}
}
// 1 for one point
if(e.keyCode == 49) {
if(this.$el.hasClass('hover')) {
var addMake = parseInt(this.model.get('made_one')) + 1;
this.model.save({made_one: addMake});
var addOne = parseInt(this.model.get('points')) + 1;
this.model.save({points: addOne});
}
}
// 2 for two points
if(e.keyCode == 50) {
if(this.$el.hasClass('hover')) {
var addMake = parseInt(this.model.get('made_two')) + 1;
this.model.save({made_two: addMake});
var addTwo = parseInt(this.model.get('points')) + 2;
this.model.save({points: addTwo});
}
}
// 2 for two points
if(e.keyCode == 51) {
if(this.$el.hasClass('hover')) {
var addMake = parseInt(this.model.get('made_three')) + 1;
this.model.save({made_three: addMake});
var addThree = parseInt(this.model.get('points')) + 3;
this.model.save({points: addThree});
}
}
}
这对我的应用程序非常有用,因为当用户将光标悬停在项目上时,用户可以按键添加数据,而无需单击。
this.$el.addClass('hover').focus()
应该足以捕获 keypress。 - Shashank Mehta