背景
在学习 jQuery 的时候,误把 $(document).ready() 写成了 $("document").ready() 后,ready 内的代码仍然成功执行?
问题
想问下为什么会这样?
在学习 jQuery 的时候,误把 $(document).ready() 写成了 $("document").ready() 后,ready 内的代码仍然成功执行?
想问下为什么会这样?
document 是 element 类参数,不进入选择器解析过程,直接包装返回。类似的如 window。但是给它加上引号,就成了一个标签名,显然找不到。不过 $()始终返回一个 jQuery对象,所以可以执行 ready()。body加引号,是标签名,当然找得到。也可以传入 document.body,这样速度会快点,因为不走选择器解析过程。
6 回答1.2k 阅读✓ 已解决
1 回答692 阅读
1 回答718 阅读
按照这份源码给你回答一下:
https://github.com/jquery/jquery/blob/1.4.2/src/core.js
$("document")结果是什么
$("document")
应该通过jQuery.fn.init( selector, context );
这个函数来构造jQuery
对象,这个函数有很多的分支,
$("document")
落在114行代码的这个分支上。这里的
context
是undefined
,根据短路原则if
判断为真,所以执行return (context || rootjQuery).find( selector );
但是这里又有分支,不难看出最终执行的是
而
rootjQuery
是在722行赋值的rootjQuery = jQuery(document);
因此,
$("document")
最终是jQuery(document).find("document");
这个是结果是个
jQuery
对象:jQuery.ready()函数
从231到247行是ready函数的定义
可以看出
ready
函数接受一个回调函数fn
作为参数,当jQuery.isReady
条件成立时就执行回调函数,否则将回调函数放入队列中(wait list)。这里并不要求特殊的jQuery
对象才能执行ready
方法,主要判断逻辑还是jQuery.isReady
。jQuery.isReady
这个有空再来补充。
总结
仔细读源码,init函数的这么多分支中只提到了
$("body")
可以做下“特殊处理”外,并没有提到"document"的情况;我觉得
jQuery("segmentfault").ready(function(){console.log("happy");});
这段代码也能跑通并输出"happy";不能忽略的前提就是
jQuery
要有定义。