【jQuery】jQueryでselectMenuを導入したらiOS Safariで動いてくれない話

投稿者:

ぼやき

デザイン性のみで採用されたjQueryプラグイン同士の衝突を時には力技で回避する骨の折れるお仕事です。

https://jqueryui.com/selectmenu/

こちらのサイトはちゃんと動いてくれるんですが、現在開発中のサイトは他のプラグインと衝突するようです。

解析してみましょう

動作を見る限りでは

<select name="speed" id="speed" style="display: none;">
	<option>Slower</option>
	<option>Slow</option>
	<option selected="selected">Medium</option>
	<option>Fast</option>
	<option>Faster</option>
</select>

静的画面の段階ではこう書いたセレクトメニューから

<!-- タップすると下のプルダウンを展開 -->
<span tabindex="0" id="speed-button" role="combobox" aria-expanded="false" aria-autocomplete="list" aria-owns="speed-menu" aria-haspopup="true" class="ui-selectmenu-button ui-button ui-widget ui-selectmenu-button-closed ui-corner-all" aria-activedescendant="ui-id-28" aria-labelledby="ui-id-27" aria-disabled="false">
<span class="ui-selectmenu-icon ui-icon ui-icon-triangle-1-s"></span>
<span class="ui-selectmenu-text">Fast</span>
</span>
<!-- UIついたプルダウン -->
<div class="ui-selectmenu-menu ui-front ui-selectmenu-open" style="top: 97.1167px; left: 22px;">
	<ul aria-hidden="false" aria-labelledby="speed-button" id="speed-menu" role="listbox" tabindex="0" class="ui-menu ui-corner-bottom ui-widget ui-widget-content" aria-activedescendant="ui-id-27" aria-disabled="false" style="width: 256px;">
		<li class="ui-menu-item"><div id="ui-id-24" tabindex="-1" role="option" class="ui-menu-item-wrapper">Slower</div></li>
		<li class="ui-menu-item"><div id="ui-id-25" tabindex="-1" role="option" class="ui-menu-item-wrapper">Slow</div></li>
		<li class="ui-menu-item"><div id="ui-id-26" tabindex="-1" role="option" class="ui-menu-item-wrapper">Medium</div></li>
		<li class="ui-menu-item"><div id="ui-id-27" tabindex="-1" role="option" class="ui-menu-item-wrapper ui-state-active">Fast</div></li>
		<li class="ui-menu-item"><div id="ui-id-28" tabindex="-1" role="option" class="ui-menu-item-wrapper">Faster</div></li>
	</ul>
</div>

こんなUIの効いたプルダウンをよしなに生成してくれる模様。
ところがiOS Safariでは選択したものが反映できません。

解決

やろうとした実装は以下の通り。

  1. $(document).on(‘click’, ‘#speed-menu li’, function () {}); で、プルダウン選択時のイベントを記述
  2. 1でタップされた li 要素が #speed-menu の中で何番目なのかを取得
  3. #speed のoptionの同じ位置のもののvalue、textを取得
  4. #speed-buttonの文言、および#speedの選択内容に反映

完成品

$(document).on('click', '#speed-menu li', function () {
	event.preventDefault();
	var li_index = $('#speed-menu li').index(this);
	$('#speed').val(li_index);
	$('#speed-button .ui-selectmenu-text').html($('#speed option:selected').text());
});

力技って割にはシンプルな気が。
どなたかの参考になればと思います。

参考サイト

https://qiita.com/otoyo/items/04e12fe478b7f76ce545

http://matsukaz.hatenablog.com/entry/20070704/1183567771

https://www.flatflag.nir87.com/select-2-1240

http://www.jquerystudy.info/reference/selectors/multiple2.html

コメントを残す