回答編集履歴

2 ゴミコードを削除

defghi1977

defghi1977 score 4660

2018/04/20 10:04  投稿

直接的な回答ではありませんが, 例えばクリックする毎に次のクリックを阻むフラグ値を用意しておいて, その内容を元にクリック時の処理の継続・中断を判定させるようにしたら如何でしょうか?
```JavaScript
"use strict";
{
   let blockClick = false;
   document.onclick = e => {
       if(blockClick){return;}
       //何らかの処理
       console.log("clicked");
       blockClick = true;
       setTimeout(()=>blockClick = false, 1000);
   }
}
```
で, このような汎用の処理はライブラリ化しておきたいので, 次のようにしてみる.
(あまり検証していないので, 使い方によってはバグがあるかもしれない.)
```JavaScript
"use strict";
{
   function blockable(f){
       let blockClick = false;
       return function(e){
           e.block = ms => (blockClick = true, setTimeout(() => blockClick = false, ms));
           blockClick || f.bind(this)(e);console.log(this);
           blockClick || f.bind(this)(e);
       };
   }
   document.onclick = blockable((e) => {
       console.log("clicked");
       e.block(1000);//同一のイベント処理の発生を1000ms阻む
   });
}
```
1 ライブラリ化したコードを追加

defghi1977

defghi1977 score 4660

2018/04/20 10:03  投稿

直接的な回答ではありませんが, 例えばクリックする毎に次のクリックを阻むフラグ値を用意しておいて, その内容を元にクリック時の処理の継続・中断を判定させるようにしたら如何でしょうか?
```JavaScript
"use strict";
{
   let blockClick = false;
   document.onclick = e => {
       if(blockClick){return;}
       //何らかの処理
       console.log("clicked");
       blockClick = true;
       setTimeout(()=>blockClick = false, 1000);
   }
}
```  
で, このような汎用の処理はライブラリ化しておきたいので, 次のようにしてみる.  
(あまり検証していないので, 使い方によってはバグがあるかもしれない.)  
```JavaScript  
"use strict";  
{  
   function blockable(f){  
       let blockClick = false;  
       return function(e){  
           e.block = ms => (blockClick = true, setTimeout(() => blockClick = false, ms));  
           blockClick || f.bind(this)(e);console.log(this);  
       };  
   }  
   document.onclick = blockable((e) => {  
       console.log("clicked");  
       e.block(1000);//同一のイベント処理の発生を1000ms阻む  
   });  
}  
```

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る