今天(周六)下午我在公司加班时不知道要干什么,就打开公司的一个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是否加载完毕
# 是否存在
# 是个
# 会报
# 不存在
# 的是
# 首页
# 我在
# 感兴趣
# 试了
# 是一个
# 就会
# 调试工具
# 文档
# 如果你
# 就在
# 鼠标
# 也就
# 是这样
# 其他的
# 但我
相关文章:
如何在阿里云ECS服务器部署织梦CMS网站?
高端建站如何打造兼具美学与转化的品牌官网?
名字制作网站免费,所有小说网站的名字?
昆明网站制作哪家好,昆明公租房申请网上登录入口?
制作表格网站有哪些,线上表格怎么弄?
建站之星官网登录失败?如何快速解决?
建站为何优先选择香港服务器?
宝塔建站助手安装配置与建站模板使用全流程解析
如何选择可靠的免备案建站服务器?
建站主机与虚拟主机有何区别?如何选择最优方案?
公众号网站制作网页,微信公众号怎么制作?
建站主机无法访问?如何排查域名与服务器问题
如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法
打鱼网站制作软件,波克捕鱼官方号怎么注册?
如何用虚拟主机快速搭建网站?详细步骤解析
如何通过老薛主机一键快速建站?
如何选择网络建站服务器?高效建站必看指南
如何快速打造个性化非模板自助建站?
深入理解Android中的xmlns:tools属性
如何在Golang中处理模块冲突_解决依赖版本不兼容问题
唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?
深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?
婚礼视频制作网站,学习*后期制作的网站有哪些?
如何快速登录WAP自助建站平台?
Android使用GridView实现日历的简单功能
如何在阿里云域名上完成建站全流程?
如何在建站之星网店版论坛获取技术支持?
如何高效生成建站之星成品网站源码?
广州建站公司哪家好?十大优质服务商推荐
如何用已有域名快速搭建网站?
如何在IIS服务器上快速部署高效网站?
建站主机是否属于云主机类型?
如何续费美橙建站之星域名及服务?
如何通过多用户协作模板快速搭建高效企业网站?
如何选择建站程序?包含哪些必备功能与类型?
如何用PHP快速搭建高效网站?分步指南
如何零基础在云服务器搭建WordPress站点?
,怎么用自己头像做动态表情包?
如何通过FTP空间快速搭建安全高效网站?
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
宝塔建站教程:一键部署配置流程与SEO优化实战指南
建站主机选虚拟主机还是云服务器更好?
如何在云虚拟主机上快速搭建个人网站?
如何选择高效可靠的多用户建站源码资源?
网页设计与网站制作内容,怎样注册网站?
建站之星导航菜单设置与功能模块配置全攻略
网站制作的步骤包括,正确网址格式怎么写?
如何注册花生壳免费域名并搭建个人网站?
C++中引用和指针有什么区别?(代码说明)
,怎么在广州志愿者网站注册?
*请认真填写需求信息,我们会在24小时内与您取得联系。