【发布时间】:2011-07-05 05:01:14
【问题描述】:
我非常熟悉 JavaScript 和 OOP,但对设计用于编程 UI (HTML) 的 JS 类非常不熟悉。我搜索了一下,但没有发现任何流行的模式。
假设我想动态创建类似面板的对象(类似于 Microsoft Windows 面板)。每个对象都需要一个容器、一个可以包含文本标签的标题区域和一个具有单击事件处理程序的关闭按钮。除了 DOM 表示 (HTML) 之外,该对象还将具有 JavaScript 对象表示(变量和方法)。这是我尝试过的一种方法:
//
// Window class
//
var Window = function(params) {
this.testMethod = function() {
console.log('test'); // just an example
}
this.windowDiv = document.createElement('div');
this.windowDiv.style.width = params.width + 'px';
this.windowDiv.style.height = params.height + 'px';
this.windowDiv.style.position = 'absolute';
this.windowDiv.style.top = '30px';
this.windowDiv.style.left = '30px';
this.windowDiv.style.border = '1px solid #000';
this.headerDiv = document.createElement('div');
this.headerDiv.style.width = '100%';
this.headerDiv.style.height = '30px';
this.headerDiv.style.background = '#bbb';
this.headerDiv.style.borderBottom = '1px solid #000';
this.headerDiv.innerHTML = params.title;
this.buttonDiv = document.createElement('div');
this.buttonDiv.style.width = '30px';
this.buttonDiv.style.height = '18px';
this.buttonDiv.style.position = 'absolute';
this.buttonDiv.style.top = '0px';
this.buttonDiv.style.right = '5px';
this.buttonDiv.style.textAlign = 'center';
this.buttonDiv.style.background = 'red';
this.buttonDiv.style.border = '0px 1px 1px 1px solid #000';
this.buttonDiv.innerHTML = 'x';
this.buttonDiv.addEventListener('click', function(e) {
document.body.removeChild(e.target.parentNode.parentNode);
}, false);
this.headerDiv.appendChild(this.buttonDiv);
this.windowDiv.appendChild(this.headerDiv);
document.body.appendChild(this.windowDiv);
}
// Initialize
var myWindow = new Window({
width: 400,
height: 200,
title: 'My Window'
});
myWindow.testMethod();
这感觉不“正确”。另一种方法可能是使用 render() 方法并使用它来分离 HTML 生成代码。 JS 对象中包含多个嵌套的 HTML 对象似乎很尴尬。我应该只通过 innerHTML 传递嵌套标签吗?
所以我很好奇......这里最好的方法是什么?设计具有 DOM 代码(HTML 对象和样式)和传统变量和方法的类的最佳方法是什么?有没有办法为这些 HTML 对象使用原型?您甚至可以想象在此示例中还有一个 WindowManager 类,它包含实例化的 Window 对象,帮助管理它们并创建新对象。它也可以有 HTML 表示。
上面的一些可以用静态 CSS 和应用 ID/类来清理一些代码,但我们只是说定位和大小必须以编程方式完成(处理调整大小、拖放等) .
我对 ExtJS、jQuery 等可以提供的框架级解决方案不感兴趣。我想知道本土代码的最佳实践是什么。事实上,我很想知道上述框架的工程师是如何设计他们的 UI 类的。
【问题讨论】:
-
jQuery 和 jQueryUI 是开源的。你总是可以看看;)github.com/bmsterling/jquery-ui
-
John Resig (jQuery) 提供了我认为我见过的最全面的设计讨论。你需要从那里开始。
标签: javascript oop dom class-design dhtml