2012-08-15 13 views
35

私はDOMイベントのクローニングまたは再ディスパッチの単純で抽象的な方法を探しています。私はDOMノードのクローニングに興味はありません。DOMイベントを複製または再ディスパッチする方法は?

少し実験しましたが、DOM Events specificationを読んでもわかりやすい答えが見つかりませんでした。

理想的には、私のようにストレートフォワードとして何かを探しています:このコード例

handler = function(e){ 
    document.getElementById("decoy").dispatchEvent(e) 
} 
document.getElementById("source").addEventListener("click", handler) 

、もちろん、動作しません。イベントが現在ディスパッチされていることを明示するDOM例外があります。

document.createEvent()で手動で新しいイベントを作成し、初期化してディスパッチしないようにしたいと思います。

このユースケースには簡単な解決策がありますか?

+0

あなたがイベントを再ディスパッチする必要があるのはなぜ? – josh3736

+0

現在、子ノードイベントをディスパッチしていないCSSリージョンの回避策として、これが必要です。リージョンは子ノードのコンテンツのみをレンダリングし、parentNodeとしては動作しません。 –

答えて

63

私が知っている、問題は古く、OPは初期化/作成避けたかったです

:あなただけのマウスイベントよりも多くしたい場合、あなたはこのような何かを行うことができ

new_event = new MouseEvent(old_event.type, old_event) 

:アプローチは、しかし、イベントを複製することは比較的簡単な方法があります

new_event = new old_event.constructor(old_event.type, old_event) 

、元のコンテキストで:

handler = function(e) { 
    new_e = new e.constructor(e.type, e); 
    document.getElementById("decoy").dispatchEvent(new_e); 
} 
document.getElementById("source").addEventListener("click", handler); 

(jQueryのユーザーの場合:あなたはe.originalEvent.constructor代わりのe.constructorを使用する必要があります)

+1

で更新しました。これは最新版のFirefoxとChromeでのみ動作し、IEのどのバージョンでも動作しないことに注意してください。 –

+3

@Alexis私は次のようになります: '' 'Uncaught TypeError:不正なconstructor'''': ( – niieani

+0

@NIXinのブラウザでは? – Alexis

-2

トリガイベントはどうですか?あなたのケースでは

:あなたはHow to trigger event in JavaScript?


UPDATE

でそれを見つけることができます

$('#decoy').trigger('click') 

または純粋なJSで、私はjQueryの通じ方法を見つけた:

  1. ここに書かれているように - jQuery find events handlers registered with an objectあなたは必要なイベントを取得する必要があります。たとえば、$('#decoy').data('events').click[0].handler;

  2. このハンドラへのリンクを得ることができます。あなたは、ハンドラの独立したコピーを作成したい場合はしかし - ハンドラのコピーを作成するには、このコードを使用します。


function clone_obj(obj){ 
    if(obj == null || typeof(obj) != 'object') return obj; 
    var temp = new obj.constructor(); 
    for(var key in obj) temp[key] = clone_obj(obj[key]); 
    return temp; 
} 
+1

はい、新しいイベントをトリガーすることはできますが、元のイベントを反映するために手動で状態を設定する必要があります。私は、DOMがイベントの複製を処理する方法を探しています。それはクリック、タッチなどです。 –

+0

私は答えを – Rustam

関連する問題