javascript判断元素存在和判断元素存在于实时的dom中的方法

今天(周六)下午我在公司加班时不知道要干什么,就打开公司的一个wordpress项目网站,想看下之前自己做的一个网页是否有问题。

打开网站首页,我习惯性的打开了chrome的调试工具,然后鼠标开始滚动页面,然后问题就出来了:页面无法向下滚动,调试工具的console里报了好多undefined的错误。

我马上意识到是我写的js代码错误的在首页被执行导致的问题,我的代码大致是这样:

1 if ($(‘#a‘)) {
2   // some code ...
3   $(‘#b‘).doSomething;
4   // some code ...
5 }

这段代码的想要做的就是,判断下页面是否有某个id标识的元素,如果有就做一些事情。网站首页是应该没有这个元素的,不应该执行这个代码。

好吧,如果你看到这里,你肯定能猜到我不是做前端的。我期望它返回一个布尔类型的false,但它实际上返回的是一个jQuery Object,

注意这里获得的不是dom element,如果想获得真实的dom element,可以这么写$(‘#a‘)[0]或者$(‘#a‘).get(0)。

其实$(‘selector‘)返回的永远都是一个jQuery Object,不管它找没找到元素。(关于这个返回值的问题请参考:What does jquery $ actually return? 和 How to get a DOM Element from a JQuery Selector)。

那么我该如何判断id=a的元素是否存在呢?其实可以这么做,if ($(‘#a‘).length),如果没有#a则返回的object其实是个空对象,可以达到目的。

getElementById(‘a‘)可以吗,它返回的是Element object的一个参考(object类型)或者是null(document.getElementById()),可以用来判断。

到此,我的问题就解决了,也就没有这篇文章了。



但我闲着没事又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的后代,并返回一个布尔值。

具体用法可以这么写:

1 // 先获取要判断的元素节点
2 const aNode = document.getElementById(‘a‘);
3
4 // 然后判断该元素节点是不是当前文档页面body节点的后代
5 if (aNode.ownerDocument.body.contains(aNode)) {
6  // do something
7 }

其实,用这个方法可以写一个通用的函数来判断某个元素节点是否在某个页面上,大家可以参考下Mozilla Developer Network官网javascript手册上的代码:

1 function isInPage(node) {
2   return (node === document.body) ? false : document.body.contains(node);
3 }

上面代码中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?这个问答的发起者自己写了个方法,我把代码贴到下面:

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4     <script>
 5     var getRandomID = function (size) {
 6             var str = "",
 7                 i = 0,
 8                 chars = "0123456789abcdefghijklmnopqurstuvwxyzABCDEFGHIJKLMNOPQURSTUVWXYZ";
 9             while (i < size) {
10                 str += chars.substr(Math.floor(Math.random() * 62), 1);
11                 i++;
12             }
13             return str;
14         },
15         isNull = function (element) {
16             var randomID = getRandomID(12),
17                 savedID = (element.id)? element.id : null;
18             element.id = randomID;
19             var foundElm = document.getElementById(randomID);
20             element.removeAttribute(‘id‘);
21             if (savedID !== null) {
22                 element.id = savedID;
23             }
24             return (foundElm) ? false : true;
25         };
26     window.onload = function () {
27         var image = document.getElementById("demo");
28         console.log(‘undefined‘, (typeof image === ‘undefined‘) ? true : false); // false
29         console.log(‘null‘, (image === null) ? true : false); // false
30         console.log(‘find-by-id‘, isNull(image)); // false
31         image.parentNode.removeChild(image);
32         console.log(‘undefined‘, (typeof image === ‘undefined‘) ? true : false); // false ~ should be true?
33         console.log(‘null‘, (image === null) ? true : false); // false ~ should be true?
34         console.log(‘find-by-id‘, isNull(image)); // true ~ correct but there must be a better way than this?
35     };
36     </script>
37 </head>
38 <body>
39     <div id="demo"></div>
40 </body>
41 </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

PS:感觉写博客比写代码累多了,自己写点儿东西,以防自己忘记。

时间: 2024-08-01 10:46:27

javascript判断元素存在和判断元素存在于实时的dom中的方法的相关文章

JavaScript判断数组是否包含指定元素的方法

本文实例讲述了JavaScript判断数组是否包含指定元素的方法.分享给大家供大家参考.具体如下: 这段代码通过prototype定义了数组方法,这样就可以在任意数组调用contains方法 /** * Array.prototype.[method name] allows you to define/overwrite an objects method * needle is the item you are searching for * this is a special variab

javascript判断一个元素是另外一个元素的子元素

javascript判断一个元素是另外一个元素的子元素用途有很多,最常用的就是当点击页面的空白处去执行某些操作,比如弹出层等. function isParent (obj,parentObj){ while (obj != undefined && obj != null && obj.tagName.toUpperCase() != ‘BODY’){ if (obj == parentObj){ return true; } obj = obj.parentNode;

判断数组是否存在重复元素

假设数组有n个元素,元素取值范围为1~n,如何判断数组是否存在重复元素 将每个元素放到他所应该在的地方.如果在放得时候发现他的坑已经被占了,那么出现重复元素 bool judgRepeatedElement(vector<int> v){ int j = -1; for (int i = 0; i < v.size(); i++){ j = v[i]; if (i == j) //放对位置的 continue; if (v[i] == v[j]) //如果这个坑已经被占 return t

mybatis判断集合为空或者元素个数为零

mybatis判断集合为空或者元素个数为零: <if test="mlhs != null and mlhs.size() != 0"> and t.mlh_name not in <foreach collection="mlhs" item="item1" open="(" close=")" index="i" separator=",">

【Python】变量数值交换、判断数组是否含有某个元素

本来,这两个问题都属于的编程入门简单得不能再简单的问题,根本就不值得写篇记录来记录的. 一.变量数值交换 先说变量数值交换,从C语言开始,我们就知道要先设置一个临时变量,再把某元素的值覆盖此临时变量,避免临时覆盖等,如果不设置临时变量,还有位运算的交换形式 然而Python中根本就不用这么复杂,如果要交换变量e1,e2彼此的值,就下面一行代码就足矣: e1,e2=e2,e1; 比如,如下的程序: e1=2; e2=3; print "e1:"+str(e1)+",e2:&qu

all(iterable) any(iterable) 对可迭代对象的每个元素(分子)进行判断。

迭代元素:元组.列表结果为真:数值:非0,字符:非空,bool: True. any() 只要可迭代元素的任何一个元素为真,结果为真.迭代元素为空,结果为假.存在元素,每个元素bool结果相或.不存在元素,取bool()值. all() 所有元素为真,结果为真.迭代元素为空,结果为真.存在元素,每个元素bool结果相与.不存在元素,对bool()值取反. 原文地址:http://blog.51cto.com/sonlich/2156901

javascript阻止子元素冒泡触发父元素的mouseover、mouseout

本文并没有像标题说的那样,真正阻止事件元素的子元素冒泡... 只是在子元素冒泡到事件元素处时进行了一个判断,判断是否要触发事件,哦...不对 应该是是否要运行事件函数中的相关操作... 首先你可以猛戳这里: 问题的出现 注:jquery中的mouseover/out事件也有此问题 解决方法一: 在ie下有mouseenter 与 mouseleave事件来替代mouseover 和 mouseout. 网上很多说法,这两个事件只有ie支持,其他浏览器不支持. 但是我在最新版本的火狐与谷歌都支持了

javascript根据索引删除数组的元素

javascript根据索引删除数组的元素:根据索引值删除数组元素,就是删除指定索引的数组元素,下面就通过代码实例简单介绍一下如何实现此功能.代码如下: var theArray=["蚂蚁部落",2,"青岛市南区","antzone"]; theArray.splice(2,1); console.log(theArray); 以上代码可以删除索引值为2的元素,也就是数组中的第三个元素.splice()函数可以参阅javascript的Array

初探JavaScript(一)——也谈元素节点、属性节点、文本节点

Javascript大行其道的时候,怎么能少了我来凑凑热闹^_^ 基本上自己对于js的知识储备很少,先前有用过JQuery实现一些简单功能,要论起JS的前世今生,来龙去脉,我就一小白.抱起一本<Javascript Dom编程艺术>,开始慢慢走近JS,与它套近乎,今天是第三天了,从目前来看,比较好相处.就此动笔,是一个回忆复习的过程,权当是自己的一份读书笔记. JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型,已经被广泛用于Web应用开发,常用来为网