JavaScript判断元素存在与实时DOM可见性的方法
本文探讨JavaScript中判断元素存在的多种方法。首先指出jQuery选择器返回对象而非布尔值,需通过length属性判断。接着介绍通过getElementById结合null判断存在性。重点讲解如何检测元素是否在当前可见DOM中,推荐使用node.contains()方法,并简要提及baseURI和ownerDocument等替代方案。
问题背景与发现
周六下午在公司加班时,为了打发时间,我打开了公司的一个WordPress项目网站,检查之前制作的网页是否存在问题。
打开网站首页后,我像往常一样打开了Chrome调试工具,并滚动页面。此时发现问题:页面无法向下滚动,且控制台输出了大量undefined错误。
我立刻意识到,是我编写的JavaScript代码在首页错误执行导致了该问题。我的代码逻辑大致如下:
jQuery判断元素存在的误区
if ($('#a')) {
// some code ...
$('#b').doSomething;
// some code ...
}
这段代码的初衷是判断页面中是否存在某个特定ID标识的元素,如果存在则执行后续操作。由于网站首页本不应包含该元素,因此这段代码不应被执行。
如果你读到此处,应该能猜到我不是专业前端开发人员。我原本期望这段代码返回布尔类型的false,但它实际返回的是一个jQuery对象。
需要注意的是,这里获取的不是DOM元素本身。如果想获取真实的DOM元素,可以写成$('#a')[0]或者$('#a').get(0)。
实际上,$('selector')无论是否找到元素,永远返回一个jQuery对象。(关于此返回值的问题,可参考:What does jquery $ actually return? 和 How to get a DOM Element from a JQuery Selector)。
那么,如何判断id为a的元素是否存在呢?可以采用以下方法:if ($('#a').length)。如果不存在#a,返回的对象实际上是一个空对象,从而达到判断目的。
使用getElementById('a')也可以,它返回Element对象的一个引用(object类型)或者是null(document.getElementById()),可用于判断。
至此,我的问题得以解决,这篇文章本可以就此结束。
判断元素是否在实时DOM中
但我闲着无事又进行了一次Google搜索,随后在StackOverflow上发现了这样一个问答:How to check if element exists in the visible DOM? 问题是,如何检查元素是否存在于可见(当前实时)的DOM中。
该问答中提到了多种方法,除了上述两种,其他如getElementsByClassName、getElementsByName、querySelector等,思路基本相同,即简单检查元素是否存在。
针对提问者的需求,有人提供了两个较为有趣的方法,其中一个是:document.body.contains(element)。这里用到了node.contains(othernode)方法,它可以判断othernode是否为node的后代,并返回布尔值。
具体用法如下:
// 先获取要判断的元素节点
const aNode = document.getElementById('a');
// 然后判断该元素节点是不是当前文档页面body节点的后代
if (aNode.ownerDocument.body.contains(aNode)) {
// do something
}
实际上,利用此方法可以编写一个通用函数,用于判断某个元素节点是否位于页面上。大家可以参考Mozilla Developer Network官网JavaScript手册中的代码:
function isInPage(node) {
return (node === document.body) ? false : document.body.contains(node);
}
上述代码中,aNode.ownerDocument是一个只读属性,它返回aNode所在页面的顶级文档对象document。
另外,有人还提到了另一种方法:判断元素节点的baseURI是否存在。
baseURI是一个只读属性,node.baseURI返回node节点的绝对基准URL地址(可理解为页面的绝对URL地址),例如$('#a')[0].baseURI。
我在Chrome下进行了测试,当#a元素存在时,会返回一个URL字符串;不存在时则报undefined错误(因为#a不存在自然会报此错)。感觉这种方法在实际应用中操作不便,需要抛出和捕获错误,感兴趣的同学可以深入研究。
How to check if element exists in the visible DOM? 这个问答的发起者自己编写了一个方法,我将代码贴到下方:
<!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>
注意代码中的isNull函数,它用于判断元素是否存在。该方法实际上是依据元素的id是否为null来判断,思路与使用baseURI判断相似。我进行了测试,当元素存在时返回true。
但当元素不存在时,它会报undefined错误,感兴趣的同学可以进一步研究。
总结
总结:
判断一个元素是否存在,使用getElementById()(或其他选择元素的方法)并配合是否为null来判断,或使用jQuery获取对象并判断其length,简单且直接。
但如果想判断一个元素是否在当前实时可见的DOM中,则应使用node.contains(othernode)方法。
参考:
1,How to check if element exists in the visible DOM?
2,What does jquery $ actually return?
2,Node.contains()
3,Node.ownerDocument
4,How to get a DOM Element from a JQuery Selector
5,https://api.jquery.com/get/
6,baseURI
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持本站!
JS监听滚动事件:回到顶部按钮的显示与隐藏逻辑
2026-11-05 16:19:37
JavaScript怎么读写LocalStorage与SessionStorage
2026-11-05 15:40:11
anime.js 与 GSAP 对比:轻量级项目该怎么选择动画库
2026-11-05 11:24:55
flv.js 与 hls.js 在直播场景下的选型对比
2026-11-05 08:18:52
JavaScript能做什么?前端开发中的作用与应用场景解析
2026-11-04 23:17:54
