0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

selectのonChangeがpopupBlockされるのを甘んじて受け入れる

0
Last updated at Posted at 2017-01-31

したかったこと

簡易メニュー的なの。
select-optionで選択された画面を開くようにしたい。

最初に書いたコード

<select onChange='window.open(this.options[this.selectedIndex].getAttribute("url"),this.value)'>
<option value='a' url='./a'>A</option>
<option value='b' url='./b'>B</option>
</select>

面倒なのでoptionに適当なattributeもたせて、それ参照させる、

しかし、これだと、動かない。ウンとも、スンとも。
onChangeはuserのdirect actionでないので、Safariはwindow.openをブロックします。
うん、まあそうだな。仕方ないな。

onClickにする

<select onClick='window.open(this.options[this.selectedIndex].getAttribute("url"))'>
<option value='a' url='./a'>A</option>
<option value='b' url='./b'>B</option>
</select>

よし、完璧。
そのはずだった。
しかし、世界にはWindowsとかいうクs…残念が。

selectの横にプルダウンできそうなアイコンを表示してくれて
実際クリックでプルダウンできるのだが、プルダウン開いた瞬間にonClickが走る。
*MacのSafariだとプルダウンを閉じるまで待ってくれる。

クリックでなく、マウスボタンを離さずにプレス、ドラッグで選択する分には問題ない。
が、普通に考えてユーザーがそんな面倒をしてくれるとは思えないので、本当にwindowsとか以下略。

つまり

  • onClickにするとwindowsで問題が出る
  • onChangeにするとSafari(Chromeも?)で無言でpopup-blockされる

妥協策

function openOthers(item){
	var selector = document.getElementById('selector')
	var btn   = document.getElementById('btn')
	var url = selector.options[selector.selectedIndex].getAttribute("url")
	var kind = selector.options[selector.selectedIndex].getAttribute("value")
	var w = window.open(url,kind);
	if(!w){
		btn.style.display=''
		return
	} 
	btn.value = '{{defaultValue}}'
	btn.style.display='none'
}
<select onChange='openOthers(this)'>
<option value='a' url='./a'>A</option>
<option value='b' url='./b'>B</option>
</select>
<input type='button' id='btn' onClick='openOthers(this)' style='display:none' value='開く'>

Windowsとかいうのに遠慮して、ブロックされる前提で開く。
ブロックされたらwindow.openに返値がnullかなんかになるので
それを拾って横に送信ボタン的なのを出す。
送信ボタン的なのはonClickなのでdirect actionとしてブロックされない。

FireFoxとかだとポップアップブロックしました、の通知バーが出てそこで止まるみたい。IE Edgeでもそうなるみたいね。

利用ユーザーがwindows多そうだったから妥協した。いや、無理っすねえ。何も起きない方が問題ですしねえ。で押し通すところ。

他に良い方法、あったら教えて欲しいです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?