Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Как узнать содержит ли DOM определенный элемент (https://javascript.ru/forum/events/8159-kak-uznat-soderzhit-li-dom-opredelennyjj-ehlement.html)

Ruslan 11.03.2010 10:38

Как узнать содержит ли DOM определенный элемент
 
К примеру с дереве есть элемент, мы получаем на него ссылку, затем заменяем содержимое его пра-родителя.

<div id="content">
  <div>
    <div id="bingo">Bingo</div>
  </div>
</div>


Скрипт
var bingo = document.getElementById('bingo');
var content = document.getElementById('content');
content.innerHTML = '<div><div id="bingo">Bingo 2</div></div>';


Как оптимально узнать что DOM не содержит элемент bingo?
можно использовать проверку наличия родителей bingo.parentNode, но при большой вложенности это будет не оптимально.

Shaci 11.03.2010 11:10

так вроде он у вас опять его содержит
content.innerHTML = '<div><div id="bingo">Bingo 2</div></div>';

Ruslan 11.03.2010 11:14

content содержит уже новый элемент, но с таким же ИД, т.е. проверить старый элемент через ИД не получится

Gvozd 11.03.2010 11:26

так вызовите снова метод getElementById
он вернет ссылку на новый уже элемент
только учтите, что на странице в один момент должен быть только один эдлемент с опредленным id

Ruslan 11.03.2010 11:32

да, такой вариант возможен, вызов getElementById для получения нового элемента, после чего сравнить старый с новым и принять решение о содержании в DOM старого элемента.

Но этот вариант будет работать только в случае с ИД, а если у элемента нет заранее известного ИД, и ссылка на него была получена методом навигации по DOM

Может еще какие варианты имеются?

Shaci 11.03.2010 11:38

Че-то я не совсем понял.
Ну, через id не получится.
Если у старого и нового bingo содержимое отличается, можно по нему проверить.
Если ссылку через id не получить, то наверн так же методом навигации ее искать.
<body>
<div id="content">
  <div>
    <div id="bingo">Bingo</div>
  </div>
</div>
</body>

<script>
alert(document.getElementById('bingo').childNodes[0].data);//Bingo
var bingo = document.getElementById('bingo');
//alert(bingo.childNodes[0].data);// Bingo
var content = document.getElementById('content');
content.innerHTML = '<div><div id="bingo">Bingo 2</div></div>';
alert(document.getElementById('bingo').childNodes[0].data);//Bingo 2
</script>

Kolyaj 11.03.2010 12:16

<html>
<head>
</head>
<body>
    <div id="content">
      <div>
        <div id="bingo">Bingo</div>
      </div>
    </div>
    <script type="text/javascript">
        // В FF нет contains, нужно сделать
        if (window.Node && Node.prototype && !Node.prototype.contains)
        {
            Node.prototype.contains = function (arg) {
                return !!(this.compareDocumentPosition(arg) & 16)
            }
        }

        var bingo = document.getElementById('bingo');
        var content = document.getElementById('content');
        alert(document.contains(bingo));
        content.innerHTML = '<div><div id="bingo">Bingo 2</div></div>';
        alert(document.contains(bingo));
    </script>
</body>
</html>


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

Ruslan 11.03.2010 12:28

да! похоже это именно то что я искал. премного благодарен!

добавлю сюда прямую ссылку на оригинальное решение http://www.quirksmode.org/blog/archi...ns_for_mo.html

Ruslan 12.03.2010 22:02

правильно использовать document.body.contains(bingo) иначе в ИЕ ошибка


Часовой пояс GMT +3, время: 04:43.