全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

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

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

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

if ($('#a')) {
 // some code ...
 $('#b').doSomething;
 // some code ...
 }

这段代码的想要做的就是,判断下页面是否有某个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的后代,并返回一个布尔值。

具体用法可以这么写:

// 先获取要判断的元素节点
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

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


# 判断dom元素是否存在  # jquery  # 判断dom元素  # JS实现利用闭包判断Dom元素和滚动条的方向示例  # 如何用js判断dom是否有存在某class的值  # JS判断指定dom元素是否在屏幕内的方法实例  # JS公共小方法之判断对象是否为domElement的实例  # JS/jQuery判断DOM节点是否存在的简单方法  # 如何判断出一个js对象是否一个dom对象  # JavaScript判断DOM何时加载完毕的技巧  # 基于javascript原生判断DOM是否加载完毕  # 是否存在  # 是个  # 会报  # 不存在  # 的是  # 首页  # 我在  # 感兴趣  # 试了  # 是一个  # 就会  # 调试工具  # 文档  # 如果你  # 就在  # 鼠标  # 也就  # 是这样  # 其他的  # 但我 


相关文章: 自助网站制作软件,个人如何自助建网站?  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  建站之星如何快速更换网站模板?  如何在阿里云域名上完成建站全流程?  建站上传速度慢?如何优化加速网站加载效率?  如何高效完成独享虚拟主机建站?  Swift中swift中的switch 语句  h5网站制作工具有哪些,h5页面制作工具有哪些?  学校建站服务器如何选型才能满足性能需求?  XML的“混合内容”是什么 怎么用DTD或XSD定义  MySQL查询结果复制到新表的方法(更新、插入)  高防服务器租用首荐平台,企业级优惠套餐快速部署  江苏网站制作公司有哪些,江苏书法考级官方网站?  如何用低价快速搭建高质量网站?  Android自定义控件实现温度旋转按钮效果  模具网站制作流程,如何找模具客户?  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  如何快速生成专业多端适配建站电话?  潮流网站制作头像软件下载,适合母子的网名有哪些?  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  如何通过虚拟主机快速搭建个人网站?  建站IDE高效指南:快速搭建+SEO优化+自适应模板全解析  建站之星在线客服如何快速接入解答?  导航网站建站方案与优化指南:一站式高效搭建技巧解析  如何配置FTP站点权限与安全设置?  网站插件制作软件免费下载,网页视频怎么下到本地插件?  简单实现Android验证码  淘宝制作网站有哪些,淘宝网官网主页?  h5在线制作网站电脑版下载,h5网页制作软件?  宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  如何通过西部建站助手安装IIS服务器?  黑客入侵网站服务器的常见手法有哪些?  网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南  已有域名建站全流程解析:网站搭建步骤与建站工具选择  C++用Dijkstra(迪杰斯特拉)算法求最短路径  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  枣阳网站制作,阳新火车站打的到仙岛湖多少钱?  网站制作难吗安全吗,做一个网站需要多久时间?  青浦网站制作公司有哪些,苹果官网发货地是哪里?  北京建设网站制作公司,北京古代建筑博物馆预约官网?  公司网站设计制作厂家,怎么创建自己的一个网站?  建站之星后台密码遗忘或太弱?如何重置与强化?  南宁网站建设制作定制,南宁网站建设可以定制吗?  北京网站制作的公司有哪些,北京白云观官方网站?  如何快速搭建高效WAP手机网站?  如何基于云服务器快速搭建网站及云盘系统?  专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。