解决jQuery $(#id)或者getElementById没有找到元素的几种方法?
当您的脚本运行时,您尝试查找的元素不在DOM中。
你的js脚本位置可以对页面行为产生深远的影响。浏览器从上到下解析HTML文档。这意味着顺序很重要。通常,由于某些元素尚未添加到DOM中,脚本无法在html中找到稍后出现的元素。
参考下面示例:脚本1无法找到class为test的<div>,所以执行失败,返回null,
脚本2成功找到class为test的<div>
:
<script>
console.log("script #1: %o", document.getElementById("test")); // null
</script>
<div id="test">test div</div>
<script>
console.log("script #2: %o", document.getElementById("test")); // <div id="test" ...
</script>
通常有以下几种方法解决jQuery $("#id")或者getElementById没有找到元素:
1.移动脚本
将你的js脚本移动到页面底部</body>标签之前。以这种方式组织,文档的其余部分在您的脚本执行之前被解析:
<body>
<button id="test">click me</button>
<script>
document.getElementById("test").addEventListener("click", function() {
console.log("clicked: %o", this);
});
</script>
</body><!-- closing body tag -->
2.使用jquery的ready()
使用ready()
延迟脚本执行直到DOM完全解析:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script>
$(document).ready(function() {
$("#test").click(function() {
console.log("clicked: %o", this);
});
});
</script>
<button id="test">click me</button>
3.事件委托
委托事件的优点在于,它们可以处理后来添加到文档中的后代元素的事件。
当一个元素引发事件(前提是它是一个冒泡事件,并且没有停止其传播),该元素的祖先中的每个父进程也接收该事件。这允许我们将一个处理程序附加到一个现有的元素,并且在它们从后代中冒出来的样本事件时,甚至在处理程序被附加后添加的事件。我们所要做的就是检查事件是否被所需的元素引发,如果是,请运行我们的代码。
jQuery on()
为我们执行这个逻辑。我们只提供一个事件名称,一个选择器为所需的后代和一个事件处理程序:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script>
$(document).on("click", "#test", function(e) {
console.log("clicked: %o", this);
});
</script>
<button id="test">click me</button>
注意:通常,此模式是为加载时不存在的元素保留的,或者避免附加大量处理程序。还有一点值得指出的是,当我们附加一个处理程序document
(为了说明的目的),你应该选择最近的可靠的祖先。
4.defer
属性
使用js的defer
属性。
[ defer
,一个布尔属性]被设置为向浏览器指示在解析文档之后该脚本将被执行。
<script src="https://gh-canon.github.io/misc-demos/log-test-click.js" defer></script>
<button id="test">click me</button>
以上script是来自外部脚本。
document.getElementById("test").addEventListener("click", function(e){
console.log("clicked: %o", this);
});
注意:该defer
属性当然看起来像一个魔法子弹,但重要的是要注意注意以下两点
1. defer
只能用于外部脚本,即具有src
属性的脚本。
2.注意浏览器支持,即IE <10中会出现错误
- Math对象面试题目
- Highcharts AJAX JSON JQuery 实现动态数据交互显示图表 柱形图
- 企业支付宝账号开发接口教程--JAVA-UTF-8(实际操作------SpringMVC+JSP)
- 用pandas 进行投资分析
- 【专业技术】android 应用程序如何获取root权限
- Nginx+Keepalived(双机热备)搭建高可用负载均衡环境(HA)
- SpringMVC+MongoDB+Maven整合(微信回调Oauth授权)
- ZeroClipboard实现多个浏览器兼容的复制文本到剪贴板的功能
- Shiro 权限框架使用总结
- Apriori算法介绍(Python实现)
- linux学习第六十二篇:添加自定义监控项目,配置邮件告警,测试告警,不发邮件的问题处理
- Entity Framework Core 2.0 入门
- Nodejs开发框架Express3.0开发手记–从零开始
- 使用 nvm 管理不同版本的 node 与 npm
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Jetpack中可能被你忽视的—行为组件简析
- pytest封神之路第零步 快速入门
- beego(一) beego 入门
- javascript预编译(执行期的上下文)
- Elasticsearch评分相关度算法解析
- Netty入门教程——认识Netty
- Linux下的包过滤软件:iptables剖析
- rxjs fromEvent的实现
- rxjs switchMap的实现原理
- rxjs里scan operator的执行研究
- rxjs pipe和map组合的一个实际例子的单步调试
- Win10+Python2.7.14+cocos2d-x-3.17.2+VS2017环境搭建
- VUE-001-在表格单元格(el-table-column)中添加超链接访问
- 关于vue的title标签中出现的htmlWebpackPlugin.options.title
- dotnet tool 工具安装提示 Could not find a part of the path 安装失败