したかったこと
簡易メニュー的なの。
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多そうだったから妥協した。いや、無理っすねえ。何も起きない方が問題ですしねえ。で押し通すところ。
他に良い方法、あったら教えて欲しいです。