2011-08-26 70 views
1

我試圖用jquery來引發自定義事件,但由於某種原因,我似乎無法啓動和/或捕獲它們。爲什麼我不能自定義事件?

我使用jstree插件創建文件夾的文件系統:

$('.filetree.global, .filetree.workspace').bind('select_node.jstree', function (event, data) { 
    alert('test '); 
    $(document).trigger('filePick').trigger('folderPick'); 
}).jstree({ 
    /*stuff*/ 
}); 

再往下的代碼,我結合filePick和folderPick事件元素與特定的類,並告訴他們,提醒一個測試消息,只要他們趕上事件:

$('.folder-action').bind('folderPick', function(e, data) { 
    alert('test 2'); 
}); 

不幸的是,警報永遠不會被觸發,我不知道爲什麼。 jquery文檔對我來說似乎很清楚,我遵循另一個教程,這似乎也表明我的代碼應該可以工作,但它不是!哎呀!

「測試1」得到警報,但不是「測試2」。另外,我安裝了Eventbug(Firebug擴展),我可以看到我對filePick的綁定已註冊,這使我相信filePick和folderPick永遠不會被解僱。

回答

6

jQuery的事件冒泡,但不下來。這意味着當您在文檔上觸發事件時,它將不會觸發文檔中的元素。您可以觸發該元素上的事件,也可以全局觸發事件。

來觸發元素上,這樣做:

$('.folder-action').trigger('folderPick'); 

觸發事件在全球範圍,因此所有訂閱元素得到事件,這樣做:

$.event.trigger('folderPick'); 
+0

+1爲''.event.trigger()'我不知道這是可能的,性感 – meo

+0

@meo我不認爲它正式記錄在jQuery文檔中。如果有的話,我還沒有找到它(或者我會在我的答案中鏈接到它)如果你做一些谷歌搜索自定義全球jQuery事件,你會發現很多文章解釋它的用法,但是。 http://www.google.com/search?q=custom%20global%20jquery%20event –

+0

謝謝,這正是我一直在尋找的。我正在考慮使用$ .event.trigger,因爲我的圖標具有要刷新的狀態,具體取決於所選的文件夾。非常感謝你! :) – Gazillion

2

這是因爲你試圖觸發你需要做的文檔事件:

$('.folder-action').trigger('folderPick'); 

,而不是:

$(document).trigger('folderPick'); 

例如。綁定事件時,將它綁定到DOM元素上。當你想再次調用它時,你需要選擇相同的DOM元素......或者像Dan Herberts例子那樣全局觸發事件。

如果你不想這樣,只是讓一個功能

1

你是在觸發自定義事件document,但已將自定義事件的事件偵聽器綁定到.folder-action

DOM事件

  1. 下井DOM(捕獲階段),直到
  2. 他們達到目標(在目標)然後
  3. 冒泡(冒泡階段)的DOM 。

但jQuery的自定義事件

  1. 觸發在所述目標(在目標)然後
  2. 冒泡(冒泡階段)的DOM。

所以當引發自定義事件,它會在document然後泡了增加,因而從未被上調.folder-action,因此alert不點火。

您可能需要將自定義事件的事件偵聽器綁定在document上,或者在.folder-action上觸發它們。 An example of binding on document

相關問題