2011-05-09 17 views
1

我正在研究一個jQuery教程,並且有些東西我不太明白爲什麼。以下是我從教程中刪除的部分。粗體的句子是我不理解的部分,希望有專家向我解釋。非常感激!帶上下文傳遞的jQuery選擇器

「使用Ajax加載內容時遇到的一個非常常見的問題是:向文檔添加事件處理程序時,也應該應用於加載的內容,必須在內容加載後應用這些處理程序。 ,您可以委託給一個函數實例:

function addClickHandlers() { 
    $("a.remote", this).click(function() { 
    $("#target").load(this.href, addClickHandlers); 
    }); 
} 

$(文件)。就緒(addClickHandlers); 現在當DOM準備好,然後每次當用戶點擊帶班的鏈接addClickHandlers被調用一次。遠程和內容已完成加載。

請注意$(「a .remote「,this)查詢,這是作爲上下文傳遞的:對於文檔就緒事件,它引用文檔,因此它會在整個文檔中搜索遠程類的錨點。 當使用addClickHandlers作爲load()的回調函數時,它指向一個不同的元素:在本例中,id爲target的元素。這防止了click事件一次又一次地應用到同一個鏈接,最終導致飛機墜毀「

回答

3
function addClickHandlers() { 
    // this is window 
    $("a.remote", this).click(function() { 
     // this is a <a class="remote"> 
     $("#target").load(this.href, addClickHandlers); 
    }); 
} 

通常,在一個函數的this上下文是window除非它被稱爲與new關鍵字或如果它被稱爲obj.method()(在這種情況下,它obj)。

因爲調用函數addClickHandlers()實際上調用了window.addClickHandlers(),這意味着this的值範圍爲window

作爲jQuery本身將範圍this作爲您使用內部回調函數的元素。

.click(function() { ... })this將引用被點擊的對象。

+0

Raynos - 感謝您的回答。因此,當addClickHandlers用作load()的回調函數時,** this **引用id =「target」的元素。這是否意味着click事件綁定的選擇器變爲$(「a.remote」,「#target」)? – tamakisquare 2011-05-10 18:28:58

+0

@ahmoo是的。它也將永遠遞歸;) – Raynos 2011-05-10 18:30:55

+0

這就是我原先想的,但後來我不知道片段試圖達到什麼,所以我想我一定錯過了一些概念。你能說出這段代碼是否有用嗎?或者這是一個沒有意義的例子? – tamakisquare 2011-05-10 18:40:37

1

爲什麼你就不能執行live()處理程序綁定,就像這樣:

$('#target .elements').live('click', function() { 
    ... 
}); 
+0

因爲「活着」是邪惡和懶惰。 – Raynos 2011-05-10 00:04:08