如何检查可见DOM中是否存在元素?

Jus*_*ull 377 javascript variables dom element exists

如何在不使用getElementById方法的情况下测试元素是否存在?我已经设置了一个现场演示供参考.我也会在这里打印代码:

<!DOCTYPE html>
<html>
<head>
    <script>
    var getRandomID = function (size) {
            var str = "",
                i = 0,
                chars = "0123456789abcdefghijklmnopqurstuvwxyzABCDEFGHIJKLMNOPQURSTUVWXYZ";
            while (i < size) {
                str += chars.substr(Math.floor(Math.random() * 62), 1);
                i++;
            }
            return str;
        },
        isNull = function (element) {
            var randomID = getRandomID(12),
                savedID = (element.id)? element.id : null;
            element.id = randomID;
            var foundElm = document.getElementById(randomID);
            element.removeAttribute('id');
            if (savedID !== null) {
                element.id = savedID;
            }
            return (foundElm) ? false : true;
        };
    window.onload = function () {
        var image = document.getElementById("demo");
        console.log('undefined', (typeof image === 'undefined') ? true : false); // false
        console.log('null', (image === null) ? true : false); // false
        console.log('find-by-id', isNull(image)); // false
        image.parentNode.removeChild(image);
        console.log('undefined', (typeof image === 'undefined') ? true : false); // false ~ should be true?
        console.log('null', (image === null) ? true : false); // false ~ should be true?
        console.log('find-by-id', isNull(image)); // true ~ correct but there must be a better way than this?
    };
    </script>
</head>
<body>
    <div id="demo"></div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

基本上上面代码演示的是一个元素存储到变量中然后从dom中删除.即使元素已从dom中删除,该变量仍保留元素,就像第一次声明时一样.换句话说,它不是元素本身的实时引用,而是副本.因此,检查变量的值(元素)是否存在将提供意外结果.

isNull函数是我尝试从变量中检查元素是否存在,并且它有效,但我想知道是否有更简单的方法来实现相同的结果.

PS:如果有人知道一些与该主题相关的好文章,我也对JavaScript变量的行为感兴趣.

ale*_*lex 492

似乎有些人正在这里登陆,只是想知道一个元素是否存在(与原始问题有点不同).

这就像使用任何浏览器的选择方法一样简单,并检查它的真实值(通常).

例如,如果我的元素有一个id"find-me",我可以简单地使用...

var elementExists = document.getElementById("find-me");
Run Code Online (Sandbox Code Playgroud)

这被指定要么返回对元素的引用,要么返回null.如果必须有布尔值,只需!!在方法调用之前抛出一个.

此外,您可以使用其他许多方法来查找元素,例如(所有生活document):

  • querySelector()/querySelectorAll()
  • getElementsByClassName()
  • getElementsByName()

其中一些方法返回一个NodeList,所以一定要检查它的length属性,因为a NodeList是一个对象,因此是真实的.


为了实际确定一个元素是否作为可见DOM的一部分存在(如最初提出的问题),Csuwldcat提供了一个比滚动自己更好的解决方案(如此答案所包含).也就是说,contains()在DOM元素上使用该方法.

你可以像这样使用它......

document.body.contains(someReferenceToADomElement);
Run Code Online (Sandbox Code Playgroud)

  • 更短:`var elementInDom = function(el){while(el = el.parentNode)if(el === document)return true; 返回false; }` (3认同)
  • @ButtleButkus阅读实际问题.您使用的解决方案没有意义,因为`getElementById()`*将*返回对DOM元素的引用或`null`,因此,使用`typeof`(特别是在RHS上)是错误的(如果它不是定义后,LHS条件会抛出一个`ReferenceError`). (2认同)
  • 是否有任何理由在下面发布的内容上使用它:`document.body.contains()`,它似乎具有很好的浏览器支持? (2认同)

Kon*_*Kon 291

getElementById()如果它可用,为什么不使用?

此外,这是使用jQuery执行此操作的简单方法:

if ($('#elementId').length > 0) {
  // exists.
}
Run Code Online (Sandbox Code Playgroud)

如果你不能使用第三方库,只需坚持基础JavaScript:

var element =  document.getElementById('elementId');
if (typeof(element) != 'undefined' && element != null)
{
  // exists.
}
Run Code Online (Sandbox Code Playgroud)

  • `getElementById`永远不应该返回`undefined`.无论如何,`element!= null`检查会选择它. (8认同)
  • 在第二个代码示例中是否有任何充分的理由要出现如此复杂的if语句?为什么不简单地说`if(element){}`?当元素未定义或为null时,此表达式为false.如果element是DOM元素,则表达式为true. (7认同)
  • 我认为这只是常识. (5认同)
  • 对于我正在进行的项目,我无法使用库.Good-ol'时尚原始代码.我知道这个jQuery方法,但它不适用于没有包装在jQuery容器中的元素.例如,`$('#elementId')[0] .length`不会产生相同的结果. (2认同)
  • @kayahr太复杂了。如果没有找到元素,则指定getElementById()返回null,因此只需要检查* truthy *返回值即可。 (2认同)
  • 请注意,元素必须具有能够通过getElementById()捕获的id (2认同)

csu*_*cat 172

使用Node.contains DOM API,您可以非常轻松地检查页面中任何元素的存在(当前在DOM中):

