2016-06-17 10 views
0

私はJavascriptには新しく、電子メールのWebサイト上の電子メールのリストで「クリック」機能コールを相殺しているChrome拡張機能を書いています。私の問題は、私がオフセットしている関数が参照によって渡されていることで、最終的にはすべてが単一のクリックイベントを指し示すことになります。機能の "深い"コピーを作成する方法 - Javascript

マイコード:

//Offsets the email links 
for (var i = emails.length - 1; i >= amountToRemove; i--) { 
    var a = emails[i]; 
    var b = emails[i - amountToRemove]; 

    a.addEventListener('click', (x) => {b.click(); x.stopPropagation(); return false;})  
} 

そして問題の少し精緻化: すなわち。 amountToRemoveは2で、iは10です。 click()イベントの最初の2回の "シフト"はうまくいくが、3番目のシフトでは、配列内の9番目(最後)と7番目のオブジェクトのclick()関数は、意図したものではない同じ関数を指している。 私は無駄にインターネットが推奨する

JSON.parse(JSON.stringify(object)) 

だけでなく、他の方法を使用して、関数の「ディープコピー」を作ってみました。

私の質問は、同じオブジェクトを指し示さず、各クリックイベントが最終的に同じシングルクリックを指し示すように、.click()関数の "深い"コピーを作成する方法ですイベント?

答えて

0

あなたの問題は、機能の「深い」コピーが必要ではないようです。代わりに、私はあなたの問題は、9番目の電子メールをクリックすると、7番目の電子メールをクリックして、5番目の電子メールをクリックするということです。あなたが欲しいものを行うには少しハックの方法は、次のようになります。

//Offsets the email links 
var interceptingClick = false; 
for (var i = emails.length - 1; i >= amountToRemove; i--) { 
    var a = emails[i]; 
    var b = emails[i - amountToRemove]; 

    a.addEventListener('click', (x) => { 
     if (interceptingClick) 
      return; 
     interceptingClick = true; 
     b.click(); 
     interceptingClick = false; 
     x.stopPropagation(); 
     return false; 
    });  
} 

しかし、あなたが達成しようとしている行動は少し奇妙に思えます。たぶんあなたは、もっと簡単でより堅牢なことができる何かがある場合に、なぜそれをしたいのかを教えてくれるかもしれません。

関連する問題