純粋なJavascriptで表示/非表示する色見本パネルのようなものを作っています。
テキストボックスにフォーカスするとその下に色見本パネルが表示され、色をクリックするとテキストボックスに選んだ色のカラーコード(例: #ff0000)が入力され、パネルが非表示になるというものです。
基本的な動作はできているのですが、パネル以外の場所をクリックした場合はパネルを非表示にするという処理を加えたとき、focus と click が同時に発生し、パネルが表示されてすぐに非表示になるという状態になってしまいました。
領域外をクリックした際の処理はこちらです。panel にクラス active がついている場合は表示状態です。
Javascript
1 var self = this; 2 document.addEventListener('click', function(event){ 3 if(self.panel.classList.contains('active')){ 4 if( ! self.panel.contains(event.target)){ 5 self.hidePanel(); // パネルを隠す 6 } 7 } 8 });
フォーカスイベントがこちらです。
Javascript
1 // element は input[type=text] のオブジェクトです 2 element.addEventListener('focus', function(event){ 3 self.showPanel(this); // パネルを表示 4 });
色見本(<li>)のクリック
javascript
1 li.addEventListener('click', function(){ 2 // focusedElement はフォーカスされた input[type="text"] です 3 if(self.focusedElement){ 4 self.focusedElement.value = this.getAttribute('data-color'); 5 self.hidePanel(); 6 } 7 });
focus すると色見本は表示されるのですがパネルの領域外をクリックしたときの処理も同時に発生してしまうためすぐに閉じられてしまいます。
このような場合どのようにして回避すればいいのでしょうか?
追記
パネルのHTMLは動的に生成されますが基本的に次のようになっています。
普段はdisplay: none; で .palette-panel.active のとき表示されます。
html
1<div class="palette-panel"> 2 <ul> 3 <li data-color="#ff0000"></li> 4 <li data-color="#00ff00"></li> 5 <li data-color="#0000ff"></li> 6 </ul> 7</div>
回答2件
あなたの回答
tips
プレビュー