mouseover/mouseout에서 버튼의 메뉴 표시/숨기기를 가능하게하는 Ext.Button의 확장 작업을하고 있습니다. 그것은 바로 버튼의 직접적인 자식 메뉴를 위해 완벽하게 작동하지만, 2 차/3 차/ect 메뉴에 대해 제대로 작동하는 문제가 있습니다.ExtJS 4.1 "HoverButton"확장 문제
바로 가기 메뉴를 포함하는 최상위 메뉴에서 사용자가 이동하면 메뉴가 열리고 사용자는 커서를 아무 문제없이 이동할 수 있으며 모든 것이 계속 열려 있습니다. 그런 다음 사용자가 커서를 보조 메뉴 밖으로 열린 공간으로 이동하면 모든 메뉴가 올바르게 닫힙니다. 하지만 사용자가 보조 메뉴로 이동 한 다음 부모 메뉴로 돌아 가면 모든 메뉴가 닫히고 커서가 지금 끝난 상태의 부모 메뉴가 열려 있어야합니다. .
제 초기 디버깅에서 이벤트가 발생하는 방식과 타이밍에 문제가있는 것으로 보입니다. 자식 메뉴에서 부모 메뉴로 다시 이동할 때 부모 메뉴에 대한 mouseenter 이벤트가 발생하지 않는 것으로 보입니다. 둘째로 나에게 메뉴 mouseover 이벤트가 자식 메뉴의 mouseleave 이벤트가 시작된 후 지연된 숨기기 작업을 취소하기에 충분히 안정적으로 또는 자주 불이 들지 않는 것처럼 보입니다. 문제의
데모 : 여기 http://qs1724.pair.com/users/autod1nx/EMPLOYEE/BDAMI/hoverbutton/index.html
그리고는 눈에 띄는 코드의 그것과 근본적으로 뭔가 잘못입니까?
Ext.define('Ext.HoverButton', {
extend: 'Ext.Button',
alias: 'widget.hoverButton',
isOver: false,
hideDelay: 250,
showDelay: 200,
applyListeners: function(menu, cfg) {
Ext.apply(menu, cfg);
Ext.each(menu.items, function(item, idx, allItems) {
if(item.menu) this.applyListeners(item.menu, cfg);
}, this);
},
initComponent: function() {
var config = {},
menuConfig = {},
me = this;
me.delayedShowMenu = new Ext.util.DelayedTask(function() {
if(!me.isOver) return;
me.showMenu();
}, this);
me.delayedHideMenu = new Ext.util.DelayedTask(function() {
if(me.isOver) return;
me.hideMenu();
});
if(Ext.isDefined(this.initialConfig.menu)) {
config = {
listeners: {
mouseover: {
scope: me,
fn: function(b) {
me.isOver = true;
me.delayedShowMenu.delay(me.showDelay);
}
},
mouseout: {
scope: me,
fn: function(b) {
me.isOver = false;
me.delayedHideMenu.delay(me.hideDelay);
}
}
}
};
menuConfig = {
listeners: {
mouseover: {
scope: me,
fn: function(menu, item, e) {
me.delayedHideMenu.cancel();
}
},
mouseenter: {
scope: me,
fn: function(menu, e) {
me.delayedHideMenu.cancel();
}
},
mouseleave: {
scope: me,
fn: function(menu, e) {
me.delayedHideMenu.delay(me.hideDelay);
}
}
}
};
//apply mouseover/leave listeners to all submenus recursively
me.applyListeners(me.menu, menuConfig);
}
Ext.apply(me, Ext.apply(me.initialConfig, config));
Ext.HoverButton.superclass.initComponent.apply(me, arguments);
}
});
menuConfig 수신기 이벤트에'me.isOver = true/false'를 추가 했습니까? –
나는 그래, 어떤 차이를 만들 것 같지 않았어. 테스트가 끝나면 마우스 오버 이벤트가 발생하는 방식에 문제가있는 것처럼 보입니다. 그것은 실제로 하위 메뉴를 떠날 때 mouseleave 이벤트가 발생한 후 delayedHideMenu에서 .cancel()을 호출하기에 충분하거나 일관되게 실행되지 않습니다. –