移动DOM元素的方法

Methods to Move DOM Element

本文关键字:方法 元素 DOM 移动      更新时间:2023-09-26

我正在编写一个Javascript游戏,作为对象和AJAX的练习。它涉及到帆船围绕着一个航海主题的网格运动。尽管wessels是在一个对象数组中,但我需要操作它们的图形表示,即它们的精灵。目前,从DOM的角度来看,我选择在"td"元素中使用"img"元素。从UI连续性的角度来看,推荐使用Javascript以编程方式移动元素的方法:
(a)删除'from' cell (td元素)的内部HTML,重写'to' cell的内部HTML,
(b)克隆img节点(精灵),从父节点中删除原始节点,并将其附加到'to'单元格,或
(c)为精灵使用相对于table元素的定位,忽略所有td(尽管它们的背景[color]代表海洋深度)。

我肯定会坚持将精灵从一个单元格移动到另一个单元格,而不是对表格使用相对定位。我的理由是,表格单元格的大小可能因浏览器而异(在填充、边距等呈现方式上存在差异——特别是在恼人的IE中),并且计算精灵的确切位置以使其在给定单元格内对齐可能会变得复杂。

这就把你的选择范围缩小到(a)或(b)。这里我们去掉选项(a),因为从内部删除HTML并不是一种干净的操作DOM的方式。我喜欢将节点存储在对象中,然后将其附加到"to"单元格,然后删除原始节点的想法,这是选项(b)所建议的。这样,你仍然在处理高级"对象",而不是不必要的低级"文本"。你不需要弄乱文本——对于这样的应用程序,如果你不知道JavaScript已经提供的DOM操作函数,那么这将是一种肮脏的"黑客"方式。

我的答案是(b)。然而,如果你绝对需要速度——虽然我不知道你的游戏是否真的需要额外的提升——你可以考虑选项(a)。一些来源,如http://www.quirksmode.org/dom/innerhtml.html认为DOM操作方法通常比使用innerHTML慢。但这是所有事情的一般规律。层次越低,编写代码的速度就越快。级别越高,越容易理解和概念化代码,在我看来,由于速度在这种情况下不会产生很大的差异,因此保持简洁并使用(b)。

不需要克隆img节点,删除旧节点并追加克隆。只需将img节点附加到接收td。它将自动从它之前所在的td中移除。简单、有效、快捷。