失去焦点时自动关闭 ExtJS Window
Automatically Close ExtJS Window When Losing Focus
我有一个可以在我的应用程序中打开的小 window,它允许用户执行琐碎的任务,当用户在 window 之外单击时,我想简单地关闭它。一些示例建议在后台监听点击事件 "mask" - 除了感觉有点老套之外,这不是一个选项,因为 window 未配置因为modal
因为它的功能是non-blocking,我不想限制它后面的UI。
我最初尝试挂钩到 blur
事件,但是在 ExtJS 5+ 中行为是喜怒无常的,即 以下示例 (fiddle),请尝试在 window.
之外拖动或单击
var win = Ext.create('Ext.window.Window', {
width: 500,
height: 250,
items: {
xtype: 'box',
padding: 20,
html: 'Test window...'
}
});
win.on('blur', win.close, win);
win.show();
- 在 5.1.0 到 5.1.1 这完全失败了。
- 在 5.1.2 到 6.2.0 这有效,但如果您尝试通过 header 拖动会意外关闭。
是否有一些其他配置或巧妙的解决方案可以解决这两个问题,cross-version?
我没有与组件的 focus
状态作斗争,而是选择了以下 MVC 设置,它侦听全局点击事件,然后确定用户是否点击了 window。
Ext.define('App.window.DismissableWindow', {
extend: 'Ext.window.Window',
controller: 'dismissableWindow'
// config ...
});
Ext.define('App.window.DismissableWindowController', {
extend: 'Ext.app.ViewController',
alias: 'controller.dismissableWindow',
listen: {
global: {
mousedown: 'dismissWindowCheck'
}
},
dismissWindowCheck: function(ev){
var view = this.getView();
if(!view.owns(ev.getTarget()))
view.close();
}
});
我有一个可以在我的应用程序中打开的小 window,它允许用户执行琐碎的任务,当用户在 window 之外单击时,我想简单地关闭它。一些示例建议在后台监听点击事件 "mask" - 除了感觉有点老套之外,这不是一个选项,因为 window 未配置因为modal
因为它的功能是non-blocking,我不想限制它后面的UI。
我最初尝试挂钩到 blur
事件,但是在 ExtJS 5+ 中行为是喜怒无常的,即 以下示例 (fiddle),请尝试在 window.
var win = Ext.create('Ext.window.Window', {
width: 500,
height: 250,
items: {
xtype: 'box',
padding: 20,
html: 'Test window...'
}
});
win.on('blur', win.close, win);
win.show();
- 在 5.1.0 到 5.1.1 这完全失败了。
- 在 5.1.2 到 6.2.0 这有效,但如果您尝试通过 header 拖动会意外关闭。
是否有一些其他配置或巧妙的解决方案可以解决这两个问题,cross-version?
我没有与组件的 focus
状态作斗争,而是选择了以下 MVC 设置,它侦听全局点击事件,然后确定用户是否点击了 window。
Ext.define('App.window.DismissableWindow', {
extend: 'Ext.window.Window',
controller: 'dismissableWindow'
// config ...
});
Ext.define('App.window.DismissableWindowController', {
extend: 'Ext.app.ViewController',
alias: 'controller.dismissableWindow',
listen: {
global: {
mousedown: 'dismissWindowCheck'
}
},
dismissWindowCheck: function(ev){
var view = this.getView();
if(!view.owns(ev.getTarget()))
view.close();
}
});