A. javaScript 關於this的賦值問題
this是JavaScript中功能最強大的關鍵字之一。不幸的是,如果你不知道它具體怎麼工作,你將很難正確使用它。
this是面向對象語言中的一個重要概念,在JAVA,C#等大型語言中,this固定指向運行時的當前對象。但是在javascript中,由於
javascript的動態性(解釋執行,當然也有簡單的預編譯過程),this的指向在運行時才確定。這個特性在給我們帶來迷惑的同時也帶來了編程上的
自由和靈活,結合apply(call)方法,可以使js變得異常強大。
2.變化的this
在JavaScript中,this通常指向的是我們正在執行的函數本身,或者是指向該函數所屬的對象(運行時)。當我們在頁面中定義了函數
doSomething()的時候,它的owner是頁面,或者是JavaScript中的window對象(或
global對象)。對於一個onclick屬性,它為它所屬的HTML元素所擁有,this應該指向該HTML元素。
2.1在幾種常見場景中this的變化
函數示例
function doSomething ()
{
alert(this.navigator);
//appCodeName
this.value = "I am from the Object constructor";
this.style.backgroundColor = "# 000000";
}
1.
(A)作為普通函數直接調用時,this指向window對象.
2. (B)作為控制項事件觸發時
1) inline event
registration 內聯事件注冊 .將事件直接寫在HTML代碼中(<element
onclick=」doSomething()」>), 此時this指向 window對象 。
2) Traditional event
registration 傳統事件注冊 (DHTML方式).
形如 element.onclick = doSomething; 此時this指向
element對象
3) <element onclick=」doSomething(this)」>作為參數傳遞可以指向element
3. (C)作為對象使用時this指向當前對象。形如:new doSomething();
4. (D)使用apply
或者call方法時,this指向所傳遞的對象。
形如:var obj={}; doSomething.apply(obj,new
Array(」nothing」); //thisàobj
下面我來闡述如何在事件處理中來使用this,之後我會附加一些this相關的例子。
Owner
接下來文章中我們將要討論的問題是:在函數doSomething()中this所指的是什麼?
Javascript代碼
function doSomething() {
this.style.color = '#cc0000';
}
function doSomething() {
this.style.color = '#cc0000';
}
在JavaScript中,this通常指向的是我們正在執行的函數本身(譯者註:用owner代表this所指向的內容),或者是,指向該函數所屬的對象。當我們在頁面中定義了函數doSomething()的時候,它的owner是頁面,或者是JavaScript中的window對象(或
global對象)。對於一個onclick屬性,它為它所屬的HTML元素所擁有,this應該指向該HTML元素。
這種「所有權」就是JavaScript中面向對象的一種方式。在Objects as associative arrays中可以查看一些更多的信息。
如果我們在沒有任何更多准備情況下執行doSomething(),this關鍵字會指向window,並且該函數試圖改變window的
style.color。因為window並沒有style對象,這個函數將非常不幸的運行失敗,並產生JavaScript錯誤。
Copying
因此如果我們想充分利用this,我們不得不注意使用this的函數應該被正確的HTML元素所擁有。換句話說,我們應該復制這個函數到我們的onclick屬性。Traditional
event registration會關心它。
Javascript代碼
element.onclick = doSomething;
element.onclick = doSomething;
這個函數被完整復制到onclick屬性(現在成為了函數)。因此如果這個event
handler被執行,this將指向HTML元素,並且該元素的顏色得以改變。
這種方法使得我們能夠復制這個函數到多個event handler。每次this都將指向正確的HTML元素:
這樣你就可以最大限度使用this。每當執行該函數,this所指向的HTML元素都正確響應事件,這些HTML元素擁有doSomething()的一個拷貝。
Referring
然而,如果你使用inline event registration(內聯事件注冊)
Javascript代碼
<element onclick="doSomething()">
<element
onclick="doSomething()">
你將不能拷貝該函數!反而這種差異是非常關鍵的。onclick屬性並不包含實際的函數,僅僅是一個函數調用。
Javascript代碼
doSomething();
doSomething();
因此,它將聲明「轉到doSomething()並且執行它」。當我們到達doSomething(),this關鍵字又重新指向了全局的window對象,函數返回錯誤信息。
The difference
如果你想使用this來指向HTML元素響應的事件,你必須確保this關鍵字被寫在onclick屬性里。只有在這種情況下它才指向event
handler所注冊的HTML元素。
Javascript代碼
element.onclick = doSomething;
alert(element.onclick)
element.onclick = doSomething;
alert(element.onclick)
你將得到
Javascript代碼
function doSomething()
{
this.style.color = '#cc0000';
}
function doSomething() {
this.style.color = '#cc0000';
}
正如你所見,this關鍵字被展現在onclick函數中,因此它指向HTML元素。
但是如果執行
Javascript代碼
<element onclick="doSomething()">
alert(element.onclick)
<element onclick="doSomething()">
alert(element.onclick)
你將得到
Javascript代碼
function onclick() {
doSomething()
}
function
onclick() {
doSomething()
}
這僅僅是到doSomething()函數的一個引用。this關鍵字並沒有出現在onclick函數中,因此它不指向HTML元素。
例子--拷貝
下面的例子中,this被寫入onclick函數里:
Javascript代碼
element.onclick = doSomething
element.addEventListener('click', doSomething, false)
element.onclick =
function() {this.style.color = '#cc0000';}
<element
onclick="this.sytle.color = '#cc0000';">
element.onclick = doSomething
element.addEventListener('click', doSomething, false)
element.onclick =
function() {this.style.color = '#cc0000';}
<element
onclick="this.sytle.color = '#cc0000';">
例子--引用
下述情況中,this指向window:
Javascript代碼
element.onclick = function() {doSomething()}
element.attachEvent('onclick', doSomething)
<element
onclick="doSomething()">
element.onclick = function() {doSomething()}
element.attachEvent('onclick', doSomething)
<element
onclick="doSomething()">
注意attachEvent()的出現。Microsoft event registration
model最主要的弊端是attachEvent()創建了一個指向函數的引用,而不是復制它。因此有時不可能知道哪個HTML正在處理該事件。
組合使用
當使用內聯事件注冊時,你可以將this發送到函數以至於可以正常使用:
Javascript代碼
<element
onclick="doSomething(this)">
function doSomething(obj) {
//this出現在event handler中並被發送到函數
//obj指向HTML元素,因此可以這樣:
obj.style.color
= '#cc0000';
}
B. 這兩個區別 在哪裡 還有js事件中 onclick=abc(this) 這個this是 dom元素嗎
this的確是觸發事件本身的dom。所以dom的name屬性為ac。
var person1={ 'name':'wang' };
var person2={ name:'wang' };
都是符合json的格式的 ;
唯一要說不同的內話,假容設person2沒有name屬性
var person2={ key:'wang' };
則列印出來不一樣了。
alert(person2['name']); //列印 null
alert(person2.name); // js報錯 缺少對象
希望對你有幫助。
C. javascript中onclick(this) 中的this指當前什麼東西
舉個例子吧來
<input type=button id='123' value='clickme' onclick=testFunction(this)>
那麼
testFunction(obj){
alert(「button id = 」obj.id);
alert(「button value = 」obj.value);
}
當你源點擊這個按鈕的時候會彈出button id = 123,
然後彈出 button value = clickme
這回知道this 是什麼了吧
D. 怎樣使js中的onclick事件只觸發一次,就是我點擊了一次,再次點擊的時候不讓其再觸發
解決的方法:
1、用jQuery的方式
jQuery專門為此功能提供了一個函數one。這樣寫就能讓click這個事件只執行一次。
$("#btn3").one('click',function(){
alert('jQuey的one函數,第1次點擊');
});
(4)jsthisonclick擴展閱讀:
jQuery的模塊可以分為3部分:入口模塊、底層支持模塊和功能模塊。
在構造jQuery對象模塊中,如果在調用構造函數jQuery()創建jQuery對象時傳入了選擇器表達式,則會調用選擇器Sizzle遍歷文檔,查找與之匹配的DOM元素,並創建一個包含了這些DOM元素引用的jQuery對象。
瀏覽器功能測試模塊提供了針對不同瀏覽器功能和bug的測試結果,其他模塊則基於這些測試結果來解決瀏覽器之間的兼容性問題。
在底層支持模塊中,回調函數列表模塊用於增強對回調函數的管理,支持添加、移除、觸發、鎖定、禁用回調函數等功能;
非同步隊列模塊用於解耦非同步任務和回調函數,它在回調函數列表的基礎上為回調函數增加了狀態,並提供了多個回調函數列表,支持傳播任意同步或非同步回調函數的成功或失敗狀態;
數據緩存模塊用於為DOM元素和Javascript對象附加任意類型的數據;隊列模塊用於管理一組函數,支持函數的入隊和出隊操作,並確保函數按順序執行,它基於數據緩存模塊實現。
E. js onclick 調用函數失敗,求助,,懷疑onclick 不能識別jquery 的this。
你的this沒有傳過來。
你現在傳進去的是id,可以把版$(this)改成權 $("#"+id);
或者 onclick="GetPerson(this)";
function getPerson(obj)
{
if($(obj).index....
}