2013-01-25 45 views
0

我知道几乎DOM中的任何项目都可以拥有“id”属性,并且我一直使用它来跟踪客户端表中的每个客户端。我也知道,你不应该重复任何身份证。在我的代码中,行的id设置为每个人的“clientId”,它来自数据库中的唯一键,因此不会有重复...但页面上的其他位置是“问题”表,其中我一直在设置每行的id为“issueId”(同样是一个唯一的键),但我意识到clientId可能会匹配一个问题,我不知道结果。我可以使用什么来代替id属性,以防万一有重复?

我正在寻找一种方法来识别每一行,以便我可以稍后调用它们。是否有另一个属性,我可以使用这将是首选吗?我应该在分配ID时在数字前添加“客户端”这个词吗?我想使用标准的做法,并在这里有一个快速的网络应用程序。

如果一个客户和一个问题编号匹配是可以的,因为我会一直知道我在找哪一个,我可以在找到它时先查看表格。我只是不想使用“身份证”,因为它的非法使身份证重复。例如,如果我正在寻找一个问题,我可以使用类似的东西。 document.getElementById("issueTable").getElementBySOMETHING(issueId)而不仅仅是document.getElementBySOMETHING(issueId)

+3

为什么不前缀 “客户-X” 或 “问题-X” 的ID? –

+0

使用前缀... –

+0

@JanDvorak,实际上[ID可以以HTML5中的数字开头](http://www.w3.org/TR/2011/WD-html5-20110525/elements.html#the-id-属性) – zzzzBov

回答

1

为了确保没有冲突,你可以一个唯一的前缀添加到您的ID值,例如,client-Xissue-X
现在,即使它们共享相同的密钥,由于此前缀,每个属性的ID属性也不相同。然后,您可以修改您查找代码如下

document.getElementById('issue-'+key); // get by issue 
document.getElementById('client-'+key); // get by client 

这意味着你可以在一个查询得到你的元素,并使用getElementById这是the fastest methods之一。此外,这种方法意味着如果您希望使用CSS规则以不同方式对元素进行样式设置,则上一代浏览器不会遇到以数字开头的键。

+0

+1为最佳可用选项。可以将它切成i-X和c-X。 – Dom

+0

@ DominicB-c yep,但永远不要忘记在生产中有明确的代码的好处! –

+0

那么最简单的方法是什么时候将数字ID撤回,以防我需要将数字本身发送到数据库? – VoltzRoad

3

使用class而不是id

getElementsByClassName(); // needs a shim for IE8 and lower 
+0

所以你建议在发生碰撞的情况下进行混淆?请阅读该问题。 –

+1

@JanDvorak,没有这个系统是正确的,没有足够的细节,给所有'issue'项目授予一个类,给所有'client'项赋予一个类,并且使用一些'data- *'属性来传递必要的数据到DOM。 – zzzzBov

+0

@zzzzBov然后我会保留这个答案非我投票。 –

0

getElementById() - 通过ID返回元素的引用。

getElementsByClassName() - 返回一组具有所有给定类名称的元素。在文档对象上调用时,将搜索包括根节点在内的完整文档。你也可以在任何元素上调用getElementsByClassName;它将仅返回具有给定类名称的指定根元素的后代的元素。

getElementsByTagName() - 返回具有给定标签名称的元素列表。搜索指定元素下的子树,排除元素本身。返回的列表是实时的,这意味着它会自动使用DOM树进行自我更新。因此,不需要使用相同的元素和参数多次调用element.getElementsByTagName。

querySelectorAll() - 返回与指定的选择器组相匹配的文档中的元素列表(使用深度优先遍历文档节点)。返回的对象是一个NodeList。

字体:

http://www.quirksmode.org/dom/w3c_core.html#gettingelements

https://developer.mozilla.org/en-US/docs/DOM/

相关问题