博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

jQuery对象 DOM对象

Posted on 2013-01-06 10:15  bw_0927  阅读(245)  评论(0)    收藏  举报

http://www.jb51.net/article/17911.htm

jquery对象的相应方法DOM对象不能使用,而DOM对象的相应方法jquery也不能使用。所以在具体项目中要注意Jquery对象与DOM对象的转换问题刚开始学习jQuery,可能一时会分不清楚哪些是jQuery对象,哪些是DOM对象。至于DOM对象不多解释,我们接触的太多了,下面重点介绍一下jQuery,以及两者相互间的转换

什么是jQuery对象? 

---就是通过jQuery包装DOM对象后产生的对象。jQuery对象是jQuery独有的,其可以使用jQuery里的方法。 

比如: 

$("#test").html() 意思是指:获取ID为test的元素内的html代码。其中html()是jQuery里的方法 

这段代码等同于用DOM实现代码: 

document.getElementById("id").innerHTML; 


虽然jQuery对象是包装DOM对象后产生的,但是jQuery无法使用DOM对象的任何方法,同理DOM对象也不能使用jQuery里的方法.乱使用会报错。比如:$("#test").innerHTML、document.getElementById("id").html()之类的写法都是错误的。 

还有一个要注意的是:用#id作为选择符取得的是jQuery对象与document.getElementById("id")得到的DOM对象,这两者并不等价。请参看如下说的两者间的转换。 

既然jQuery有区别但也有联系,那么jQuery对象与DOM对象也可以相互转换。

在两者转换前首先我们给一个约定:如果一个获取的是 jQuery对象,那么我们在变量前面加上$,如:var $variab = jQuery对象;如果获取的是DOM对象,则与习惯普通一样:var variab = DOM对象;这么约定只是便于讲解与区别,实际使用中并不规定。 

jQuery对象转成DOM对象: 

两种转换方式将一个jQuery对象转换成DOM对象:[index]和.get(index); 

(1)jQuery对象是一个数据对象,可以通过[index]的方法,来得到相应的DOM对象。 

如: 

var $v =$("#v") ; //jQuery对象 
var v=$v[0]; //DOM对象 
alert(v.checked) //检测这个checkbox是否被选中 


(2)jQuery本身提供,通过.get(index)方法,得到相应的DOM对象 

var $v=$("#v"); //jQuery对象 
var v=$v.get(0); //DOM对象 
alert(v.checked) //检测这个checkbox是否被选中 


DOM对象转成jQuery对象: 

对于已经是一个DOM对象,只需要用$()把DOM对象包装起来,就可以获得一个jQuery对象了。$(DOM对象) 

如:var v=document.getElementById("v"); //DOM对象 

var $v=$(v); //jQuery对象 

转换后,就可以任意使用jQuery的方法了。 

通过以上方法,可以任意的相互转换jQuery对象和DOM对象。需要再强调注意的是:DOM对象才能使用DOM中的方法,jQuery对象是不可以用DOM中的方法。


转换案例: 
获取JQUERY对象的方法 

var jqueryObject = $("#test"); //jqeuryObject为一个Jquery对象,它可以使用jquery的所有方法但是不能使用 
var jqueryObject = $("#test"); //jqeuryObject为一个Jquery对象,它可以使用jquery的所有方法但是不能使用 
DOM对象的方法 

var DOMObject = document.getElementById("test");//DOMObject为一个DOM对象,它可以使用DOM的所有方法,但是不能使用jquery的方法 
var DOMObject = document.getElementById("test");//DOMObject为一个DOM对象,它可以使用DOM的所有方法,但是不能使用jquery的方法 
jquery对象->DOM对象 

var jqueryObject = $("#test");//获取jquery对象 
var DOMObject = jqueryObject[0];//jquery对象转换为DOM对象 
var jqueryObject = $("#test");//获取jquery对象 
var DOMObject = jqueryObject[0];//jquery对象转换为DOM对象 
DOM对象->jquery对象 
var DOMObject = document.getElementById("test");//获取DOM对象 
var jqueryObject = $(DOMObject);//DOM对象转换为jquery对象 

使用jquery时,有时需要使用原始DOM对象的方法,例如调用Activex控件的某些方法时,此时就需要将jquery对象转换为DOM对象,转换方法如下:

方法1: $("xxx")[index] 
方法2:$("xxx").get(index) 
方法3:$("xxx").eq(index)[0]

 

http://www.ccvita.com/192.html

 

最近在闲暇时间用jQuery搞了一个多文件上传的东东,顺便写点笔记。

一直以来对于通过jQuery方式获取的对象使不能直接使用JavaScript的一些方法的,开始的时候不理解,现在此案知道,原来jQuery获得的对象并不和我们平时使用getElementById获得的对象是一样的对象。所以一些新手就很迷惑,为什么${"#Element"}不能直接innerHTML,这就是原因所在,解决方式请看下文。

jQuery对象与dom对象的转换
只有jquery对象才能使用jquery定义的方法。注意dom对象和jquery对象是有区别的,调用方法时要注意操作的是dom对象还是jquery对象。
普通的dom对象一般可以通过$()转换成jquery对象。

如:

$(document.getElementById("msg"))

则为jquery对象,可以使用jquery的方法。
由于jquery对象本身是一个集合。所以如果jquery对象要转换为dom对象则必须取出其中的某一项,一般可通过索引取出。
如:

$("#msg")[0],$("div").eq(1)[0],$("div").get()[1],$("td")[5]


这些都是dom对象,可以使用dom中的方法,但不能再使用Jquery的方法。
以下几种写法都是正确的:

$("#msg").html();
$("#msg")[0].innerHTML;
$("#msg").eq(0)[0].innerHTML;
$("#msg").get(0).innerHTML;

 

=============

http://kb.cnblogs.com/page/48269/

jquery对象的初始化是写在匿名函数里的
就像这样:

(function(){alert("jquery框架分析")})();

第一个括号是声明了一个函数,第二个括号是执行这个函数 
也就是说,jquery框架在页面载入的时候已经做了一些事情(这个个匿名函数已经被执行了)
做的这些事情使我们可以通过$("#yourId")或$(".yourClass")等方式获取页面元素
并把获取到的元素包装成jquery对象

匿名函数是怎么实现这些功能的呢?
首先框架定义了两个核心对象

jQuery = window.jQuery = window.$ = function( selector, context ) {}

一个是jQuery  
一个是$    
这两个对象都指向一个函数
这个函数是我们使用$()或jQuery()方法时的入口
这个方法返回一个jQuery.fn.init( selector, context );的实例
其实这个实例是一个jquery对象

jquery对象是一个什么样的对象呢?
jquery对象其实是一个javascript的数组
这个数组对象包含125个方法和4个属性
4个属性分别是
jquery     当前的jquery框架版本号
length     指示该数组对象的元素个数
context    一般情况下都是指向HtmlDocument对象   
selector   传递进来的选择器内容  如:#yourId或.yourClass等

如果你通过$("#yourId")方法获取jquery对象,
并且你的页面中只有一个id为yourId的元素
那么$("#yourId")[0]就是HtmlElement元素
与document.getElementById("yourId")获取的元素是一样的

jquery对象是怎么构造出来的呢?
这个对象就是刚才我们提到的

jQuery = window.jQuery = window.$ = function( selector, context ) {}

框架不只为此对象定义了一个方法,还定义了它的原型(prototype)

jQuery.fn = jQuery.prototype = {//此处为json对象}

原型的定义是通过json对象定义的

{
init: function( selector, context ) {//方法体},
jquery: "1.3.2",//属性
size: function() {//方法体},
//......
}

前面提到的125个方法4个属性有一部分在这个json对象中完成定义的

这个json对象中第一个方法就是init方法
也就是入口方法中的jQuery.fn.init( selector, context );
此方法与一个正则表达式对象配合来构造jquery对象
这个正则表达式为:

quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/

 

下面我们说一下init方法的实现逻辑
此方法有两个参数
一个是selector(选择器)
一个是context(上下文)
selector就是我们用$("#yourId")或jQuery(".yourClass")传递进来的变量
这个参数不一定是字符串,也可能是其他形式的变量
等会儿我们就会介绍到
context参数我们在使用jquery的时候很少用到,暂且不表
注意这两个参数都在返回的jquery对象中体现出来了(以两个同名的属性展示)

下面看一下这个方法体内部的实现逻辑
//如果没有选择器或者选择器为空的话,就把document对象赋值给他

selector = selector || document; 

//如果selector参数是dom元素,直接返回jquery对象
//也就是说你可以$(document.getElementById("allen"))把你的元素封装成jquery对象

if ( selector.nodeType ) {
this[0] = selector;
this.length = 1;
this.context = selector;
return this;
} 

//typeof 取对象的类型,用三个等号效率较高, 不需要类型转换,两个等号默认有类型转换

if ( typeof selector === "string" ) { 

//这里用到了我们前面提到的正则表达式quickExpr
//match其实是一个数组
//第0个元素是与正则表达式相匹配的文本
//第1个元素是与正则表达式的第1个子表达式相匹配的文本(如果有的话)
//第2个元素是第2个子表达式相匹配的文本(如果有的话)
//第3个元素是第3个子表达式相匹配的文本(如果有的话)这里就是元素的ID,不包含#

var match = quickExpr.exec( selector ); 

//正则表达式匹配到了内容   并且 match[1]不为空 或者 context为空
//match[1]不为空的时候selector是HTML字符串,也就是你可以用$("

xland

")把对象包装成jquery对象
//context为空的时候selector是页面元素ID

 

if ( match && (match[1] || !context) ) { 

//选择器为html字符串  此情况暂且不表

if ( match[1] ){
selector = jQuery.clean( [ match[1] ], context );} 

//选择器为ID

else {

//得到元素

var elem = document.getElementById( match[3] ); 

//如果得到了这个元素但是元素的ID属性不是match[3],跳入分支。分支里面的东西做了什么工作,暂且不表

if ( elem && elem.id != match[3] ){
return jQuery().find( selector );} 

//把得到的页面元素封装成jquery对象
//如果elem为空,就传入一个空数组,框架怎么处理此空数组,暂且不表
//如果不为空就跳入我们前面说的if ( selector.nodeType )分支,构造出jquery对象来

var ret = jQuery( elem || [] ); 

//设置jquery对象的context属性

ret.context = document; 

//设置jquery对象的selector属性

ret.selector = selector; 

//返回这个对象给调用者

return ret;
} 

至此 
var obj = $(“#yourId”);
构造jquery对象的初步工作就做完了