jQuery的Read()方法代替原生JS详解


Posted in Javascript onNovember 08, 2016

在jQuery 3.0的版本前, ready经典用法是用一个匿名函数,像这样:

$(document).ready(function() {
 // Handler for .ready() called.
});

jQuery 3.0 ready() 变化

在jQuery 3.0发布之前,有以下几种方法称之为ready方法:

    在document元素上操作: $(document).ready(handler);

    在空元素上操作: $().ready(handler);

    或者直接(即不在一个具体的元素上)操作: $(handler);

上述所有命名的变种在功能上是等价的。无论是哪个元素,在DOM加载完毕之后其指定的处理程序都将会被调用。换句话说,这里的DOM加载完毕并不表示在文档中的某个具体的元素,比如img元素,加载完毕。相反,这里表示的是整个DOM树加载完毕。

在jQuery 3.0中,除了$(handler) 其他的ready方法都被弃用。

官方声明为此:

这是因为选择器并没有和ready()建立联系,不仅低效而且会导致浏览器引擎对该方法的行为进行不正确的假设。

ready 事件和 load 事件的区别

当DOM加载完毕且元素能够被安全访问时就会触发ready事件。另一方面,load事件却在DOM和所有资源加载后触发。

可以像下面这样使用load事件:

$(window).on("load", function(){
 // Handler when all assets (including images) are loaded
});

这样的话,不仅仅要等到DOM结构能完全访问,而且还需要等到所有的图片资源完全加载完毕(加载时间取决于图片文件大小)才能执行函数。

正常的DOM操作你可能不需要load事件,但是如果你想要在所有的资源被加载完毕之前展示一个旋转的加载器样式,比如,又或者你想要用JS计算一下图片的大小,这可能是一个好的选择。

你可能不需要jQuery.ready()

ready 方法可以确保代码只在所有DOM元素能被安全操纵时才执行。 但这意味着什么呢?这意味着当你要执行的js代码嵌在HTML中某个片段中时,浏览器也要加载完以下元素才能执行。

就像下面这个例子一样:

<!doctype html>
<html>
 <head>
 <meta charset="utf-8">
 <title>.ready() tutorial</title>
 <script src="https://cdn.jsdelivr.net/jquery/latest/jquery.min.js"></script>
 <script>
  $(function(){ // .ready() callback, is only executed when the DOM is fully loaded
  var length = $("p").length;
  // The following will log 1 to the console, as the paragraph exists.
  // This is the evidence that this method is only called when the
  // DOM is fully loaded
  console.log(length);
  });
 </script>
 </head>
 <body>
 <p>I'm the content of this website</p>
 </body>
</html>

如果你要执行的javascript代码放在body末尾,你就可能不需要使用ready()方法,因为浏览器解析到javascript时你可能试图操纵和访问的DOM元素已经被加载完了:

<!doctype html>
<html>
 <head>
 <meta charset="utf-8">
 <title>.ready() tutorial</title>
 </head>
 <body>
 <p>I'm the content of this website</p>
 <script src="https://cdn.jsdelivr.net/jquery/latest/jquery.min.js"></script>
 <script>
  var length = $("p").length;
  // The following will log 1 to the console, as the paragraph exists.
  console.log(length);
 </script>
 </body>
</html>

原生JavaScript ready()替代

对于现代浏览器以及IE9+,你可以通过监听 DOMContentLoaded 事件实现ready()相同的功能:

document.addEventListener("DOMContentLoaded", function(){
 // Handler when the DOM is fully loaded
});

但是,请注意,如果事件已经发射,回调将不会被执行。为了确保回调总是运行,jQuery检查文档reference)的“readyState”属性,如果属性值变为 complete,则立即执行回调函数:

var callback = function(){
 // Handler when the DOM is fully loaded
};

if (
 document.readyState === "complete" ||
 (document.readyState !== "loading" && !document.documentElement.doScroll)
) {
 callback();
} else {
 document.addEventListener("DOMContentLoaded", callback);
}

包括domReady库,已经实现了这个解决方案。

老版本的IE浏览器

对于IE8及以下的浏览器,你能使用onreadystatechange 事件去监听文档的readyState 属性:

document.attachEvent("onreadystatechange", function(){
 // check if the DOM is fully loaded
 if(document.readyState === "complete"){
 // remove the listener, to make sure it isn't fired in future
 document.detachEvent("onreadystatechange", arguments.callee);
 // The actual handler...
 }
});

或者你可以使用Load事件,如jQuery,这样可以在任何浏览器上运行。这也会导致一个时间延迟,因为它会等待所有的资产被加载。

注意,在这个解决方案中你也要检查readyState,如上文所述,这样能确保回调总是能够被执行。

总结

以上就是这篇文章的全部内容了,如果你正在寻找一种原生js替代ready方法,你可以结合DOMContentLoaded事件一起处理。如果你的系统需要兼容IE话,你要确保DOM加载完成。希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
用JavaScript玩转游戏物理(一)运动学模拟与粒子系统
Jun 19 Javascript
js 静态动态成员 and 信息的封装和隐藏
May 29 Javascript
详解强大的jQuery选择器之基本选择器、层次选择器
Feb 07 Javascript
js实现禁止中文输入的方法
Jan 14 Javascript
jQuery中wrapInner()方法用法实例
Jan 16 Javascript
javascript实现简单的贪吃蛇游戏
Mar 31 Javascript
jQuery实现可编辑的表格实例讲解(2)
Sep 17 Javascript
如何用JavaScript实现动态修改CSS样式表
May 20 Javascript
vue.js动态数据绑定学习笔记
May 19 Javascript
IE11下CKEditor在Bootstrap Modal中下拉问题的解决
Sep 25 Javascript
vue项目配置同一局域网可使用ip访问的操作
Oct 23 Javascript
Vue实现图书管理小案例
Dec 03 Vue.js
bootstrap fileinput完整实例分享
Nov 08 #Javascript
AngularJS动态加载模块和依赖的方法分析
Nov 08 #Javascript
JS文件上传神器bootstrap fileinput详解
Jan 28 #Javascript
Javascript数组循环遍历之forEach详解
Nov 07 #Javascript
关于webuploader插件使用过程遇到的小问题
Nov 07 #Javascript
jQuery webuploader分片上传大文件
Nov 07 #Javascript
快速掌握jQuery插件WebUploader文件上传
Nov 07 #Javascript
You might like
数据库的日期格式转换
2006/10/09 PHP
PHP字符串函数系列之nl2br(),在字符串中的每个新行 (\n) 之前插入 HTML 换行符br
2011/11/10 PHP
php加水印的代码(支持半透明透明打水印,支持png透明背景)
2013/01/17 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
2017/09/20 PHP
Thinkphp 框架基础之入口文件功能、定义与用法分析
2020/04/27 PHP
基于Jquery与WebMethod投票功能实现代码
2011/01/19 Javascript
EasyUI的treegrid组件动态加载数据问题的解决办法
2011/12/11 Javascript
jQuery 滑动方法slideDown向下滑动元素
2014/01/16 Javascript
jQuery里filter()函数与find()函数用法分析
2015/06/24 Javascript
javascript表单验证大全
2015/08/12 Javascript
JavaScript中关键字 in 的使用方法详解
2016/10/17 Javascript
js利用for in循环获取 一个对象的所有属性以及值的实例
2017/03/30 Javascript
JS排序之冒泡排序详解
2017/04/08 Javascript
全面解析vue router 基本使用(动态路由,嵌套路由)
2018/09/02 Javascript
ES6基础之字符串和函数的拓展详解
2019/08/22 Javascript
解决layer.msg 不居中 ifram中的问题
2019/09/05 Javascript
node事件循环和process模块实例分析
2020/02/14 Javascript
原生JS实现音乐播放器
2021/01/26 Javascript
javascript中闭包closure的深入讲解
2021/03/03 Javascript
[03:49]2016完美“圣”典风云人物:AMS专访
2016/12/06 DOTA
查看Python安装路径以及安装包路径小技巧
2015/04/28 Python
python使用__slots__让你的代码更加节省内存
2018/09/05 Python
Python调用.NET库的方法步骤
2019/12/27 Python
Python爬取阿拉丁统计信息过程图解
2020/05/12 Python
全球速卖通西班牙站:AliExpress西班牙
2017/10/30 全球购物
浅谈react路由传参的几种方式
2021/03/23 Javascript
机电工程专业应届生求职信
2013/10/03 职场文书
高中生家长会演讲稿
2014/01/14 职场文书
国贸专业毕业求职信
2014/06/11 职场文书
企业宣传口号
2014/06/12 职场文书
机动车登记业务委托书
2014/10/08 职场文书
退学证明范本3篇
2014/10/29 职场文书
预备党员个人总结
2015/02/14 职场文书
奖学金申请个人主要事迹材料
2015/11/04 职场文书
合理缓解职场压力,让你随时保持最佳状态!
2019/06/21 职场文书
MySQL 常见存储引擎的优劣
2021/06/02 MySQL