Mấy hôm trước rảnh rỗi ngồi code lại trang chủ, tình cờ phát hiện thêm 1 điểm đáng chán của IE.
Chả là tớ gom các đối tượng cửa sổ giả lập vào 1 class để dễ quản lý theo tầng. Class ấy có dạng thế này :
PHP Code:
function Window(id, width, height, content, url, title, icon){
this.id=id;
this.width=width||200;
this.height=height||100;
this.title=title;
this.content=content||'';
this.icon=icon||'';
this.url=url||'';
this.state=0;
this.zIndex=0;
this.top=0;
this.left=0;
this.cursorX=0;
this.cursorY=0;
this.topToPoint=0;
this.leftToPoint=0;
this.iconPath='';
this.modal=false;
this.draggable=false;
this.minimizable=false;
this.getState=function(){return this.state}
this.setOrder=function(z){
...
}
this.init=function(){
...
}
this.display=function(){
...
}
this.focus=function(){
...
}
..........
}
Sau đó tớ nghĩ đến 1 số hộp thoại nhận dữ liệu đơn giản, nó hiển thị ở tầng trên như 1 cửa sổ, nhưng không phải là cửa sổ, nó cũng di chuyển được nhưng không thể thu nhỏ, không chiếm chỗ trong stack phân tầng, không thể chứa 1 inline frame... Túm lại nó khá giống các cửa sổ nhưng không phải là cửa sổ. Nếu đặt ra các thuộc tính để phân biệt thì rườm rà code, nếu viết riêng 1 class khác thì không lợi dụng được những điểm tương đồng giữa 2 lớp. Thế nên tớ chọn giải pháp viết 1 class Dialog sao chép toàn bộ các methods và properties của class Window sang, như sau :
PHP Code:
function Dialog(id, width, height, content, title){
this.__proto__ = new Window(id, width, height, content, '', title, '');
this.modal=true;
}
Rất tuyệt, việc gán mọi thuộc tính và phương thức từ lớp này sang lớp kia với __proto__ khiến cho code gọn không thể hơn được. Chrome, FireFox, Opera đều chạy ngon lành.
Ấy thế mà thằng IE đếch hiểu ! Nó bắt mình phải tạo 1 đối tượng trung gian rồi gán từng Method, từng Property qua Dialog, khiến cho class trở nên như vầy
PHP Code:
function Dialog(id, width, height, content, title){
if(this.__proto__) this.__proto__ = new Window(id, width, height, content, '', title, '');
else{
var k=new Window(id, width, height, content, '', title, '');
this.drop=k.drop;
this.setPosition=k.setPosition;
this.moving=k.moving;
this.startMove=k.startMove;
this.makeDraggable=k.makeDraggable;
this.getCursorPos=k.getCursorPos;
this.getWinsize=k.getWinsize;
this.setState=k.setState;
this.getState=k.getState;
this.setOrder=k.setOrder;
this.getOrder=k.getOrder;
this.close=k.close;
this.focus=k.focus;
this.display=k.display;
this.init=k.init;
this.draggable=k.draggable;
this.minimizable=k.minimizable;
this.id=id;
this.width=width;
this.height=height;
...
}
this.modal=true;
}
Nhìn chuối không thể tả ! Các bác có giải pháp nào hay hơn để xử lý tình huống trên cho MSIE không nhỉ
Bookmarks