1

最近开始研究jquery,对jquery库如何实现$感到困惑,浏览jquery源码还是看不懂。

为什么$( "#xid" )等同于getElementById("xid")

你能根据jquery的源代码为我解释一下$吗?

谢谢。

4

6 回答 6

4

快速回答

$只是一个函数名。简单来说,它只是模仿了 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 。类似地,.用于表示类名,其他用于标记。希望很清楚。

于 2012-10-30T07:26:26.873 回答
1

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,这就是我迷路的地方。

于 2012-10-30T08:17:22.853 回答
1

这是一件棘手的事情。如果参数 to$()是一个不以 '<' 开头且不包含 '>' 的字符串,它将与此正则表达式匹配

/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/

#myid如果像结果数组这样的 id将是

var match = ['#myid', undefined, 'myid']

所以match[1]将是未定义的。在这种情况下,jQuery 将立即评估getElementById(match[2])

来源:jQuery-1.7.1 代码

于 2012-10-30T08:19:30.863 回答
0
document.getElementById('id'); //returns a HTML DOM Object
$('#id');  //returns a jQuery Object

对于 id 选择器,jQuery 使用 JavaScript 函数document.getElementById(),非常高效。当另一个选择器附加到 id 选择器时,例如 h2#pageTitle,jQuery 在将元素识别为匹配之前执行额外的检查。

来源

于 2012-10-30T07:27:41.520 回答
0

$ 代表 jQuery 函数,实际上是 jQuery 的简写别名。(与大多数语言不同,$ 符号不是保留的,可以用作变量名。)它通常用作选择器(即返回在DOM 中找到的一组元素的函数)。

于 2012-10-30T07:27:57.820 回答
0

用于定义/访问 jQuery 的 $ 符号。

这意味着,

$ 作为一个变量,它是 jQuery 对象的别名。

jQuery 使用 $ 符号作为 jQuery 的快捷方式。

其他一些 JavaScript 库也使用美元符号来表示它们的功能。

jQuery noConflict() 方法指定了一个自定义名称(如 jq),而不是使用美元符号。

以下链接将为您提供帮助

http://api.jquery.com/jQuery/

于 2012-10-30T08:26:13.200 回答