2013-06-19 55 views
0

我想利用jQuery的自定義事件。在DOM負載上,我使用$.on()body綁定到自定義事件test。緊接着,我開始了這個事件,一切都按計劃進行。但是,任何其他時間我都會觸發該事件(在回調中,從控制檯等),沒有任何反應。我寫了一個jsfiddle來說明這種情況。有任何想法嗎?在jQuery中的自定義事件

$(function(){ 
    $('body').on('test', function(){ 
     alert('test triggered'); 
    }); 
    $('body').on('click', '.btn', triggerTest); 
    $('body').trigger('test');  
}); 

var triggerTest = function(){ 
    $('body').trigger('test'); 
} 

http://jsfiddle.net/vgEzD/

+1

點擊錨會拋出一個錯誤:'TypeError:handleObj.handler.apply不是一個函數'。問題是,在你試圖將事件處理程序綁定到錨點時,'triggerTest'尚未初始化。如果我更改小提琴設置,將代碼包含在文檔的「head」中,它可以正常工作:http://jsfiddle.net/vgEzD/2/。爲什麼?因爲現在你在加載DOM時執行整個代碼,也就是說,在給'triggerTest'分配一個值之前,你傳遞給'.ready'的回調*立即執行*。 –

回答

2

您的訂單是錯誤的。這工作:

var triggerTest = function(){ 
    $('body').trigger('test'); 
} 

$(function(){ 
    $('body').on('test', function(){ 
     alert('test triggered'); 
    }); 
    $('body').on('click', '.btn', triggerTest); 
    $('body').trigger('test');  
}); 

現場演示:http://jsfiddle.net/simevidas/vgEzD/3/

顯然jQuery的執行DOM準備處理立即,在這一點上,triggerTest功能尚未分配。所以,我想創建全局變量,在準備好的處理程序上面執行。

順便說一句,在你的jsFiddle中,「onLoad」執行被設置。這意味着JavaScript代碼在窗口「load」上執行,並且此時DOM ready已經發生,這就是jQuery立即執行代碼的原因。

+0

感謝您的幫助。答案解決了這種情況,但不是我確切的問題。我在這裏問了一個更具體的問題: http://stackoverflow.com/questions/17203116/jquery-trigger-custom-event – JJK