document.body.contains(YOUR_ELEMENT_HERE);
Run Code Online (Sandbox Code Playgroud)

交叉浏览器注意:documentIE中的对象没有contains()方法 - 为确保跨浏览器兼容性,请document.body.contains()改用

  • 这似乎是这个问题的最终答案......如果要相信MDN,它的支持是非常好的. (4认同)
  • @LeeSaxon 语法是`document.body.contains([selector])`,即`document.body.contains(document.getElementById('div')` (4认同)
  • 这确实是最好的答案: - 它是一个网络标准 - 它得到了很好的支持(有点令人惊讶的是它直到版本9才出现在Firefox中,我猜是因为它是IE中发明的非标准函数,不是标准化到以后) - 它必须是最快的,因为它使用对本机API的单个调用 (3认同)
  • 这是最好的答案.请注意,只需检查`document.contains()`即可. (2认同)

Ano*_*aly 59

我只是这样做:

if(document.getElementById("myElementId")){
    alert("Element exists");
} else {
    alert("Element does not exist");
}
Run Code Online (Sandbox Code Playgroud)

适合我,并没有任何问题....

  • 虽然帮助了我.我一直在寻找元素存在的简单测试; 这很有效.谢谢. (14认同)
  • 但这与原来的问题无关。OP 想知道对 DOM 元素的引用是否是可见 DOM 的一部分。 (2认同)

小智 33

最简单的方法:

const cond = document.getElementById('elem') || false
if (cond) {
    //does
} else {
    //does not
}
Run Code Online (Sandbox Code Playgroud)

如果需要在严格可见的 DOM 中,即不在整个页面上,请使用类似 view-js 的东西(我的库,所以可以根据需要使用它)


<script src='https://view-js.glitch.me/view-main.js'></script>
<script>
elem = $sel('#myelem');
if (isVis(elem)) { //yes } else { //no }
</script>
Run Code Online (Sandbox Code Playgroud)

const cond = document.getElementById('elem') || false
if (cond) {
    //does
} else {
    //does not
}
Run Code Online (Sandbox Code Playgroud)

<script src='https://view-js.glitch.me/view-main.js'></script>
<script>
elem = $sel('#myelem');
if (isVis(elem)) { //yes } else { //no }
</script>
Run Code Online (Sandbox Code Playgroud)


Ekr*_*que 11

来自Mozilla开发者网络

此函数检查元素是否在页面的正文中.由于包含是包容性的并且确定主体是否包含自身不是isInPage的意图,这种情况显式返回false.

function isInPage(node) {
  return (node === document.body) ? false : document.body.contains(node);
}
Run Code Online (Sandbox Code Playgroud)

node是我们要在中检查的节点.

  • `false`不应该是'true`吗? (4认同)

Rob*_*ene 11

我更喜欢使用该node.isConnected属性(访问 MDN)。

注意:如果元素也附加到 ShadowRoot 中,这将返回 true,这可能不是每个人都想要的行为。

例子:

const element = document.createElement('div');
console.log(element.isConnected); // Returns false
document.body.append(element);
console.log(element.isConnected); // Returns true
Run Code Online (Sandbox Code Playgroud)

  • 最简单的解决方案...比 document.body.contains 更容易。 (2认同)

mik*_*ers 10

你能检查一下parentNode属性是否为null?

if(!myElement.parentNode)
{
    //node is NOT on the dom
}
else
{
    //element is on the dom
}
Run Code Online (Sandbox Code Playgroud)

  • @poby:它可能看起来很优雅,但它并没有真正做到所要求的.它仅检查元素是否具有父元素.这并不意味着元素在可见DOM中,因为父元素可能没有连接到它. (10认同)

小智 7

最简单的解决方案是检查baseURI属性,该属性仅在元素插入DOM时设置,并在删除时恢复为空字符串.

var div = document.querySelector('div');

// "div" is in the DOM, so should print a string
console.log(div.baseURI);

// Remove "div" from the DOM
document.body.removeChild(div);

// Should print an empty string
console.log(div.baseURI);
Run Code Online (Sandbox Code Playgroud)
<div></div>
Run Code Online (Sandbox Code Playgroud)

  • 我甚至不知道DOM节点上有baseURI属性.我喜欢这种方法的是它使用了元素本身的属性,这可能意味着即使元素位于不同的文档(例如iframe)中它也能工作.我不喜欢它的是它似乎不适用于Webkit之外. (5认同)

Cod*_*ter 5

jQuery 解决方案:

if ($('#elementId').length) {
    // element exists, do something...
}
Run Code Online (Sandbox Code Playgroud)

这对我使用 jQuery 有效,不需要$('#elementId')[0]使用。


小智 5

一种检查元素是否存在的简单方法可以通过 jQuery 的一行代码来完成。

这是下面的代码:

if ($('#elementId').length > 0) {
    // Do stuff here if the element exists
} else {
    // Do stuff here if the element does not exist
}
Run Code Online (Sandbox Code Playgroud)


Moh*_*han 5

这段代码对我有用,我没有遇到任何问题。


    if(document.getElementById("mySPAN")) {
        // If the element exists, execute this code
        alert("Element exists");
    }
    else {
        // If the element does not exist execute this code
        alert("Element does not exists");
    }

Run Code Online (Sandbox Code Playgroud)