最近开始研究jquery,对jquery库如何实现$感到困惑,浏览jquery源码还是看不懂。
为什么$( "#xid" )等同于getElementById("xid")?
你能根据jquery的源代码为我解释一下$吗?
谢谢。
最近开始研究jquery,对jquery库如何实现$感到困惑,浏览jquery源码还是看不懂。
为什么$( "#xid" )等同于getElementById("xid")?
你能根据jquery的源代码为我解释一下$吗?
谢谢。
$
只是一个函数名。简单来说,它只是模仿了 DOM 选择器。
function $(selector)
{
if (selector[0] == "#")
return document.getElementById(substr(selector, 1));
else if (selector[0] == ".")
return document.getElementsByClassName...
else
return document.getElementsByTagName...
}
在选择器类似于#hello
的地方,selector[0]
描述了第一个字符,#
在这种情况下是 a。#
用于表示元素的 ID 。类似地,.
用于表示类名,其他用于标记。希望很清楚。
jQuery 大致这样做:
if (the selector is a dom object){
wrap the dom object;
}
else if (the selector is a string){
if (it starts with `<` and ends with `>`){
assume this is HTML;
}else{
run a complex regex to classify the selector;
}
if (the selector is HTML){
create a new DOM element and return;
} else if (the selector is an ID selector and there is no context) {
use document.getElementByID;
} else {
if there is no context, use the jQuery root as the context;
jQuerify the context if neccessary and use context.find;
}
}
if (the selector is a function){
assume document.ready;
}
基本上,它处理特殊情况并将其余的委托给 ,而后者$.fn.find
又委托给$.find
,这就是我迷路的地方。
这是一件棘手的事情。如果参数 to$()
是一个不以 '<' 开头且不包含 '>' 的字符串,它将与此正则表达式匹配
/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/
#myid
如果像结果数组这样的 id将是
var match = ['#myid', undefined, 'myid']
所以match[1]
将是未定义的。在这种情况下,jQuery 将立即评估getElementById(match[2])
来源:jQuery-1.7.1 代码
document.getElementById('id'); //returns a HTML DOM Object
$('#id'); //returns a jQuery Object
对于 id 选择器,jQuery 使用 JavaScript 函数document.getElementById()
,非常高效。当另一个选择器附加到 id 选择器时,例如 h2#pageTitle,jQuery 在将元素识别为匹配之前执行额外的检查。
$ 代表 jQuery 函数,实际上是 jQuery 的简写别名。(与大多数语言不同,$ 符号不是保留的,可以用作变量名。)它通常用作选择器(即返回在DOM 中找到的一组元素的函数)。
用于定义/访问 jQuery 的 $ 符号。
这意味着,
$ 作为一个变量,它是 jQuery 对象的别名。
jQuery 使用 $ 符号作为 jQuery 的快捷方式。
其他一些 JavaScript 库也使用美元符号来表示它们的功能。
jQuery noConflict() 方法指定了一个自定义名称(如 jq),而不是使用美元符号。
以下链接将为您提供帮助