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方法的。