sky*_*000 6 javascript oop dom class-design dhtml
我对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();
Run Code Online (Sandbox Code Playgroud)
这感觉不对"." 另一种方法可能是使用render()方法并使用它来分离HTML生成代码.JS对象在其中包含多个嵌套的HTML对象似乎很尴尬.我应该通过innerHTML传入嵌套标签吗?
所以我好奇......这里最好的方法是什么?设计具有DOM代码(HTML对象和样式)以及传统变量和方法的类的最佳方法是什么?有没有办法将Prototype用于这些HTML对象?你甚至可以想象在这个例子中还有一个WindowManager类,它包含实例化的Window对象,帮助管理它们,并创建新的对象.它也可以有HTML表示.
上面的一些可以用静态CSS处理并应用ID /类来清理一些代码,但是我们只能说定位和大小必须以编程方式完成(以处理调整大小,拖放等).
我对可能由ExtJS,jQuery等提供的框架级解决方案不感兴趣.我想知道本土代码的最佳实践是什么.事实上,我有兴趣了解所述框架的工程师如何设计他们的UI类.
对于对象的 HTML 部分,您可以使用模板来定义组件的 HTML 结构,并在组件初始化时插入所需的任何数据。实现模板功能的方法有很多种,看一下underscore.js 的例子。
对于样式,我会将默认值放入样式表中。如果稍后需要通过 javascript 修改它们也没关系,即使它们是在 css 中定义的,那仍然可以工作。组件中应该包含的唯一信息是该组件触发的各种事件的默认行为。
您还可以考虑创建一个简单的原型链,用于将公共属性放入基“类”中(了解 javascript 没有真正的类),再次参考 underscore.js 以获取执行此操作的扩展函数的示例,以及其他实现可以用谷歌搜索。
最后,最重要的是您的代码易于使用和理解,并且性能相当好。您还可以返回并改进工作不太好的部分,或者将代码重新组织成模块。
| 归档时间: |
|
| 查看次数: |
1716 次 |
| 最近记录: |