getElementById не работает на узле - PullRequest
4 голосов
/ 11 октября 2010

В этом простом скрипте я получаю сообщение об ошибке «obj.parentNode.getElementById не является функцией», и я понятия не имею, что не так.

<script type="text/javascript">

        function dosomething (obj) {
         sibling=obj.parentNode.getElementById("2");
         alert(sibling.getAttribute("attr"));
        }

</script>

<body>
 <div>
  <a id="1" onclick="dosomething(this)">1</a>
  <a id="2" attr="some attribute">2</a>
 </div>
</body>

Ответы [ 3 ]

6 голосов
/ 11 октября 2010

.getElementById() включено document, например:

document.getElementById("2");

Поскольку идентификаторы должны быть уникальными , нет необходимости в методе, который находит элемент по идентификатору относительно любого другого элемента (в данном случае внутри этого родителя). Кроме того, они не должны начинаться с цифры, если используется HTML4, числовой идентификатор имеет значение , действительное в HTML5.

3 голосов
/ 15 марта 2017

заменить .getElementById (id) на .querySelector ('#' + id);

1 голос
/ 20 октября 2012

document.getElementById() не будет работать, если узел был создан на лету и еще не присоединен к основному документу dom.

Например, в Ajax не все узлы присоединены в любой заданной точке. В этом случае вам нужно либо явно отслеживать дескриптор для каждого узла (как правило, лучше всего для производительности), либо использовать что-то подобное для поиска объектов:

function domGet( id , rootNode ) {
    if ( !id ) return null;

    if ( rootNode === undefined ) {

        // rel to doc base
        var o = document.getElementById( id );
        return o;

    } else {

        // rel to current node
        var nodes = [];
        nodes.push(rootNode);
        while ( nodes && nodes.length > 0 ) {
            var children = [];
            for ( var i = 0; i<nodes.length; i++ ) {
                var node = nodes[i];
                if ( node && node['id'] !== undefined ) {
                    if ( node.id == id ) {
                        return node; // found!
                    }
                }

                // else keep searching
                var childNodes = node.childNodes;
                if ( childNodes && childNodes.length > 0 ) {
                    for ( var j = 0 ; j < childNodes.length; j++ ) {
                        children.push( childNodes[j] );
                    }
                }
            }
            nodes = children;
        }

        // nothing found
        return null;
    }
}
...