【发布时间】:2015-01-07 22:10:26
【问题描述】:
我使用主干/牵线木偶构建了一个下拉小部件,可让您使用键盘在下拉列表中上下导航。我需要区分选定和突出显示,因此我将布尔值存储在列表项模型的 isSelected 和 isHighlighted 中。每当项目悬停时,isHighlighted 就会更改为 true。
这是我的问题,我已将下拉列表设置为具有 maxItem,因此当下拉列表中的项目太多时,我会显示一个滚动条,以便人们可以滚动以查看更多列表项目。当我使用键盘导航来导航通过该 maxItem 限制时,我会调用 animate 并 scrollTop 一定距离,以便突出显示的内容保持在视图中。问题是如果我碰巧在下拉列表中有鼠标并且发生了这种滚动,它将在鼠标指针所在的项目上触发 mouseenter 事件。然后它将悬停元素的 isHighlighted 更改为 true。这意味着突出显示的项目又回到了,当我再次使用键盘向下导航时,它将从顶部向下而不是从之前的位置继续。
当滚动事件触发时,我是否可以阻止 mouseenter 事件?
尝试包含所有相关代码,希望这会有所帮助:
onKeyUp: function (event) {
var key = event.which;
switch (key) {
case 38: // UP
this.onUpArrow();
break;
case 40: // DOWN
this.onDownArrow();
break;
default:
// default method
}
},
onDownArrow: function () {
if (!this.isDropdownOpen()) {
this.openDropdown();
} else {
this.dropdown.highlightNext();
this.dropdown.scroll();
}
},
在另一个文件中,我有
events: {
'mouseenter': 'onMouseEnter'
},
onMouseEnter: function (event) {
this.triggerMethod('dropdown:option:mouseenter', {
event: event,
view: this,
model: this.model
});
},
在另一个文件中,我有
onDropdownOptionMouseenter: function () {
var data = _.last(arguments),
event = data.event,
view = data.view;
view.highlight();
}
此时,滚动发生了,并且 mouseenter 触发器被触发并且突出显示发生了变化。我只是不知道在哪里可以添加代码以防止浏览器识别 mouseenter。我想为此添加自定义事件吗? imo 工作量很大,必须有一个更简单的解决方案。
【问题讨论】:
-
我之前遇到过这个问题。发布您的代码,以便我指导您找到解决方案。
-
@Seebiscuit 添加了相关的代码,希望这就足够了。谢谢。
-
是的,因为您正在浏览视图,所以您必须使用消息系统(事件聚合器)或全局变量(不要这样做,代码很臭)。要我给你看一个样品吗?
-
是的,那太好了。
标签: javascript events backbone.js marionette