DOM對象和jQuery對象的區別


var cvs = $("#cvs_"+this.index).getContext("2d"); //錯的

var cvs = $("#cvs_"+this.index)[0].getContext("2d");//對的

DOM對象和jQuery對象是兩種不同的對象,它們的實例也因此具有不同的屬性和方法。通常要操作頁面中的節點,我們都需要想辦法獲取對該節點的引用。比如如下代碼:

1
var  dom = document.getElementById( '節點id' );

這是通過節點的id來獲取一個頁面節點,也就是對節點的引用。這個時候,我們對變量dom的任何操作,實際上就是對頁面節點的操作,比如說修改樣式、移除節點、獲取屬性等等。如下:

1
2
3
dom.style.display =  'none' // 隱藏節點
dom.parentNode.removeChild(dom);  // 刪除節點
var  height = dom.offsetHeight;  // 獲取節點高度

像上面的style、parentNode、removeChild、offsetHeight等等,都是DOM對象的屬性或方法。

 

因為DOM對象不屬於javascript的一部分,它是各個瀏覽器對javascript的擴展,但各個瀏覽器又都在實現上有一些不一致,導致javascript代碼需要處理很多兼容性問題。為了解決這些兼容性問題,提高開發效率,jQuery庫就誕生了。

 

jQuery解決了兼容性問題,再加上它的實現極其巧妙,因此得到了很多人的吹捧。以前有一點javascript基礎的人,要寫出稍微復雜些的特效,幾乎都不可能,但因為jQuery的出現,類似顯示隱藏、各種動畫效果,都只需要簡單的幾行代碼即可。有些人甚至覺得,jQuery甚至都能替代javascript,而且在各個前端學習的站點、博客中,也是將jQuery和javascript並列作為一類。

 

但問題是,不了解基礎的javascript,在遇到問題、異常的時候,你就只能干瞪眼了。任何語言,框架和庫都無法取代最基礎的語法,而且框架和庫也都是由最簡單的語法豐富起來的。

 

jQuery實際上可以說是一個大的類——javascript實現的類。以一個簡單的模型來說,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
;( function (window, undefined){
         
     window.$ = window.jQuery = jQuery;
     
     // 定義jQuery類
     function  jQuery(selector, content){
         content = content || document;
         var  eles = content.querySelectorAll(selector);
         var  len = eles.length;
         
         // 給jQuery對象添加長度屬性
         this .length = len;
         
         // 方便獲取dom對象,獲取實例:jQuery('#id')[0];
         for ( var  i = 0; i < len; i++){
             this [i] = eles[i];
         }
     }
     
     // 擴展原型
     jQuery.prototype = {
         // 構造函數
         constructor : jQuery,
         
         // 根據索引獲取dom對象
         get :  function (index){
             return  this [index];
         }
         
     }
})(window);

這是一段jQuery的模擬代碼,你可以使用如下方式調用:

1
var  jqObj =  new  jQuery( '.class' );

因為jQuery的特殊處理,寫jQuery代碼的時候不需要new即可用,但這里沒有處理,所以需要加上new關鍵字。

 

上面返回的jqObj,就是我定義的jQuery的一個對象,它是jQuery對象,已經不是DOM對象了。我可以寫如下代碼:

1
var  dom = jqObj.get(1);  // 獲取jQuery對象中下標為1的DOM對象

然后變量dom就和之前的變量dom一樣,可以使用DOM對象的屬性和方法了。

 

但是,我們不能寫下面的代碼,否則它就會報異常:

1
jqObj.style.color =  'red' ;

因為jQuery對象的實例,根本就沒有style這個屬性。jQuery也是一樣的,jQuery對象和DOM對象是兩種不同的對象,它們的內部結構(比如上面的get方法是自定義的)也是不同的。當你把jQuery對象當做DOM對象使用時,你調用該對象的任何屬性和方法,都有可能觸發一個屬性或方法未定義的異常,因為這個屬性或方法確實不存在。

 

所以,如果你使用了jQuery庫,那你就得在操作節點的時候,注意區分這個節點對象到底是DOM對象,還是jQuery對象。基本上jQuery的方法如果返回節點對象,返回值大多是jQuery對象,但也有例外,比如get等。

 

回到你的題目,通過jQuery獲取的canvas對象,實際上是jQuery對象封裝后的對象。它沒有getContext方法,所以會報錯。但jQuery對象可以像訪問數組一樣,通過中括號來獲取對應的DOM對象,所以第二種返回了最原始的Canvas對象,它是具有getContext方法的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM