<?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>Dawid Pośliński &#187; przykład</title>
	<atom:link href="http://blog.poslinski.net/tag/przyklad/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.poslinski.net</link>
	<description>Code is poetry.</description>
	<lastBuildDate>Sun, 27 Feb 2011 11:30:42 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>jQuery: Okno z potwierdzeniem</title>
		<link>http://blog.poslinski.net/jquery-okno-z-potwierdzeniem/</link>
		<comments>http://blog.poslinski.net/jquery-okno-z-potwierdzeniem/#comments</comments>
		<pubDate>Thu, 04 Dec 2008 17:44:13 +0000</pubDate>
		<dc:creator>Dawid Pośliński</dc:creator>
				<category><![CDATA[jquery]]></category>
		<category><![CDATA[confirm]]></category>
		<category><![CDATA[gotowe rozwiązania]]></category>
		<category><![CDATA[potwierdzenie]]></category>
		<category><![CDATA[przykład]]></category>

		<guid isPermaLink="false">http://blog.poslinski.net/?p=82</guid>
		<description><![CDATA[Pozostajemy przy tematyce praktycznych zastosowań jQuery. Potrzebowałem dzisiaj napisać okno potwierdzające jakąś operację w panelu administracyjnym. Sprawa wydaje się prosta i można by temat rozwiązać, zapominając o JavaScript ( Confirm ) albo PHP, ale zabawa polega na tym, jak to zrobić, żeby się nie narobić i jeszcze, żeby efekt był naprawdę przyzwoity? Postaram się przedstawić [...]]]></description>
			<content:encoded><![CDATA[<p>Pozostajemy przy tematyce praktycznych zastosowań <strong>jQuery</strong>. Potrzebowałem dzisiaj napisać okno potwierdzające jakąś operację w panelu administracyjnym. Sprawa wydaje się prosta i można by temat rozwiązać, zapominając o JavaScript ( Confirm ) albo PHP, ale zabawa polega na tym, jak to zrobić, żeby się nie narobić i jeszcze, żeby efekt był naprawdę przyzwoity?<br />
Postaram się przedstawić przykładowe rozwiązanie problemu, przy założeniu, że element, który chcemy, aby został opatrzony potwierdzeniem przez użytkownika, jest linkiem.<br />
<span id="more-82"></span></p>
<h2>1. Przykładowy plik HTML</h2>
<p>Rozpoczynamy od pliku, na którym będziemy wykonywać nasze nikczemne testy:</p>
<pre class="html">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&gt;
&lt;title&gt;Okno z potwierdzeniem&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;p&gt;
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque ultrices orci quis nisl. Aliquam at dolor. Sed consequat quam ac leo. Curabitur fringilla sodales sem. Praesent eleifend mauris ac ante dictum aliquet. Etiam sapien nulla, consequat eget, consequat vitae, molestie id, lectus. In hac habitasse platea dictumst. Aliquam feugiat odio ac lectus. Suspendisse egestas varius nisl. Morbi nulla. Pellentesque aliquet interdum felis. Vestibulum euismod luctus libero. Suspendisse sodales interdum enim. Pellentesque orci. Nullam massa nunc, eleifend vel, eleifend varius, congue eget, leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;&lt;br/&gt;
Cras aliquet, ligula quis rutrum accumsan, lorem velit dignissim lorem, fermentum dignissim ligula quam at ligula. Nulla dictum interdum purus. Aenean odio. Vestibulum pretium. Phasellus enim enim, semper aliquet, tempus ac, rutrum gravida, libero. Etiam neque odio, blandit nec, suscipit vel, pellentesque scelerisque, leo. In id metus. Vivamus rutrum. Nullam nec velit. Ut purus nisi, porta at, tincidunt sit amet, scelerisque pulvinar, sem. Sed adipiscing risus. In nisi. In et augue. Phasellus ullamcorper urna quis lacus tempus dapibus. Sed eget est. Etiam tellus erat, adipiscing nec, placerat sed, ultricies a, orci. Cras ac lectus. Curabitur mattis lorem nec nibh. &lt;a href="http://poslinski.net" class="confirm"&gt;Maecenas&lt;/a&gt; aliquet iaculis turpis.
&lt;/p&gt;
&lt;div id="confirm"&gt;&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Przykładowy tekst z generatora <a href="http://lipsum.org">Lorem ipsum</a>, trafił wewnątrz znacznika <strong>p</strong>. Zaraz przed zamknięciem znacznika <strong>body</strong>, umieściliśmy <strong>div#confirm</strong>, wewnątrz którego znajdować się będzie kod z naszym oknem do potwierdzania.</p>
<h2>2. Warstwa prezentacji</h2>
<p>Skupmy się na naszym oknie. W moim przypadku, jego kod html który będzie odpowiadał za całe okno, wyglądać będzie następująco:</p>
<pre class="html">&lt;div id="confirm"&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h1&gt;Czy na pewno chcesz usunąć ten element?&lt;/h1&gt;
&lt;p&gt;&lt;button onClick="location.href='TUTAJ TRAFIAĆ BĘDZIE ZAWARTOŚĆ POLA HREF Z LINKU'"&gt; TAK &lt;/button&gt; &lt;button&gt; NIE &lt;/button&gt;&lt;/p&gt;
&lt;/div&gt;&lt;!-- end #confirm div div --&gt;
&lt;/div&gt;&lt;!-- end #confirm div --&gt;
&lt;/div&gt;&lt;!-- end #confirm --&gt;</pre>
<p>Kod wewnątrz <strong>#confirm</strong>, wygenerowany zostanie przez <strong>JavaScript</strong>. Warto jednak zastanowić się, dlaczego wygląda właśnie tak i dlaczego znajduje się na samym dole kodu strony?</p>
<p>Zacznijmy od przyczyny umieszczenia kodu na końcu. Określając <strong>position: absolute</strong>, dla <strong>#confirm</strong>, bez parametru <strong>z-index</strong>, kolejność obiektów z <strong>position: absolute</strong>, będzie odpowiadać kolejności w jakiej zostaną wygenerowane przez przeglądarkę. Ostatnio wygenerowane, pojawią się <strong>najwyżej</strong> stosu warstw z <strong>position: absolute</strong>, zatem, jeśli będą miały np. takie same wymiary, zasłonią warstwy, które pojawiły się w kodzie wcześniej.</p>
<p>Dlaczego wewnątrz confirm, umieściliśmy 2 razy <strong>div</strong>? Do wyjaśnienia tej kwesti, wystarczy zapoznać się z fragmentem kodu css, który umieścimy wewnątrz sekcji head:</p>
<pre class="css">&lt;style type="text/css"&gt;
&lt;!--
* { margin: 0px; padding: 0px; }
body { margin: 10px; }
p { width: 600px; margin: 0 auto; line-height: 25px; }

/* CONFIRM */
#confirm { display: none; position: absolute; height: 100%; width: 100%; background: #000; top: 0; left: 0; }
#confirm { height: expression(((window.Enumerable &amp;&amp; window.Enumerable.max) ? [document.body.scrollHeight, document.documentElement.scrollHeight, document.body.offsetHeight, document.documentElement.clientHeight].max() : document.documentElement.scrollHeight) + 'px' ); width: expression(((window.Enumerable &amp;&amp; window.Enumerable.max) ? [document.body.scrollWidth, document.documentElement.scrollWidth, document.body.offsetWidth, document.documentElement.clientHeight].max() : document.documentElement.scrollWidth) + 'px' );  }
#confirm[id] { position:fixed; }
#confirm div { padding: 10px; margin-top: 200px; }
#confirm div div { background: #900c0c; width: 500px; margin:0 auto; border: 1px solid #CCC; overflow: hidden; }
#confirm div div h1 { font-size: 18px; color: #FFF; }
#confirm div div p { padding: 20px; }
--&gt;
&lt;/style&gt;</pre>
<p><strong>#confirm</strong> określa tutaj tło, które będzie &#8222;przykrywać&#8221; całą stronę. Druga linijka, (ta z dziwnym height i width), konieczna jest w przypadku Internet Explorer. <strong>#confirm</strong>[id] zrozumiały jest tylko dla nowocześniejszych przeglądarek i takie było zamierzenie, aby tło naszego okna miało rozmiar 100% na 100% i przewijało się razem ze stroną ( dla IE jest obliczane każdorazowo na bazie aktualnej szerokości i wysokości okna ).</p>
<p>Pierwszy div jest konieczny, aby wyśrodkować 2gi oraz, aby zrobić odstęp od góry okna po przez <strong>margin-top</strong>. Drugi div określa już nasze okno do potwierdzania, które może zostać wyśrodkowane, ponieważ znajduje się wewnątrz elementu blokowego z <strong>width: 100%</strong> ( Standardowa wartość dla elementu z display: block &#8211; którym jest div )</p>
<h2>3. Czas na jQuery</h2>
<p>Teraz pozostaje nam odpowiednio zareagować na kliknięcie linka, który znajduje się pod koniec bloku <strong>p</strong>, w którym umieściliśmy lorem ipsum&#8217;a:</p>
<pre class="html">&lt;a href="http://poslinski.net" class="confirm"&gt;Maecenas&lt;/a&gt;</pre>
<p>W naszym przypadku, wszystkie linki z klasą <strong>confirm</strong>, będą reagowały na nasz skrypt. Możemy np. zastosować nasze potwierdzenie dla wszystkich linków, pozwalających na usuwanie jakiejś wartości z bazy danych.</p>
<p>Teraz wymagany kod <strong>JavaScript</strong>, który umieszczamy na dole strony:</p>
<pre class="javascript">&lt;script src="jquery.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
$(document).ready(function(){
$(".confirm").click(function(){
$("#confirm")
.css({opacity:0.95})
.fadeIn()
.html('&lt;div&gt;&lt;div&gt;&lt;h1&gt;Przekierować?&lt;/h1&gt;&lt;p&gt;&lt;button onClick=\"location.href=\'' + $(this).attr("href") + '\'\"&gt; TAK &lt;/button&gt; &lt;button&gt; NIE &lt;/button&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;');
return false;
});
$("#confirm").click(function(){$(this).fadeOut();});
});
&lt;/script&gt;</pre>
<p>W pierwszej linii ładujemy <strong>jQuery</strong>.</p>
<p>Następnie, główna gałąź naszego kodu <strong>$(document).ready</strong>, uaktywnia nasz kod, po <strong>pełnym</strong> załadowaniu strony.</p>
<p>Reagujemy na kliknięcie w element z klasą <strong>confirm</strong>, wywołując w tym przypadku serie metod, na elemencie o <strong>id=confirm</strong>. Na początek, dodajemy przeźroczystość (element wciąż jednak ma ustawione <strong>display: none</strong>), następnie korzystając z metody <strong>fadeIn</strong>, <strong>jQuery</strong> płynnie przechodzi z <strong>display: none</strong> do <strong>opacity: 0.95</strong> ( w naszym przypadku ). Na koniec, wewnątrz elementu z <strong>#confirm</strong>, ładujemy kod html z naszymi dwoma divami, wewnątrz których umieszczamy nagłówek <strong>h1</strong> oraz dwa przyciski <strong>button</strong>. Jak pewnie, zauważyliścię, jeden z nich, dodatkowo posiada zadeklarowane zdarzenie <strong>onClick</strong>, które będzie reagować na pozytywne potwierdzenie użytkownika, przekierowywując go do miejsca, które wskazywał kliknięty link.</p>
<p>Dlaczego <strong>return false</strong> na końcu tego bloku kodu? Aby przeglądarka, nie przekierowywała nas automatycznie, po kliknięciu na link, nasza funkcja musi zwracać wartość false, w przeciwnym wypadku nastąpi przekierowanie i z okna potwierdzającego będą nici.</p>
<p>Jeżeli klikniemy gdziekolwiek indziej, niż w <strong>button</strong> z <strong>&#8222;TAK</strong>&#8222;, korzystając ze zdarzenia <strong>fadeOut()</strong>, płynnie zniknie blok z naszym potwierdzeniem, co realizuje <strong>$(&#8222;#confirm&#8221;).click( &#8230; )</strong>.</p>
<p>Całość napisanego kodu powinna wyglądać, mniej więcej tak:</p>
<pre class="html">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&gt;
&lt;title&gt;Okno z potwierdzeniem&lt;/title&gt;
&lt;style type="text/css"&gt;
&lt;!--
* { margin: 0px; padding: 0px; }
body { margin: 10px; }
p { width: 600px; margin: 0 auto; line-height: 25px; }

/* CONFIRM */
#confirm { display: none; position: absolute; height: 100%; width: 100%; background: #000; top: 0; left: 0; }
#confirm { height: expression(((window.Enumerable &amp;&amp; window.Enumerable.max) ? [document.body.scrollHeight, document.documentElement.scrollHeight, document.body.offsetHeight, document.documentElement.clientHeight].max() : document.documentElement.scrollHeight) + 'px' ); width: expression(((window.Enumerable &amp;&amp; window.Enumerable.max) ? [document.body.scrollWidth, document.documentElement.scrollWidth, document.body.offsetWidth, document.documentElement.clientHeight].max() : document.documentElement.scrollWidth) + 'px' );  }
#confirm[id] { position:fixed; }
#confirm div { padding: 10px; margin-top: 200px; }
#confirm div div { background: #900c0c; width: 500px; margin:0 auto; border: 1px solid #CCC; overflow: hidden; }
#confirm div div h1 { font-size: 18px; color: #FFF; }
#confirm div div p { padding: 20px; }
--&gt;
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;p&gt;
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque ultrices orci quis nisl. Aliquam at dolor. Sed consequat quam ac leo. Curabitur fringilla sodales sem. Praesent eleifend mauris ac ante dictum aliquet. Etiam sapien nulla, consequat eget, consequat vitae, molestie id, lectus. In hac habitasse platea dictumst. Aliquam feugiat odio ac lectus. Suspendisse egestas varius nisl. Morbi nulla. Pellentesque aliquet interdum felis. Vestibulum euismod luctus libero. Suspendisse sodales interdum enim. Pellentesque orci. Nullam massa nunc, eleifend vel, eleifend varius, congue eget, leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;&lt;br/&gt;
Cras aliquet, ligula quis rutrum accumsan, lorem velit dignissim lorem, fermentum dignissim ligula quam at ligula. Nulla dictum interdum purus. Aenean odio. Vestibulum pretium. Phasellus enim enim, semper aliquet, tempus ac, rutrum gravida, libero. Etiam neque odio, blandit nec, suscipit vel, pellentesque scelerisque, leo. In id metus. Vivamus rutrum. Nullam nec velit. Ut purus nisi, porta at, tincidunt sit amet, scelerisque pulvinar, sem. Sed adipiscing risus. In nisi. In et augue. Phasellus ullamcorper urna quis lacus tempus dapibus. Sed eget est. Etiam tellus erat, adipiscing nec, placerat sed, ultricies a, orci. Cras ac lectus. Curabitur mattis lorem nec nibh. &lt;a href="http://poslinski.net" class="confirm"&gt;Maecenas&lt;/a&gt; aliquet iaculis turpis.
&lt;/p&gt;
&lt;div id="confirm"&gt;&lt;/div&gt;
&lt;script src="jquery.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
$(document).ready(function(){
$(".confirm").click(function(){
$("#confirm")
.css({opacity:0.95})
.fadeIn()
.html('&lt;div&gt;&lt;div&gt;&lt;h1&gt;Przekierować?&lt;/h1&gt;&lt;p&gt;&lt;button onClick=\"location.href=\'' + $(this).attr("href") + '\'\"&gt; TAK &lt;/button&gt; &lt;button&gt; NIE &lt;/button&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;');
return false;
});
$("#confirm").click(function(){$(this).fadeOut();});
});
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<h2>Podsumowanie</h2>
<p>Działający przykład, można zobaczyć <a href="http://blog.poslinski.net/examples/2.html" target="_blank">tutaj</a>.</p>
<p>To przykładowe rozwiązanie, nie zakłada wszystkich możliwości. Możemy kod rozbudować tak, aby potwierdzenie działało także dla formularzy, należało by wtedy sterować wysyłaniem formularza, co również możemy dokonać z poziomu <strong>jQuery.</strong> Można również, na bazie powyższego kodu stworzyć plugin do jQuery. Zapraszam do dyskusji w komentarzach do tego postu.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.poslinski.net/jquery-okno-z-potwierdzeniem/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

