Javascript 在重复结构中检索DOM节点

Javascript 在重复结构中检索DOM节点,javascript,jquery,html,dom,Javascript,Jquery,Html,Dom,我正在编写一个库,它在给定的DIV容器中构建一个复杂的HTML结构(使用JQuery) 这是一个如何工作的示例: HTML <div id="a"></div> <div id="b"></div> 库用户JAVASCRIPT function complexStructure(container, opts) { this._container = $(container); // code handling options

我正在编写一个库,它在给定的DIV容器中构建一个复杂的HTML结构(使用JQuery)

这是一个如何工作的示例:

HTML

<div id="a"></div>
<div id="b"></div>
库用户JAVASCRIPT

function complexStructure(container, opts) {
    this._container = $(container);
    // code handling options
    // ...
}

complexStructure.prototype = {
    show: function () {
        this._buildStructure();
    },

    _buildStructure: function () {
        // building html nodes here
        // ...
        for ( x=0; ... ) {
            for ( y=0; ... ) {
                // ...
                obj.attr("id", this._idOfElement(x, y));
                // ...
            }
        }
        // ...      
        this._container.empty().append(structure);
    },

    _idOfElement: function (x ,y) {
        return "element_x_" + x + "_y_" + y;
    },

    updateElementState: function (x, y, state) {
            var element = this._container.find("#" + this._idOfElement(x, y));
            // ...
            // update element
            // ...
    }
};
var a = new complexStructure(document.getElementById("a"), {... opts ...});
var b = new complexStructure(document.getElementById("b"), {... opts ...});
a.show();
b.show();
在构建节点时,我为它们分配ID,以便稍后检索它们。 为了检索它们,我从它们的祖先DIV容器开始查找它们的ID,因为可能有多个节点具有相同的ID(在diva和divb中)

我想知道在这种情况下使用重复ID是否可以,或者我是否更喜欢使用CSS类或自定义属性。 在这种情况下,最佳实践是什么?您对总体架构有什么建议

当然,实际代码要比这复杂得多


谢谢你抽出时间

我自己来回答

为了避免ID重复,只需将结构的每个节点的ID附加到其容器的ID中

一种解决方案是在构造函数或设置函数中为容器选择ID:

this._containerId = ... generate random/unique/sequential ID ...;
然后将元素的ID附加到其容器的ID:

_idOfElement: function (x, y) {
    return this._containerId + "_element_x_" + x + "_y_" + y;
}
如果您确信传递给构造函数的容器将始终插入DOM树中(以便您可以使用
getElementById
检索它),另一个解决方案可以是将结构构造函数从以下位置更改:

function complexStructure(container, opts) {
    this._container = $(container);
    // code handling options
    // ...
}
致:


然后使用与上面相同的
\u idOfElement
功能。

使用dublicate ID从来都不是“好的”:)为什么不使用父ID作为子ID的种子?父ID+“x”+x+“y”+y@AdrianSalazar你的意思是为容器选择一个随机id,比如“containerXXXX”,其中XXXX是一个随机数?是的,这可以做到,但是你知道你所有的容器都有一个id吗?因此您可以访问它。_container.attr('id')我可以通过更改构造函数来强制用户为容器指定id:第一个参数必须是容器id,而不是容器节点。无论如何,这种方式将强制容器位于DOM树中的某个位置。。
function complexStructure(containerId, opts) {
    this._containerId = containerId;
    this._container = $("#" + containerId);
    // code handling options
    // ...
}