【问题标题】:How can I use Object Oriented Javascript to interact with HTML Objects如何使用面向对象的 Javascript 与 HTML 对象交互
【发布时间】:2010-12-27 20:08:46
【问题描述】:

我对面向对象的 javascript 非常陌生,有使用 python 和 java 编写 gui 的经验。我正在尝试创建可以放置在整个网页中的位置的 html 表。每个 html 表格将有两个 css 布局来控制它是否被选中。如果我只有一张桌子,我可以编写所有的交互。当我有多个表时,它会变得混乱。我想知道如何将这些表格放置在整个空白网页中,然后单独访问这些表格。我想我无法理解继承和层次结构在 javascript/html 中的工作原理。

注意:我不是在问如何制作一张桌子。我正在尝试动态创建多个表并将它们放置在整个网页中。然后独立访问他们的 css 并更改它(将它们移动到不同的位置或改变外观的方式,独立于其他表)。

【问题讨论】:

  • 您可能想提供一些明确的代码示例来说明您正在做什么或提供指向演示站点的链接。

标签: javascript html oop object design-patterns


【解决方案1】:

假设您想要实时进行更改并且您愿意使用像 jQuery 这样的库,只需将表格附加到文档并为每个表格分配一个唯一的 CSS id。无论您的表格生成代码发生在哪里,只需保留一个计数器并将 id 设置为“mytable+counter_val”之类的东西。

您可以从那里引用每个表并使用 jQuery 方法根据自己的喜好调整 CSS。

一个简单的例子:

var container_id = "#the_parent";

for (var i = 0; i < 10; ++i) {
 var table_id = "mytable_" + i;
 var table_code = "<table id=" + table_id + "></table>";
 $(container_id).append(table_code);
}

// set border on table 7 (indexing at 0)
$("#mytable_6").css("border", "5px solid red");

// move table 5 (indexing at 0)
$("#mytable_4").css("top", "300px");

// animate table 2 (indexing at 0)
$("#mytable_1").animate({left : 300, top: 125}, 2000);

如果您将选中和未选中分为一个类,您可以添加/删除该类:

// table 2 is now displayed as being selected
$("#mytable_1").addClass("selected");

// table 2 is now displayed as being unselected
$("#mytable_1").removeClass("selected");

有关更多信息,请参阅 jQuery 文档:http://docs.jquery.com/Main_Page

【讨论】:

  • 他们都共享两个 CSS 文件。一种用于活动,一种用于不活动。在某些操作中,我将选择一个表(仅为该表更改两个 css 文件之间的值)。然后将其拖到新位置。我可以用一张桌子做到这一点。当我动态生成它们时,我只是不知道如何访问不同的表。
  • 引用 HTML 元素的最简单、最快和最有效的方法是通过它们分配的 CSS id。不能像我上面说的那样设置id吗?
  • 您建议我如何跟踪这些 ID?我写这篇文章的方式是试图将每个表视为一个对象或节点。我可以将 css id 作为字段放在该节点中吗?
  • 如果您在 vanilla JS 中执行此操作(即没有 jQuery 库),那么您可能会执行一些 document.createElement("table") 调用。只需将它的返回设置为您可以存储在对象中的东西。这将为您提供对您正在创建以存储信息的任何对象内的表元素的引用。返回值本质上成为您对表的“this”引用。这条路线不需要使用 CSS id。
  • 啊,好吧。如果通过 vanilla JS 附加元素,则可以将返回的 JS 对象转换为 jQuery 对象并将 jQuery 对象存储在自定义对象中。这避免了对 CSS id 的需要。如果使用 jQuery 的 .append() 追加,则需要使用 id 来引用新元素,或者遍历 DOM 树以获取刚刚插入的新子元素的句柄。问题基本上归结为保留每个表的句柄,因此您可以使用 id 或 JS/jQuery 对象来做到这一点。
【解决方案2】:

我不明白在您的问题中需要 oop 原则。为什么需要继承和层次结构来生成几个元素,然后更改它们的一些道具?
如果我理解正确,您会想要跟踪您创建的每个表,以便以后更改它的 css 道具。
如果您想使用 js 作为面向对象的语言,我会为表对象编写一个类定义:
var Table = function(innerHTML,container){
this.innerHTML = innerHTML;
this.container = container; }
//static member
Table.TABLES = [];//global reference to all the tables created
Table.prototype = { init : function(){
this.dom = document.createElement('table'); this.dom.innerHTML = this.innerHTML; this.container.append(this.dom); Table.TABLES.add(this); }, setCssProp : function(name,value){ this.dom.style.setProperty(name,value); }
}

然后您所要做的就是创建一个新表并启动它:
(new Table(table_content_here)).init();,
稍后您可以通过访问 Table 类中的 TABLES 来引用它:
for (var i in Table.TABLES)
Table.TABLES[i].setCssProp(cssName,cssValue);

我知道您知道如何创建表,我只是建议您保留对您创建的表的全局引用,以便以后访问它们。

【讨论】:

    猜你喜欢
    • 2021-02-02
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多