<?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>webbricks &#187; javascript</title>
	<atom:link href="http://blog.grzegorzpawlik.com/tag/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.grzegorzpawlik.com</link>
	<description>Doświadczenie, to coś, co zdobywamy tuż po chwili w której było nam potrzebne ...</description>
	<lastBuildDate>Tue, 07 Feb 2012 10:09:24 +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>Czego można się spodziewać w ECMAScript 6.</title>
		<link>http://blog.grzegorzpawlik.com/2011/12/czego-mozna-sie-spodziewac-w-es6/</link>
		<comments>http://blog.grzegorzpawlik.com/2011/12/czego-mozna-sie-spodziewac-w-es6/#comments</comments>
		<pubDate>Tue, 13 Dec 2011 22:45:02 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[JS and friends]]></category>
		<category><![CDATA[es6]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://blog.grzegorzpawlik.com/?p=1710</guid>
		<description><![CDATA[Naprawdę ciekawe video dla każdego, kto pracuje w JavaScripcie. Jeśli masz 50 minut &#8211; gorąco polecam, szczególnie jeśli pracujesz z JavaSriptem.]]></description>
			<content:encoded><![CDATA[<p>Naprawdę ciekawe video dla każdego, kto pracuje w JavaScripcie. Jeśli masz 50 minut &#8211; gorąco polecam, szczególnie jeśli pracujesz z JavaSriptem.</p>
<p><object style="height: 390px; width: 640px"><param name="movie" value="http://www.youtube.com/v/u4IdoBU1uKE?version=3&#038;feature=player_detailpage"><param name="allowFullScreen" value="true"><param name="allowScriptAccess" value="always"><embed src="http://www.youtube.com/v/u4IdoBU1uKE?version=3&#038;feature=player_detailpage" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="360"></object></p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.grzegorzpawlik.com/2011/12/czego-mozna-sie-spodziewac-w-es6/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Pubsub – super prosty i super ciekawy plugin jQuery</title>
		<link>http://blog.grzegorzpawlik.com/2010/11/pubsub-super-prosty-i-super-ciekawy-plugin-jquery/</link>
		<comments>http://blog.grzegorzpawlik.com/2010/11/pubsub-super-prosty-i-super-ciekawy-plugin-jquery/#comments</comments>
		<pubDate>Tue, 30 Nov 2010 14:28:22 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[JS and friends]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://blog.grzegorzpawlik.com/?p=1434</guid>
		<description><![CDATA[https://github.com/phiggins42/bloody-jquery-plugins/blob/master/pubsub.js Plugin pubsub, którego pierwowzorem była funkcjonalność frameworka Dojo. Służy do rejestracji i publikacji zdarzeń w naszej aplikacji (nie chodzi o eventy DOM). Dzięki czemu w niektórych przypadkach może udać się zmniejszyć ilość ścisłych powiązań w kodzie (coupling). Zresztą trudno &#8230; <a href="http://blog.grzegorzpawlik.com/2010/11/pubsub-super-prosty-i-super-ciekawy-plugin-jquery/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="https://github.com/phiggins42/bloody-jquery-plugins/blob/master/pubsub.js">https://github.com/phiggins42/bloody-jquery-plugins/blob/master/pubsub.js</a></p>
<p>Plugin pubsub, którego pierwowzorem była funkcjonalność frameworka <a href="http://www.dojotoolkit.org/">Dojo</a>. Służy do rejestracji i publikacji zdarzeń w naszej aplikacji (nie chodzi o eventy DOM). Dzięki czemu w niektórych przypadkach może udać się zmniejszyć ilość ścisłych powiązań w kodzie (coupling). Zresztą trudno to wyjaśnić pisząc tekst po polsku&#8230; zachęcam zatem do obejrzenia filmy Rebeki Murphey z <a href="http://net.tutsplus.com/tutorials/javascript-ajax/loose-coupling-with-the-pubsub-plugin/?utm_source=feedburner&#038;utm_medium=feed&#038;utm_campaign=Feed%3A+nettuts+%28Nettuts%2B%29">nettuts</a> (polecam jakość HD i fullscreen):</p>
<p><embed src="http://blip.tv/play/gcMVgoiTQQI%2Em4v" type="application/x-shockwave-flash" width="625" height="450" allowscriptaccess="always" allowfullscreen="true"></embed></p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.grzegorzpawlik.com/2010/11/pubsub-super-prosty-i-super-ciekawy-plugin-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>sammy.js</title>
		<link>http://blog.grzegorzpawlik.com/2010/11/sammy-js/</link>
		<comments>http://blog.grzegorzpawlik.com/2010/11/sammy-js/#comments</comments>
		<pubDate>Thu, 04 Nov 2010 09:53:54 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[JS and friends]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://blog.grzegorzpawlik.com/?p=1422</guid>
		<description><![CDATA[Świetny plugin do jQuery. A właściwie można by go nazwać frameworkiem rozszerzającym możliwości frameworka jQuery ;) Pozwala na zorganizowanie aplikacji intensywnie wykorzystującej Ajax tak, żeby nie tracić działania przycisku wstecz i w ogóle historii przeglądania. Mnie ostatnio przydało się, gdy &#8230; <a href="http://blog.grzegorzpawlik.com/2010/11/sammy-js/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Świetny plugin do jQuery. A właściwie można by go nazwać frameworkiem rozszerzającym możliwości frameworka jQuery ;)</p>
<p>Pozwala na zorganizowanie aplikacji intensywnie wykorzystującej Ajax tak, żeby nie tracić działania przycisku wstecz i w ogóle historii przeglądania. </p>
<p>Mnie ostatnio przydało się, gdy musiałem dorobić stronę w stronie i nie bardzo miałem ochotę grzebać w mechanizmach php, które tam zachodzą. Po prostu każdy link w podmenu ładuje treść ajaxem i każda taka strona ma swój własny link.</p>
<p>Polecam super krótki tutorial na nettuts, który pokaże Wam jak zacząć:<br />
<a href="http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-an-introduction-to-sammy-js/">http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-an-introduction-to-sammy-js/</a></p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.grzegorzpawlik.com/2010/11/sammy-js/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Namespace’y javascript w widokach cakePHP</title>
		<link>http://blog.grzegorzpawlik.com/2010/10/namespace-javascript-w-widokach-cakephp/</link>
		<comments>http://blog.grzegorzpawlik.com/2010/10/namespace-javascript-w-widokach-cakephp/#comments</comments>
		<pubDate>Fri, 29 Oct 2010 17:00:00 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[JS and friends]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[namespace]]></category>
		<category><![CDATA[View]]></category>

		<guid isPermaLink="false">http://blog.grzegorzpawlik.com/?p=1410</guid>
		<description><![CDATA[Czasem zdarza się tak, że w danym widoku potrzebuję bardzo specyficzną funkcję javascript. Na przykład w widoku invoices/add funkcja count_gros_value, która na podstawie wpisanej wartości w polu netto (net) i stawki var wyliczy wartość brutto (gros). Załóżmy, że nie wiem &#8230; <a href="http://blog.grzegorzpawlik.com/2010/10/namespace-javascript-w-widokach-cakephp/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Czasem zdarza się tak, że w danym widoku potrzebuję bardzo specyficzną funkcję javascript. Na przykład w widoku invoices/add funkcja count_gros_value, która na podstawie wpisanej wartości w polu netto (net) i stawki var wyliczy wartość brutto (gros).</p>
<p>Załóżmy, że nie wiem jak napisać taką funkcję, żeby była elastyczna, po prostu we wnętrzu mam zaszyte id pól formularza:</p>
<pre name="code" class="javascript">
function count_gros_value(){
   $("#Invoice[gros]").val(
      parseFloat($("#Invoice[net]").val()) *
      parseFloat($("#Invoice[vat]").val())
   );
}
// wywołanie
count_gros_value();
</pre>
<p>(nie sprawdzałem tego kodu, służy jako przykład i nie mam pojęcia czy dobrze działa).</p>
<p>Oprócz wielkiej nieelastyczności kodu (o czym teraz pisał nie będę) istnieje problem polegający na tym, że nie wiem czy jakiś inny programista nie zdefiniował funkcji count_gros_value gdzieś w layoucie. Oczywiście dostanę error jeśli tak jest, więc poprawię ją na my_count_gros_value() (sic!). Ok, wszystko działa. Jednak przychodzi inny programista i odczuwa potrzebę zdefiniowania funckji my_count_gros_value() w layoucie (no bo count_gros_value() już istnieje, a jego robi coś inaczej/lepiej więc trzeba ją zaimplementować). W ten sposób rozwala twój zaimplementowany fragment i nikt tego nie zauważa.</p>
<p>Jak tego uniknąć? Można zacząć nazywać takie &#8220;lokalne&#8221; funkcje invoices_index_count_gros_value() ale to zaczyna wyglądać nieestetycznie i aż się ciśnie na usta magiczne słowo &#8220;namespace&#8221;.</p>
<p>W Javascript nie ma przestrzeni nazw, ale możesz użyć obiektów:</p>
<pre name="code" class="javascript">
var invoices = {
   index: {
      count_gros_value: function(){
         $("#Invoice[gros]").val(
            parseFloat($("#Invoice[net]").val()) *
            parseFloat($("#Invoice[vat]").val())
         );
      }
   }
}
// wywołanie
invoices.index.cunt_gros_value();
</pre>
<p>to jest już fajniejsze, ale ma dwa problemy:</p>
<ol>
<li>ciągłe definiowanie obiektów dla namespace&#8217;ów jest równie uciążliwe jak nazwa funkcji invoices_index_count&#8230;</li>
<li>gdy ktoś przed nami zdefiniuje zmienną var invoices = &#8220;invoices&#8221;; to mu ją nadpiszemy</li>
</ol>
<p>Dlatego proponuję taką funckję, która definiuje dowolnie głębokie obiekty udające namespace&#8217;y i do tego tworzy je wszytkie w zmiennej o pseudolosowej nazwie (w stylu: Namespace12883495048110.1425782083547854):</p>
<pre name="code" class="javascript">
function Namespace(namespace_path){
	var w = window;

	window.namespaceFrameworkNamespaceName =
		window.namespaceFrameworkNamespaceName ||
		"Namespace"+ new Date().getTime() + new Math.random();

	var arr  = (window.namespaceFrameworkNamespaceName + namespace_path).
						split(".");

	for(i in arr){
		w[ arr[i] ] = w[ arr[i] ] || {};
		w = w[ arr[i] ];
	}
	return w;
}
</pre>
<blockquote><p>Ok, jakiś uparciuch mógłby się uprzeć, że ktoś może w aplikacji zmiennej &#8216;namespaceFrameworkNamespaceName&#8217; &#8211; takiego problem nie rozwiązywałbym na poziomie kodu, ale personalnym (zwiałbym z projektu) ;)</p></blockquote>
<p>tak wygląda definiowanie funkcji w namespace:</p>
<pre name="code" class="javascript">
Namespace("app.users.index").check_form = function(){
	document.write("my_check_form()");
};
</pre>
<p>a tak jej wywołanie:</p>
<pre name="code" class="javascript">
Namespace("app.users.index").check_form();
// lub gdy mamy zamiar wywołać wiele funkcji z danego namespace:
with(Namespace("app.users.index")){
 check_form();
}
</pre>
<p>Można by z tego zrobić tez fajne rozszerzenie jQuery,<br />
$().nspc(&#8220;app.invoices.index&#8221;) (pisałem już o <a href="/?p=1222">rozszerzaniu jQuery w tutorialu &#8220;longPolling&#8221;</a>)</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.grzegorzpawlik.com/2010/10/namespace-javascript-w-widokach-cakephp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Czym Ajax jest, a czym nie?</title>
		<link>http://blog.grzegorzpawlik.com/2010/07/czym-ajax-jest-a-czym-nie/</link>
		<comments>http://blog.grzegorzpawlik.com/2010/07/czym-ajax-jest-a-czym-nie/#comments</comments>
		<pubDate>Fri, 09 Jul 2010 15:46:20 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[JS and friends]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[json]]></category>

		<guid isPermaLink="false">http://blog.grzegorzpawlik.com/?p=1058</guid>
		<description><![CDATA[Wpadłem ostatnio na dość ciekawą kwestię &#8211; błędne pojęcie na temat ajaxa skutkuje czasem błędną (bardziej skomplikowaną niż trzeba) implementacją jakiejś funkcjonalności. Problem jest następujący: użytkownik wpisuje kod. My sprawdzamy go na serwerze i jeśli jest prawidłowy, to zwracamy pewne &#8230; <a href="http://blog.grzegorzpawlik.com/2010/07/czym-ajax-jest-a-czym-nie/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><div id="attachment_1062" class="wp-caption alignright" style="width: 165px"><img src="http://blog.grzegorzpawlik.com/wp-content/uploads/2010/07/ajax_proszek_double_bleach_m051.jpg" alt="ajax" title="ajax" width="155" height="398" class="size-full wp-image-1062" /><p class="wp-caption-text">ajax</p></div><br />
Wpadłem ostatnio na dość ciekawą kwestię &#8211; błędne pojęcie na temat ajaxa skutkuje czasem błędną (bardziej skomplikowaną niż trzeba) implementacją jakiejś funkcjonalności.</p>
<p>Problem jest następujący: użytkownik wpisuje kod. My sprawdzamy go na serwerze i jeśli jest prawidłowy, to zwracamy pewne powiązane z nim właściwości (np. wysokość rabatu) i pewien komunikat, który musi być wyświetlony na stronie (np. w przypadku błędnego kodu &#8220;kod promocyjny jest niepoprawny&#8221;. Dodatkowe wymaganie jest takie: wysokość rabatu ma się pojawić koło ceny całkowitej, cena ma się zmniejszyć o ten rabat, a komunikat ma się pojawić nad przyciskiem &#8220;Zamów&#8221;, które jest w fizycznie w innym miejscu niż cena. Dobrze by było, gdyby w wypadku nieprawidłowego kodu przycisk zamów był nieaktywny.</p>
<p>Jeśli o Ajaxie myślisz tylko jak o <strong>sposobie na podmienianie fragmentów strony bez przeładowania</strong> to możesz skończyć z takim dziwadłem:</p>
<p>Wysyłasz trzy ajaxy &#8211; jeden update&#8217;uje jakiś element z rabatem, drugi pole z wiadomością, a trzeci (o zgrozo) przesyła kod html przycisku (raz disabled, raz enabled). No i jeszcze parsujesz, tniesz i sklejasz zwrócony rabat, żeby odjąć go od ceny.</p>
<p>Teraz zacznij myśleć o Ajaxie, który jest sposobem na <strong>komunikację</strong> z serwerem bez potrzeby przeładowania strony (przeładowanie strony to też komunikacja z serwerem &#8211; my pytamy, on odpowiada, o coś prosimy, serwer coś robi). Do tego po otrzymaniu odpowiedzi z serwera możemy z nią zrobić co chcemy &#8211; nie musi się automatycznie i bezmyślnie ładować do diva #ajaxResponseToParse ;) I w końcu, jeśli jeszcze nie wiesz, dowiedz się co to znaczy JSON. </p>
<p>Jeśli dodasz te trzy składniki to możesz skończyć z takim rozwiązaniem:</p>
<pre name="code" class="javascript">
$.getJSON("http://example.com/check_code/XXX", function(data){
   $("#discount-ammount") = data.discount;
   $("#price").html(data.new_price); // *
   $("#message").html(data.message);
   $("#submit").get(0).disabled = data.submit_disabled;
});
</pre>
<p>(*) myślę, że dobrze takie rzeczy liczyć w jednym miejscu po stronie serwera.</p>
<p><strong>Albo jednym słowem &#8211; wyjdź poza wygodne schematyczne myślenie i rozejrzyj się wokół. Możliwe, że wbijasz wkręt obcasem siedząc na młotku i gwoździe mając w kieszeni.</strong></p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.grzegorzpawlik.com/2010/07/czym-ajax-jest-a-czym-nie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Krótka wskazówka &#8211; outline obiektowego Javascript w Eclipse</title>
		<link>http://blog.grzegorzpawlik.com/2010/06/krotka-wskazowka-outline-obiektowego-javascript-w-eclipse/</link>
		<comments>http://blog.grzegorzpawlik.com/2010/06/krotka-wskazowka-outline-obiektowego-javascript-w-eclipse/#comments</comments>
		<pubDate>Mon, 28 Jun 2010 12:18:07 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[Inne]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[OOP]]></category>

		<guid isPermaLink="false">http://blog.grzegorzpawlik.com/?p=1038</guid>
		<description><![CDATA[Jeśli używasz Eclipse, piszesz kod Javascript i piszesz go obiektowo może Cię to zainteresować. Pewnie dobrze wiesz, że jest wiele sposobów na pisanie obiektowego Javascriptu, możesz o różnicach poczytać wszędzie. Jednak moim pragnieniem było, aby eclipse był w stanie pokazać &#8230; <a href="http://blog.grzegorzpawlik.com/2010/06/krotka-wskazowka-outline-obiektowego-javascript-w-eclipse/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Jeśli używasz Eclipse, piszesz kod Javascript i piszesz go obiektowo może Cię to zainteresować.<br />
<a href="http://blog.grzegorzpawlik.com/wp-content/uploads/2010/06/javascript-outline.jpg" rel="lightbox[1038]" title="javascript-outline"><img src="http://blog.grzegorzpawlik.com/wp-content/uploads/2010/06/javascript-outline-300x208.jpg" alt="" title="javascript-outline" width="300" height="208" class="alignnone size-medium wp-image-1040" /></a><br />
Pewnie dobrze wiesz, że jest <a href="http://mckoss.com/jscript/object.htm">wiele sposobów na pisanie obiektowego Javascriptu</a>, możesz o różnicach poczytać wszędzie. Jednak moim pragnieniem było, aby eclipse był w stanie pokazać mi outline aktualnie edytowanego pliku js. Po kilku próbach stwierdzam, że działa następujący sposób:</p>
<pre name="code" class="js">
var Klasa = function(){
  this.x = 1;  //definicja pól
}
//definicja metod
Klasa.prototype.setX = function(parametr){
  this.x = parametr;
}
</pre>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.grzegorzpawlik.com/2010/06/krotka-wskazowka-outline-obiektowego-javascript-w-eclipse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jak zrobić callback w javascript &#8211; minitutorial.</title>
		<link>http://blog.grzegorzpawlik.com/2010/04/jak-zrobic-callback-w-javascript-minitutorial/</link>
		<comments>http://blog.grzegorzpawlik.com/2010/04/jak-zrobic-callback-w-javascript-minitutorial/#comments</comments>
		<pubDate>Tue, 27 Apr 2010 04:00:50 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Inne]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://blog.grzegorzpawlik.com/?p=931</guid>
		<description><![CDATA[Jedną z największych magicznych mocy wszystkich frameworków i pluginów javascript jest możliwość rozszerzenia ich działania poprzez tak zwane callbacks. Pokażę Wam jak wykonać własny obiekt javascript, który będzie potrafił je obsłużyć. Po pierwsze potrzebujesz zdefiniować swoją klasę: function myClass(params){ } &#8230; <a href="http://blog.grzegorzpawlik.com/2010/04/jak-zrobic-callback-w-javascript-minitutorial/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Jedną z największych magicznych mocy wszystkich frameworków i pluginów javascript jest możliwość rozszerzenia ich działania poprzez tak zwane callbacks. Pokażę Wam jak wykonać własny obiekt javascript, który będzie potrafił je obsłużyć.</p>
<p>Po pierwsze potrzebujesz zdefiniować swoją klasę:</p>
<pre name="code" class="javascript">
function myClass(params){
}
</pre>
<p>Prościzna ;) Spróbujmy teraz obsłużyć callback beforeInit, który odpali się &#8220;najsampierw&#8221; przy tworzeniu obiektu:</p>
<pre name="code" class="javascript">
function myClass(params){
    if(params.beforeInit){
        console.log("beforeInit");
        params.beforeInit();
    }
    console.log("Init complete")
}
console.log("=============");
var a = new myClass(
  {
    beforeInit: function(){console.log("My message!");}
  }
);
</pre>
<p>Włącz firebuga i sprawdź działanie ;)</p>
<pre>
=============
beforeInit
My message!
Init complete
</pre>
<p>Oczywiście Twoja klasa może zechcieć coś zrobić oprócz stworzenia siebie samej ;) Callbacki mogą zachowywać się różnie w zależności od stanu obiektu. Do klasy dodałem metodę doSth i callback beforeRun (który wykonuje się przed wykonaniem metody doSth)</p>
<p>Wypróbuj następujący kod:</p>
<pre name="code" class="javascript">
function myClass(params){
    if(params.beforeInit){
        console.log("#beforeInit");
        params.beforeInit();
    }

    this.doSth = function() {
        if(params.beforeRun){
            params.beforeRun(this.state);
        }
        console.log("#doSth");
    }

    if(params.state) {
        this.state = params.state;
    }else{
        this.state = false;
    }

    console.log("Init complete")
}
console.log("=============");
var a = new myClass(
  {
    state: 1,
    beforeRun: function(state){
        if(state != false) {
            console.log("Extended! state = " + state);
        }else {
            //do nothing
        }
    }
  }
);
a.doSth();
console.log("=============");
var b = new myClass(
  {
    beforeRun: function(state){
        if(state != false) {
            console.log("Extended! state = " + state);
        }else {
            //do nothing
        }
    }
  }
);
b.doSth();
</pre>
<p>wynik:</p>
<pre>
=============
Init complete
Extended! state = 1
#doSth
=============
Init complete
#doSth
</pre>
<p>Możesz też uzależnić wykonanie metody doSth w zależności od warunków wewnętrznych (parametr state) lub zewnętrznych:</p>
<pre name="code" class="javascript">
function myClass(params){
    if(params.beforeInit){
        console.log("#beforeInit");
        params.beforeInit();
    }

    this.doSth = function() {
        if(params.beforeRun){
            if(!params.beforeRun(this.state)){
                return;
            }
        }
        console.log("#doSth");
    }

    if(params.state) {
        this.state = params.state;
    }else{
        this.state = false;
    }

    console.log("Init complete")
}
console.log("=============");
var a = new myClass(
  {
    state: 1,
    beforeRun: function(state){
        if(state != false) {
            console.log("Extended! state = " + state);
        }else {
            return false
        }
    }
  }
);
a.doSth();
console.log("=============");
var b = new myClass(
  {
    beforeRun: function(state){
        if(state != false) {
            console.log("Extended! state = " + state);
        }else {
            return false
        }
    }
  }
);
b.doSth();
console.log("=============");
var c = new myClass(
  {
    beforeRun: function(state){
        if( (new Date().getTime())%2  ) {
            console.log("Extended! state = " + state);
        }else {
            return false
        }
    }
  }
);
c.doSth();
</pre>
<p>Wynik (zależy od aktualnego czasu, więc może okazać się konieczne uruchomienie go kilka razy, zanim otrzymasz identyczny):</p>
<pre>
=============
Init complete
Extended! state = 1
=============
Init complete
=============
Init complete
Extended! state = false
</pre>
<p>W przypadku obiektu c metoda run odpali się tylko, jeśli aktualny timestamp jest podzielny przez 2 ;)</p>
<p>To tyle. Mam nadzieję, że pozwoli Wam to wymyślać ciekawsze i bardziej użyteczne fragmenty kodu javascript, nawet tego używanego prywatnie.</p>
<p>Sprytnie zaprojektowana klasa ze sprytnymi callbackami jest bardzo przyjemna &#8211; możliwe jest modyfikowanie jej zachowania bez modyfikacji klasy bazowej. To samo podejście znacie pewnie z Behaviors cake&#8217;a.</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.grzegorzpawlik.com/2010/04/jak-zrobic-callback-w-javascript-minitutorial/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Code snippet: ekstrakcja nazwy pola z inputów cakePHP przy pomocy jQuery</title>
		<link>http://blog.grzegorzpawlik.com/2010/03/code-snippet-ekstrakcja-nazwy-pola-z-inputow-cakephp-przy-pomocy-jquery/</link>
		<comments>http://blog.grzegorzpawlik.com/2010/03/code-snippet-ekstrakcja-nazwy-pola-z-inputow-cakephp-przy-pomocy-jquery/#comments</comments>
		<pubDate>Thu, 18 Mar 2010 16:00:27 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[code-snippet]]></category>
		<category><![CDATA[FormHelper]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[View]]></category>

		<guid isPermaLink="false">http://blog.grzegorzpawlik.com/?p=860</guid>
		<description><![CDATA[Natknąłem się na następujący problem: Mam formularz wyszukiwania, który wygląda różnie w różnych widokach, jednak na jego podstawie jest budowany url tak samo dla każdego widoku. Na przykład: // some view echo $form->create("Model"); echo $form->input("field1"); echo $form->input("field2"); echo $form->input("field3"); echo &#8230; <a href="http://blog.grzegorzpawlik.com/2010/03/code-snippet-ekstrakcja-nazwy-pola-z-inputow-cakephp-przy-pomocy-jquery/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Natknąłem się na następujący problem:</p>
<p>Mam formularz wyszukiwania, który wygląda różnie w różnych widokach, jednak na jego podstawie jest budowany url tak samo dla każdego widoku. Na przykład:</p>
<pre name="code" class="php">
// some view
echo $form->create("Model");
echo $form->input("field1");
echo $form->input("field2");
echo $form->input("field3");
echo $form->end("submit");
</pre>
<p>W zdarzeniu onsubmit chcę wygenerować taki url:<br />
&#8220;/field1:value1/field2:value2/field3:value3&#8243;<br />
Gdzie valueX to oczywiście wartość danego pola.</p>
<p>Pobranie interesujących nas pól:</p>
<pre name="code" class="javascript">
$("form input[type!=submit][name!=_method], form select");
</pre>
<p>Tak można wytargać nazwę pola z &#8220;name&#8221; inputów (zakładając, że w zmiennej string mamy cały name):<br />
<del datetime="2010-03-18T14:20:44+00:00">
<pre name="code" class="javascript">
// string.substr(
//   string.indexOf("[", string.indexOf("]"))
// ).slice(1, -1);
// nowa, lepsza, prostsza wersja:
string.substr(
   string.lastIndexOf("[")
).slice(1, -1)
</pre>
<p></del><br />
Całość tworzenia linków:</p>
<pre name="code" class="javascript">
var params = "";

$("form input[type!=submit][name!=_method], form select").each(
   function(index,element) {
      params +=
         element.name.substr(
            element.name.lastIndexOf("[")
         ).slice(1, -1)+
         ":"+
         element.value+
         "/";
   }
);
</pre>
<p>Przydaje się, jeśli pracujesz z parametrami &#8220;named&#8221;</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.grzegorzpawlik.com/2010/03/code-snippet-ekstrakcja-nazwy-pola-z-inputow-cakephp-przy-pomocy-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

