2012-02-14 1 views
7

私は完全に配置されたドロップダウンメニューを書いています。このメニューが開いたときに、私はカスタムイベントをトリガーしています:カスタムjQueryイベントをwindow.documentにバブルする方法は?

ps.DropDown.prototype._onOpenComplete = function() { 
    $(this).trigger('MENU_OPEN', [this]); 
} 

私がターゲットにps.DropDownのどのインスタンス知ったときにこれは素晴らしい作品:

var dd = new ps.DropDown(); 
$(dd).on('MENU_OPEN', fn); 

しかし、私は私のカスタムイベントのための希望しますイベントが伝播を停止していない場合は、window.documentにバブルアップします。例:

var dd = new ps.DropDown(); 
$(dd).on('MENU_OPEN', function(event, instance) { 
    // this would stop bubbling to $(window.document) 
    // event.stopPropagation(); 
}); 
$(window.document).on('MENU_OPEN', function(event, instance) { 
    // bubbled! 
}); 

jQueryでこれを達成する方法はありますか?

EDITは、イベントがトリガされます類推

ボタン要素をクリックすることにより例を追加します。このイベントは、(イベントリスナーによって伝播が停止されている場合を除いて)window.documentに到達するまで親要素チェーンをバブルアップし続けます。 event.stopPropagation()が呼び出されていない場合、window.document(または$ .event、またはその他のグローバルなウィンドウ)にバブルするようなカスタムイベントのこの動作の合成に興味があります。

+0

あなたのコードは 'MENU_OPEN'イベントを購読していれば誰でも' .trigger( 'MENU_OPEN')でトリガーされるべきです。 – ShankarSangoli

+1

はい、しかし、私はps.DropDownのインスタンスへの参照を必要としないソリューションを探しています。イベントをwindow.documentにバブリングして欲しい。 – thesmart

答えて

10

私はあなたが.event.trigger手動で$を呼び出すを探していると思う:

$.event.trigger('myCustomEvent', someDataObj, someDomElement, false); 

最後のパラメータが使用されています"onlyHandlers"フラグについては、この場合は要素ハンドラをトリガし、各parentNodeで再度トリガしたいので、この場合はfalseです。このようにして、ウィンドウとこのイベントが発生したノードの間のものに "myCustomEvent"をバインドできます。

-1

私は具体的な言及せずに、グローバルカスタムイベントが必要な場合、私は今、あなたは

$('body').on('MENU_OPEN',function(event, dropDown){ 
    // bubbled 
}); 

あなたのドロップダウンについては何も知らなくても、どこでも、そのイベントに耳を傾けることができますページ

$('body').trigger('MENU_OPEN', [this]); 

の身体上のイベントをトリガwindow.documentをイベントとして使用したことはありませんターゲット。

+1

回答ありがとうございますが、私は$(window.document)の使用を避けようとしていません。たとえば、ボタンをクリックすると、clickイベントはwindow.documentに到達するまで各親にバブルします。すべての親要素のリスナーがイベントを処理する可能性があります。私はカスタムイベントのためにこれを複製しようとしています。 – thesmart

-1

これは、DOM要素からカスタムイベントをトリガするために必要ありませんです。

$(window.document).bind('dropDownHasOpened', function() { 
    console.log($(this)); 
    // 'this' is window.document 
}); 

ps.DropDown.prototype._onOpenComplete = function() { 
    $.event.trigger('dropDownHasOpened'); 
} 
+1

私はそれが必要ではないことを理解します。私の例では、$(window.document)ではなくDropDownインスタンスでトリガーしています。私はボタンのクリックイベントが両親からwindow.documentにどのようにバブリングされるのかと同様に、そのインスタンスから$(window.document)までのイベントをバブリングすることに興味があります。 – thesmart

関連する問題