質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

4215閲覧

focusとclickが同時に発生するのを制御したい

workr

総合スコア158

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2017/10/11 08:59

編集2017/10/11 09:21

純粋な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>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2017/10/11 09:09

HTMLの部分の記述もあると良いかと思います
workr

2017/10/11 09:21

HTMLを追記しました。よろしくお願いします。
guest

回答2

0

とりあえずjQueryで書いてみましたが、動作としてはこういうことでしょうか?

CSS

1.palette-panel {width:110px;height:40px;border:1px solid #000000;position:fixed;background-Color:#ffffff;} 2.palette-panel ul{display:inline;} 3.palette-panel li{display:block;width:20px;height:20px;border:1px solid #000000; float:left;margin-left:10px;;margin-top:10px;} 4[data-color="#ff0000"]{background-Color:#ff0000} 5[data-color="#00ff00"]{background-Color:#00ff00} 6[data-color="#0000ff"]{background-Color:#0000ff} 7

javascript

1$(function(){ 2 $('.palette-panel').hide(); 3 $('input').on({ 4 'focus':function(){$(this).next("div").slideDown();}, 5 'blur':function(){ $(this).next("div").slideUp();}, 6 }); 7 $('li[data-color]').on('click',function(e){ 8 $(this).closest("div").prev("input").val($(this).data("color")).end().slideUp(); 9 }); 10});

HTML

1<div> 2<input type="text"> 3<div class="palette-panel"> 4 <ul> 5 <li data-color="#ff0000"></li> 6 <li data-color="#00ff00"></li> 7 <li data-color="#0000ff"></li> 8 </ul> 9</div> 10</div> 11<div> 12<input type="text"> 13<div class="palette-panel"> 14 <ul> 15 <li data-color="#ff0000"></li> 16 <li data-color="#00ff00"></li> 17 <li data-color="#0000ff"></li> 18 </ul> 19</div> 20</div> 21<div> 22<input type="text"> 23<div class="palette-panel"> 24 <ul> 25 <li data-color="#ff0000"></li> 26 <li data-color="#00ff00"></li> 27 <li data-color="#0000ff"></li> 28 </ul> 29</div> 30</div>

投稿2017/10/11 10:13

yambejp

総合スコア114806

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

例えばfocusイベントの中でsetTimeoutして処理を遅延させる、などはどうでしょう?

var isFocused = false; // element は input[type=text] のオブジェクトです element.addEventListener('focus', function(event){ isFocused = true; window.setTimeout(function(){ if(!isFocused) return; self.showPanel(this); // パネルを表示 isFocused = false; }, 20); }); li.addEventListener('click', function(){ isFocused = false; // focusedElement はフォーカスされた input[type="text"] です if(self.focusedElement){ self.focusedElement.value = this.getAttribute('data-color'); self.hidePanel(); } });

投稿2017/10/11 09:18

tkturbo

総合スコア5572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問