javascript - style - document.getelementbyid(...) is null




Javascript getElementById lookups-hash map o recursive tree traversal? (3)

¿El DOM tiene una tabla hash de elementos cuyas claves son los identificadores de los elementos?
Quiero saber si document.getElementById busca una tabla hash o recorre todo el árbol.
¿Este comportamiento es diferente en todos los navegadores?


Conozco las implementaciones de DOM de Firefox y WebKit, ambas usan una tabla hash para buscar los elementos, buscando en el origen de ellos, puedes echarle un vistazo a las implementaciones internas:

La implementación de WebKit, WebKit , usa la tabla hash si el id es único; de lo contrario, atraviesa el documento para obtener la primera coincidencia:

Element* Document::getElementById(const AtomicString& elementId) const
{
    if (elementId.isEmpty())
        return 0;

    m_elementsById.checkConsistency();

    Element* element = m_elementsById.get(elementId.impl());//<-- hastable lookup
    if (element)
        return element;

    if (m_duplicateIds.contains(elementId.impl())) {
        // We know there's at least one node with this id,
        // but we don't know what the first one is.
        for (Node *n = traverseNextNode(); n != 0; n = n->traverseNextNode()) {
            if (n->isElementNode()) {
                element = static_cast<Element*>(n);
                if (element->hasID() &&
                element->getAttribute(element->idAttributeName()) == elementId) {
                    m_duplicateIds.remove(elementId.impl());
                    m_elementsById.set(elementId.impl(), element);
                    return element;
                }
            }
        }
        ASSERT_NOT_REACHED();
    }
    return 0;
}

Implementación de Firefox, Firefox


La implementación específica no está definida en las especificaciones HTML, por lo que podría variar fácilmente el navegador al navegador. Por ejemplo , los estados de la documentación de IE

Devuelve una referencia al primer objeto con el valor especificado del atributo ID o NAME.

así que estaría tentado de decir que hace una búsqueda (o simplemente arroja elementos en casos de colisiones hash).

EDITAR También tenga en cuenta que hay otras estructuras de datos (como árboles) que permiten el tiempo de acceso en algún lugar entre constante y lineal.


No debería ser difícil de probar.

Si se basa en un árbol, hacer un árbol muy profundo (a través de Javascript) debería ser un buen caso de prueba.





getelementbyid