<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>jQueryUI &#8211; Mach3.laBlog</title>
	<atom:link href="https://blog.mach3.jp/tag/jqueryui/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.mach3.jp</link>
	<description></description>
	<lastBuildDate>Mon, 16 Apr 2012 01:03:41 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>
	<item>
		<title>jQueryUIのDialogをカスタマイズする6つの物凄く細かい小技</title>
		<link>https://blog.mach3.jp/2012/04/16/tips-for-jquery-ui-dialog.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Mon, 16 Apr 2012 01:03:41 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Dialog]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[jQueryUI]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=2365</guid>

					<description><![CDATA[jQueryUIのdialogは結構お世話になっているのですが、たまに欲しい機能がなかったり、あっても説明されてなかったりするのでここにDialogカスタマイズTipsをしたためておきます。 この記事の内容は既に古くなっ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p><a href="http://jqueryui.com/home">jQueryUI</a>の<a href="http://jqueryui.com/demos/dialog/">dialog</a>は結構お世話になっているのですが、たまに欲しい機能がなかったり、あっても説明されてなかったりするのでここにDialogカスタマイズTipsをしたためておきます。</p>



<p class="caution">
  この記事の内容は既に古くなっています。現在最新バージョンのjQueryUIでは挙動が改善されていたり、渡せるオプションが変わっていたりします。
</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/-5paunyWsAV0/T4tueuR1jVI/AAAAAAAABfk/1ppizdzb7Cg/s400/20120416.png" alt="jQueryUIのDialogをカスタマイズする6つの物凄く細かい小技"/></figure>



<p></p>



<span id="more-2365"></span>



<ol class="wp-block-list">
<li>Modalしたダイアログをオーバーレイクリックで閉じる</li>



<li>任意の要素をクリックして閉じる</li>



<li>アニメーションで閉じる・開く</li>



<li>エフェクト中にオーバーレイの後ろに回りこんでしまうのを回避する</li>



<li>閉じる・開くアニメーションにパラメータを渡す</li>



<li>閉じるついでにデストロイする</li>
</ol>



<h2 class="wp-block-heading">1. Modalしたダイアログをオーバーレイクリックで閉じる</h2>



<figure class="wp-block-image"><img decoding="async" src="https://lh5.googleusercontent.com/-IXC3p9J5E7c/T4tuevBn4ZI/AAAAAAAABfk/ltDWmUJori8/s500/20120416-2.png" alt="Modalしたダイアログをオーバーレイクリックで閉じる"/></figure>



<p></p>



<p>escキー押下で閉じるオプションはあるのですが、このオプションはない様子。 そこで、こんな感じで実装してみます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$(<span class="hljs-built_in">document</span>).on(<span class="hljs-string">"click"</span>, <span class="hljs-string">".ui-widget-overlay"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
    $(<span class="hljs-keyword">this</span>).prev().find(<span class="hljs-string">".ui-dialog-content"</span>).dialog(<span class="hljs-string">"close"</span>);
});
</code></span></pre>


<p>ダイアログを紐付けた要素には <em>ui-dialog-content</em> クラスが付加されていて、 その要素に対して .dialog(&#8220;close&#8221;) する事でダイアログを閉じる事が出来ます。</p>



<p>オーバーレイと本体との位置関係は、</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>( .ui-dialog &gt; .ui-dialog-content ) + .ui-widget-overylay</p>
</blockquote>



<p>みたいな感じでオーバーレイの方が後。</p>



<p>尚、オーバーレイ付きのダイアログの表示は<em>modal</em>オプションで出来ます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$(<span class="hljs-string">"#myDialog"</span>).dialog({
    <span class="hljs-attr">modal</span> : <span class="hljs-literal">true</span>
});
</code></span></pre>


<h2 class="wp-block-heading">2. 任意の要素をクリックして閉じる</h2>



<p>例えば中にあるボタンをクリックするとダイアログを閉じるようにしたい。</p>



<p>まずHTMLにてボタンを設置。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"myDialog"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>下のボタンをクリックして閉じてね！<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"button"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"dialog-button-close"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"CLOSE"</span> /&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
</code></span></pre>


<p>こんな感じで実装。<br />
やっている内容はオーバーレイの例と同じです。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$(<span class="hljs-built_in">document</span>).on(<span class="hljs-string">"click"</span>, <span class="hljs-string">".ui-dialog .dialog-button-close"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
    $(<span class="hljs-keyword">this</span>).closest(<span class="hljs-string">".ui-dialog-content"</span>).dialog(<span class="hljs-string">"close"</span>);
});
</code></span></pre>


<h2 class="wp-block-heading">3. アニメーションで閉じる・開く</h2>



<p>ダイアログを開く際、または閉じる際にアニメーションを付加します。<br />
これは公式ドキュメントにも記載されていますが、ややわかりづらかったので。</p>



<p>例えばフェードイン・アウトで開閉をしたい場合。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$(<span class="hljs-string">"#myDialog"</span>).dialog({
    <span class="hljs-attr">show</span> : <span class="hljs-string">"fade"</span>,
    <span class="hljs-attr">hide</span> : <span class="hljs-string">"fade"</span>
});
</code></span></pre>


<p>このように、<em>show</em>オプションと<em>hide</em>オプションに使いたいエフェクト名を渡せばOK。<br />
エフェクト名は、jQueryUIのEffectsコンポーネントの物が使用できます。<br />
個人的にはclipとか好きです。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Possible values: &#8216;blind&#8217;, &#8216;bounce&#8217;, &#8216;clip&#8217;, &#8216;drop&#8217;, &#8216;explode&#8217;, &#8216;fold&#8217;, &#8216;highlight&#8217;, &#8216;puff&#8217;, &#8216;pulsate&#8217;, &#8216;scale&#8217;, &#8216;shake&#8217;, &#8216;size&#8217;, &#8216;slide&#8217;, &#8216;transfer&#8217;.</p>
</blockquote>



<p>cf) <a href="http://jqueryui.com/demos/effect/">jQuery UI &#8211; Effect Demos &amp; Documentation</a></p>



