修补ExtJs window移动到iframe时,无法正常移动的bug
我目前在用Extjs开发一套OA系统,在使用Ext.window的过程中发现它在移动到iframe时,很难移动(当然如果是模式Ext.window是不会出现这种问题的)。因为鼠标的焦点会直接移到iframe中。研究了一天想到使用模式窗口的方式来解决它,在Ext.window移动前添加一个全屏的div在Ext.window后面,移动结束后再隐藏它。有了思路,马上展开行动。
Ext.window有beforeremove与move事件。好了就是他们两。兴高采烈的把代码写上去,测试运行。结果傻眼了,居然没触发beforeremove事件。没办法只有看Ext源代码,发现Ext.window是使用继承Ext.dd.DD 的Ext.Window.DD来移动。而在移动的过程中没有激发beforeremove事件。没办法只有自己定义一个Ext.dd.DD。测试运行,成功。
具体代码如下:
Var Business={}
Business.Window = function(config){
this.config = config||{};
Business.Window.superclass.constructor.call(this, this.config);
};
Ext.extend(Business.Window, Ext.Window, {
initDraggable : function(){
//设置DD
this.dd = new Business.Window.DD(this);
}
});
Business.Window.DD = function(win){
this.win = win;
Business.Window.DD.superclass.constructor.call(this, win.el.id, 'WindowDD-'+win.id);
this.setHandleElId(win.header.id);
this.scroll = false;
};
Ext.extend(Business.Window.DD, Ext.dd.DD, {
moveOnly:true,
headerOffsets:[100, 25],
startDrag : function(){
/*修改的代码开始*/
this.win.fireEvent("beforeremove",this);//Ext.Window的beforeremove没用,我就在这里激发一下事件
if(!Business.Window.MoveBackground){
var template = new Ext.Template(
'<div id="{id}" style="position:absolute;z-index:1;"></div>');
var mbg=template.append(Ext.getBody(), {id:Ext.id()},true);
Business.Window.MoveBackground=mbg;
};
Business.Window.MoveBackground.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true));
Business.Window.MoveBackground.show();
/*修改的代码结束*/
var w = this.win;
this.proxy = w.ghost();
if(w.constrain !== false){
var so = w.el.shadowOffset;
this.constrainTo(w.container, {right: so, left: so, bottom: so});
}else if(w.constrainHeader !== false){
var s = this.proxy.getSize();
this.constrainTo(w.container, {right: -(s.width-this.headerOffsets[0]), bottom: -(s.height-this.headerOffsets[1])});
}
},
b4Drag : Ext.emptyFn,
onDrag : function(e){
this.alignElWithMouse(this.proxy, e.getPageX(), e.getPageY());
},
endDrag : function(e){
this.win.unghost();
this.win.saveState();
Business.Window.MoveBackground.hide();/修改的代码
}
});
使用时只要用Business.Window代替Ext.Window就可以了。其中Business.Window.DD的代码大部分拷贝与Ext. Window.DD。只在startDrag与endDrag中添加了几句。
本人文笔很差,又是第一次写博客,写的不好的请大家原谅。