javascript - 设计在 DOM 中表示 UI 对象的 JavaScript 类的最佳实践是什么?

标签 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();

这感觉不“对”。另一种方法可能是拥有一个 render() 方法并使用它来分离出 HTML 生成代码。 JS 对象内部包含多个嵌套的 HTML 对象,这看起来很尴尬。我应该只通过 innerHTML 传递嵌套标签吗?

所以我很好奇……最好的方法是什么?设计具有 DOM 代码(HTML 对象和样式)以及传统变量和方法的类的最佳方法是什么?有没有办法为这些 HTML 对象使用原型(prototype)?你甚至可以想象在这个例子中还有一个 WindowManager 类,它包含实例化的 Window 对象,帮助管理它们,并创建新的。它也可以有 HTML 表示。

上面的一些可以用静态 CSS 和应用 ID/类来清理一些代码来处理,但我们只能说定位和大小必须以编程方式完成(以处理调整大小、拖放等) .

我对 ExtJS、jQuery 等可以提供的框架级解决方案不感兴趣。我想知道什么是自制代码的最佳实践。事实上,我很想知道上述框架的工程师是如何设计他们的 UI 类的。

最佳答案

对于对象的 HTML 部分,您可以使用模板来定义组件的 HTML 结构,在组件初始化时插入任何必要的数据。模板功能的实现方式有很多种,看看underscore.js举个例子。

对于样式,我会将默认值放在样式表中。稍后是否需要通过 javascript 修改它们并不重要,即使它们是在 css 中定义的,它仍然可以工作。组件中应该包含的唯一信息是该组件触发的各种事件的默认行为。

您还可以考虑创建一个简单的原型(prototype)链,用于将公共(public)属性放入基“类”(了解 javascript 没有真正的类),再次引用 underscore.js 以获取执行此操作的扩展函数的示例,其中可以用谷歌搜索的其他实现。

最后,重要的是您的代码易于使用和理解,并且性能相当好。您还可以返回并改进效果不佳的部分,或者将代码重新组织到模块中。

关于javascript - 设计在 DOM 中表示 UI 对象的 JavaScript 类的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6578102/

相关文章:

java - 创建实例的接口(interface)应该叫什么

c - luajit ffi构造函数参数路由

javascript - 使用 jquery(或 vanilla JS)在页面加载时格式化表格中的数字

html - 使 Div 高度为屏幕的 100%

javascript - 如何将多个变量传递给 HTML/PHP 中的 JavaScript 函数?

javascript - Angular 在 ng-model 中使用 $index

javascript - 将父级设置为子级 - 循环引用

javascript - 在 javascript 提示符下输入文本后,我的文本没有出现在屏幕上

javascript - IndexedDB 是否需要在升级时关闭?

javascript - 切换类搞乱了一些东西