<h2 class="wp-block-heading">4. エフェクト中にオーバーレイの後ろに回りこんでしまうのを回避する</h2>



<p>showオプションとmodalオプションを一緒に使うと、エフェクト中、オーバーレイの後ろにダイアログが回りこんでしまい、若干気持ち悪い動きになってしまいます。</p>



<p>動きの詳細を見てみると、エフェクト中のダイアログが一旦 <em>.ui-effects-wrapper</em> というコンテナに格納され、アニメーション完了時に <em>.ui-dialog</em> に移されています。</p>



<p>問題なのはこの <em>.ui-effects-wrapper</em> のz-indexが、 オーバーレイ（ <em>ui-widget-overlay</em> ）よりも小さい点。 <em>.ui-effects-wrapper</em> が1000、<em>.ui-widget-overlay</em> が1001、<em>.ui-dialog</em> が1002です。</p>



<p>（少なくとも私が）想定する動きにする為には、 オーバーレイのz-indexをエフェクトのコンテナよりも小さくしてあげれば良いです。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$(<span class="hljs-string">"#myDialog"</span>).dialog({
    <span class="hljs-attr">show</span> : <span class="hljs-string">"fade"</span>,
    <span class="hljs-attr">hide</span> : <span class="hljs-string">"fade"</span>,
    <span class="hljs-attr">modal</span> : <span class="hljs-literal">true</span>
});
$(<span class="hljs-string">".ui-widget-overlay"</span>).css(<span class="hljs-string">"z-index"</span>, <span class="hljs-number">999</span>);
</code></span></pre>


<h2 class="wp-block-heading">5. 閉じる・開くアニメーションにパラメータを渡す</h2>



<p>上記のshow/hideのエフェクトにパラメータを渡したい。 例えば、アニメーションの時間や完了時のコールバックを設定したいケースがあります。</p>



<p>公式ドキュメントでは、 「show/hideにはObjectを渡す事も出来る」という旨の記載しかありませんでした。 で、$.animate()にならって適当に突っ込んだら出来ました。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$(<span class="hljs-string">"#myDialog"</span>).dialog({
    <span class="hljs-attr">show</span> : {
        <span class="hljs-attr">effect</span> : <span class="hljs-string">"fade"</span>,  <span class="hljs-comment">// エフェクト名</span>
        <span class="hljs-attr">duration</span> : <span class="hljs-number">500</span>,  <span class="hljs-comment">// アニメーションの時間</span>
        <span class="hljs-attr">complete</span> : <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{  <span class="hljs-comment">// 完了時のコールバック</span>
            alert(<span class="hljs-string">"Dialog is opened"</span>);
        }
    }
});
</code></span></pre>


<p>ちょっと引っ掛けられてしまったのですが、オプションのキーが jQueryUIのEffectコンポーネントのドキュメントにある引数名と違うので注意です。</p>



<h2 class="wp-block-heading">6. 閉じるついでにデストロイする</h2>



<p>既に設置された要素に対して $(ele).dialog() するのであれば問題はありませんが、 動的に生成した要素でダイアログを表示していると、どんどんゴミが溜まっていきます。 例えばこんな感じにダイアログを表示していくと…</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$(<span class="hljs-string">'&lt;p&gt;'</span>).text(<span class="hljs-string">"This is dialog."</span>).dialog();
</code></span></pre>


<p>表示して消す度に、 ドキュメントの最後に</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">&lt;div <span class="hljs-class"><span class="hljs-keyword">class</span></span>=<span class="hljs-string">"ui-dialog ..."</span>&gt;
</code></span></pre>


<p>が量産されていきます。 この場合、これはその後再利用される事はない純然たるゴミです。<br />
別にあって困るものではないかもしれませんが、やっぱり気持ち悪いので<br />
ダイアログを閉じる際についでに削除してみます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$(<span class="hljs-string">'&lt;p&gt;'</span>).text(<span class="hljs-string">"This is dialog."</span>).dialog({
    <span class="hljs-attr">close</span> : <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        $(<span class="hljs-keyword">this</span>).dialog(<span class="hljs-string">"destory"</span>).remove();
    }
});
</code></span></pre>


<h3 class="wp-block-heading">全てのダイアログに対して行う</h3>



<p>もし、全てのダイアログのコンテンツが動的に生成された要素である保証があるのなら、 バブリングを利用すればまとめて処理できますね。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$(<span class="hljs-built_in">document</span>).on(<span class="hljs-string">"dialogclose"</span>, <span class="hljs-string">".ui-dialog-content"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
    $(<span class="hljs-keyword">this</span>).dialog(<span class="hljs-string">"destroy"</span>).remove();
});
</code></span></pre>


<p>勿論、もし前述のような保証がないのならば、そうすべきではありません。想定外の要素が削除されてしまいかねないので。</p>



<h2 class="wp-block-heading">まとめ</h2>



<p>lightbox系のライブラリは色々リリースされていますが、 自分の中のスタンダードを決めておいてしっかりと中身を理解しておくと、 細かい対応が出来るようになりますね。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
