tag:blogger.com,1999:blog-16065835188940724962024-02-07T04:13:00.815+01:00JavaScriptThe World's Most Misunderstood Programming LanguageGrzegorz Kućmierzhttp://www.blogger.com/profile/05099605285045088669noreply@blogger.comBlogger36125tag:blogger.com,1999:blog-1606583518894072496.post-14724586147280227982014-06-30T11:08:00.005+02:002014-06-30T11:09:34.907+02:00get nested property of objectFunction that allows to get nested property of object. If it is not defined, function will return undefined.<br />
<br />
<pre class="js">var getProperty = function(obj, propertySrc) {
var src = propertySrc.split('.');
var res = obj;
for (var i = 0, l = src.length; i < l; ++i) {
if (!(src[i] in res)) {
return void(0);
}
res = res[src[i]];
}
return res;
};</pre>
Working example:
<a href="http://jsfiddle.net/gkucmierz/5Df5D/">http://jsfiddle.net/gkucmierz/5Df5D/</a>Grzegorz Kućmierzhttp://www.blogger.com/profile/05099605285045088669noreply@blogger.com0tag:blogger.com,1999:blog-1606583518894072496.post-77027964628105220372014-02-23T21:48:00.000+01:002014-02-24T02:44:45.836+01:00sort - stabilność sortowaniaKod JavaScript, którym można sprawdzić czy zaimplementowany algorytm <a href="http://pl.wikipedia.org/wiki/Sortowanie">sortowania</a> jest stabilny czy nie.<br />
<br />
<pre>var a = [
{n: 1, str: 'first'},
{n: 2, str: 'stable check 1'},
{n: 2, str: 'stable check 2'},
{n: 3, str: 'last'}
];
a.sort(function(a, b) {
return a.n - b.n;
});</pre><br />
Przykład jsfiddle: <a href="http://jsfiddle.net/gkucmierz/WWGa8/1/">http://jsfiddle.net/gkucmierz/WWGa8/1/</a>Grzegorz Kućmierzhttp://www.blogger.com/profile/05099605285045088669noreply@blogger.com0tag:blogger.com,1999:blog-1606583518894072496.post-55466900538704625912014-01-28T13:20:00.000+01:002014-01-28T13:47:02.796+01:00recursiveEachrecursiveEach - rekursywna iteracja po obiekcie. Funkcja do prawidłowego działania wymaga również 2 innych funkcji znajdujących się na tym blogu: getType oraz each.<br />
Funkcję można dodatkowo rozbudować. Np. idealnie byłoby, gdyby w docelowej funkcji zamiast samej wartości klucza zwracała tablicę stringów wskazujących na ścieżkę do tego klucza w głównym obiekcie.<br />
<br />
<pre class="js">var recursiveEach = function recur(obj, fn, depth) {
if (typeof depth === 'undefined')
depth = -1;
var res = {};
if (getType(obj) === 'Object' && depth !== 0) {
each(obj, function (el, key) {
res[key] = recur(el, fn, depth - 1);
});
return res;
}
return fn(obj);
};</pre><br />
<pre class="js">var getType = function (obj) {
return ({}).toString.call(obj).slice(8, -1);
};
var each = function (obj, fn) {
var res = {};
for (var i in obj) {
if (obj.hasOwnProperty(i)) {
res[i] = fn.call(obj, obj[i], i);
}
}
return res;
};</pre><br />
Przy pomocy tej funkcji łatwo zaimplementować funkcję flatten. Do funkcji flatten można przekazać zarówno obiekt jak i tablicę.<br />
<pre class="js">var flatten = function(obj) {
var res = [];
recursiveEach(obj, function(val) {
res.push(val);
});
return res;
};</pre>Grzegorz Kućmierzhttp://www.blogger.com/profile/05099605285045088669noreply@blogger.com0tag:blogger.com,1999:blog-1606583518894072496.post-46634720041335488922014-01-22T03:21:00.000+01:002014-01-22T03:22:18.689+01:00asyncMap - asynchroniczne iterowanie po tablicyFunkcja pozwalająca na iterację po tablicy w sposób asynchroniczny. Można dzięki niej w genialnie prosty sposób wykonać np. kolejkę zadań, które wymagają wykonania asynchronicznych akcji np. zapytanie do innego serwera.<br />
<br />
<pre class="js">var asyncMap = function(arr, fn, endFn) {
var i = 0,
len = arr.length,
res = [];
(function callee() {
fn(arr[i], i, function(singleRes) {
res.push(singleRes);
if (++i < len) {
callee();
} else {
endFn(res);
}
}, arr);
})();
};</pre>
prosty przykład użycia: <a href="http://jsfiddle.net/gkucmierz/QzLP5/">http://jsfiddle.net/gkucmierz/QzLP5/</a>Grzegorz Kućmierzhttp://www.blogger.com/profile/05099605285045088669noreply@blogger.com0tag:blogger.com,1999:blog-1606583518894072496.post-86324649682304830332013-09-29T17:55:00.000+02:002013-09-29T18:06:12.611+02:00DialogsControl - kontrolowanie domyślnych okien dialogowychProsta funkcja/klasa pozwalająca kontrolować (udawać) okna dialogowe.<br />
Przy pomocy metody disable możemy wyłączyć wyświetlanie wszystkich okien dialogowych. oba parametry tej metody pozwalają ustawić wartości zwracane przez funkcje confirm oraz prompt. Domyślne ich wartości to odpowiednio true oraz '' (pusty string).<br />
Metoda restore pozwala przywrócić domyślne wartości tych funkcji czyli oryginalne okna dialogowe w obiekcie window. Domyślne pod warunkiem, że nie były one modyfikowane przez inny skrypt.<br />
<br />
<pre class="js">var DialogsControl = function(w){
w = w || window;
var d = {
alert: w.alert,
confirm: w.confirm,
prompt: w.prompt
};
return {
disable: function(confirmRet, promptRet){
if (typeof confirmRet === 'undefined')
confirmRet = true;
if (typeof promptRet === 'undefined')
promptRet = '';
w.alert = function(){};
w.confirm = function(){return confirmRet;};
w.prompt = function(){return promptRet;};
},
restore: function(){
w.alert = d.alert;
w.confirm = d.confirm;
w.prompt = d.prompt;
}
};
};</pre><br />
Gotowy kod z przykładami wywołania można przetestować tutaj <a href="http://jsfiddle.net/a8BvR/">http://jsfiddle.net/a8BvR/</a>Grzegorz Kućmierzhttp://www.blogger.com/profile/05099605285045088669noreply@blogger.com0tag:blogger.com,1999:blog-1606583518894072496.post-24866358481760361332013-09-29T15:11:00.001+02:002013-09-29T17:29:55.243+02:00onContentChangeTroszkę słabe rozwiązanie, ale pozwala wykryć zdarzenie zmiany treści na dowolnej stronie.<br />
<br />
<pre>var onContentChange = function(htmlEl, fn) {
var content = htmlEl.innerHTML;
(function callee(){
if (htmlEl.innerHTML !== content) {
fn(htmlEl.innerHTML, content);
return;
}
setTimeout(callee, 50);
})();
};</pre><br />
Zdarzenie po wykryciu odpina się automatycznie.<br />
<br />
Przykład wywołania:<br />
<br />
<pre>onContentChange(document.querySelector('div'), function(n, o){
alert(
'changed'+"\n"+
'old value: '+o+"\n"+
'new value: '+n
);
});</pre><br />
jsfiddle: <a href="http://jsfiddle.net/f82Um/1/">http://jsfiddle.net/f82Um/1/</a>Grzegorz Kućmierzhttp://www.blogger.com/profile/05099605285045088669noreply@blogger.com0tag:blogger.com,1999:blog-1606583518894072496.post-16699711923525454352013-09-22T22:34:00.002+02:002013-09-22T22:36:42.276+02:00php dumpPrzydatna funkcja, która wyświetla obiekt, w postaci czytelnej na stronie html.<br />
Zamiast print_r, można również użyć var_dump lub podobnej funkcji.<br />
<br />
<pre class="php">function dump($obj) {
echo '<pre>';
echo htmlspecialchars(print_r($obj, true));
echo '</pre>';
}</pre>Grzegorz Kućmierzhttp://www.blogger.com/profile/05099605285045088669noreply@blogger.com0tag:blogger.com,1999:blog-1606583518894072496.post-29141136260378799312013-09-12T06:00:00.000+02:002013-09-18T20:39:41.702+02:00waitFor - zaczekaj na pojawienie się obiektuFunkcja, która w bardzo prymitywny sposób czeka na pojawienie się oczekiwanego obiektu w bliżej nie określonym czasie. Czasami takie coś może się przydać jeśli inny skrypt tworzy obiekty i nie wiemy kiedy się pojawią.<br />
<br />
<pre class="js">var waitFor = function(obj, srcArr, fn, opt){
opt = opt || {t: 50};
(function callee(){
var tmp = obj;
var tid = setTimeout(callee, opt.t);
for (var i = 0; i < srcArr.length; ++i) {
if (typeof tmp[srcArr[i]] !== 'undefined') {
tmp = tmp[srcArr[i]];
} else {
return;
}
}
clearTimeout(tid);
fn(tmp, obj);
})();
};</pre>
Poniżej przykład użycia:
<pre class="js">waitFor(window, 'abc.def'.split('.'), function(data, obj){
alert('jest: ' + data);
});
setTimeout(function(){
window.abc = {};
setTimeout(function(){
window.abc.def = 'obiekt/dane';
}, 1e3);
}, 1e3);</pre>Grzegorz Kućmierzhttp://www.blogger.com/profile/05099605285045088669noreply@blogger.com0tag:blogger.com,1999:blog-1606583518894072496.post-50833883398058193312013-09-12T05:27:00.003+02:002013-09-12T05:27:26.884+02:00uruchamianie chrome script w oryginalnym windowJak wiadomo w rozszerzeniach google chrome, kiedy chcemy użyć obiektu window i wykonać interakcję z istniejącymi skryptami na stronie, lub zostawić dostęp do funkcji tak aby była widoczna z konsoli mamy mocno utrudnione zadanie ponieważ przeglądarka tworzy specjalnie dla skryptu nowy wirtualny obiekt window.<br />
<br />
Poniżej stworzyłem kawałek kodu - hack, który pozwala na wykonanie naszego userscript w oryginalnym scope.<br />
Może da się to zrobić jakoś lepiej. Zapraszam do komentowania.<br />
<br />
<pre class="js">"use strict";
(function main(w){
if (chrome.extension) {
var s = document.createElement('script');
s.src = 'data:text/javascript;base64,' + btoa('('+main.toString()+')(window);');
document.getElementsByTagName('head')[0].appendChild(s);
return;
}
w.test = "ta zmienna powinna byc widoczna z konsoli";
})(window);</pre>Grzegorz Kućmierzhttp://www.blogger.com/profile/05099605285045088669noreply@blogger.com0tag:blogger.com,1999:blog-1606583518894072496.post-74025964759611255282013-09-11T22:53:00.001+02:002013-09-11T22:54:12.727+02:00Skrót do szybkiego blokowania ekranu na macuPo wielu poszukiwaniach udało mi się wreszcie znaleźć skrót, taki który blokuje ekran (wymaga hasła aby dostać się do systemu), ale nie wyłącza działających aplikacji.<br />
<br />
Wcześniej korzystałem z komendy suspend:<br />
<pre class="bash">suspend () {
/System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession -suspend
}</pre><br />
Ale po jej uruchomieniu itunes się wyłączał.<br />
<br />
Teraz korzystam ze skrótu <b>control + shift + eject</b><br />
Przy czym należy w preferencjach prywatności wybrać odpowiednią opcję:<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7D8EtdjLaVyLKcLVdu29ccPKhRkzN_Tl-vTY5bqBbvHw_1rHvknk1j8PkuB44wQ8mmtyQa2u5KhlwKR4VOJJMhEFSyIamfmE4WkXmO891QjS_y-ryLRA9WRc2LilmlGvoJdBwNEJdymY/s1600/Zrzut+ekranu+2013-09-11+o+22.08.57.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7D8EtdjLaVyLKcLVdu29ccPKhRkzN_Tl-vTY5bqBbvHw_1rHvknk1j8PkuB44wQ8mmtyQa2u5KhlwKR4VOJJMhEFSyIamfmE4WkXmO891QjS_y-ryLRA9WRc2LilmlGvoJdBwNEJdymY/s320/Zrzut+ekranu+2013-09-11+o+22.08.57.png" /></a>Grzegorz Kućmierzhttp://www.blogger.com/profile/05099605285045088669noreply@blogger.com0tag:blogger.com,1999:blog-1606583518894072496.post-13601597685927315832013-08-26T19:04:00.001+02:002013-09-11T23:01:00.211+02:00Dane z blockchainaPoza transakcjami bitcoin w blockchain mogą być zawarte dowolne dane przez wykopujących bloki.<br />
<pre>EThe Times 03/Jan/2009 Chancellor on brink of second bailout for banks</pre><br />
Poniższa komenda bash pozwala podejrzeć wszystkie aktualne dane zawarte w blokach.<br />
<pre>for f in .bitcoin/blocks/blk*.dat; do echo -e "\n$f:"; strings -n 20 $f; done</pre><br />
Dla macos:<br />
<pre>for f in ~/Library/Application\ Support/Bitcoin/blocks/blk*.dat; do echo -e "\n$f:"; strings -n 20 "$f"; done</pre><br />
<a href="http://pastebin.com/viRdMbAa">http://pastebin.com/viRdMbAa</a>Grzegorz Kućmierzhttp://www.blogger.com/profile/05099605285045088669noreply@blogger.com0tag:blogger.com,1999:blog-1606583518894072496.post-66179865484505930122013-02-10T14:51:00.001+01:002013-02-10T14:51:59.514+01:00Odblokowanie prawego klawisza myszyNiektóre strony blokują prawy klawisz myszy w dokumencie. Przykładowy, kod który to realizuje znajduje się pod adresem <a href="http://pastebin.com/jyKeaZpZ" rel="nofollow">pastebin.com/jyKeaZpZ</a>.<br />
<br />
Aby sobie z tym poradzić bez wyłączania JavaScript wystarczy wkleić poniższy kod do paska adresu.<br />
<br />
<pre>javascript:document.oncontextmenu=function(){};</pre>Grzegorz Kućmierzhttp://www.blogger.com/profile/05099605285045088669noreply@blogger.com0tag:blogger.com,1999:blog-1606583518894072496.post-20353961558993799782013-02-06T18:03:00.000+01:002013-09-26T18:28:57.190+02:00Global scopePrzydatne do sprawdzania co jest w przeglądarce. Co zostało dodane przez skrypty a nie jest natywnym elementem JavaScript`u czy DOM.<br />
<br />
<pre>(function(){
var w = window.open('about:blank');
var res = [];
for( var i in window ){
if( typeof w[i] === 'undefined' ){
res.push(i);
}
}
w.close();
return res;
})().join('\n');
</pre>Grzegorz Kućmierzhttp://www.blogger.com/profile/05099605285045088669noreply@blogger.com0tag:blogger.com,1999:blog-1606583518894072496.post-6928649580318682042013-01-23T10:40:00.002+01:002013-01-23T10:44:43.060+01:00odpowiednik htmlspecialchars w jsOdpowiednik funkcji htmlspecialchars znanej z PHP.
<pre>var htmlspecialchars = function(html){
return [
[/&/g, '&amp;'],
[/</g, '&lt;'],
[/>/g, '&gt;'],
[/"/g, '&quot;'],
[/'/g, '&#39;']
].reduce(function(h, r){
return h.replace(r[0], r[1]);
}, html);
};</pre>
Funkcja przydatna np. do umieszczania kodu na tym blogu. Przykład użycia:
<pre>
prompt('skopiuj kod HTML', htmlspecialchars(prompt('podaj kod HTML')));
</pre>Grzegorz Kućmierzhttp://www.blogger.com/profile/05099605285045088669noreply@blogger.com0tag:blogger.com,1999:blog-1606583518894072496.post-79048852307146225882013-01-21T02:18:00.001+01:002013-01-23T10:25:21.932+01:00Binary - operacje na bitachFunkcja upraszczająca operacje na bitach w JavaScript.
<pre>var Binary = function(val){
val = val || 0;
return {
value: function(v){
if( typeof v === 'undefined' )
return val;
val = v;
},
bit: function(n, v){
if( typeof v === 'undefined' )
return val & (1<<n) ? 1 : 0;
if( v ){
val |= 1<<n;
}else{
val &= ~(1<<n);
}
},
toString: function(){
return val.toString(2);
}
};
};</pre>
Warto pamiętać, że operacje bitowe w JavaScript są powolne, ponieważ JavaScript przechowuje wszystkie liczby (Number) jako double. W związku z tym każda operacja bitowa (przesunięcie bitowe, suma bitowa czy iloczyn bitowy) wymusza konwersję double na int.
<pre>
// utworz nowa wartosc 5
var b = new Binary(5);
// odczytaj drugi bit
console.log(b.bit(2));
// ustaw pierwszy bit na 1
b.bit(1, true);
// odczytaj wartosc liczbowa
console.log(b.value());
</pre>
Grzegorz Kućmierzhttp://www.blogger.com/profile/05099605285045088669noreply@blogger.com0tag:blogger.com,1999:blog-1606583518894072496.post-67983585658779106432013-01-05T16:59:00.002+01:002013-01-23T10:25:58.054+01:00getForm oraz getFormInputsDwie przydatne funkcje przy sprawdzaniu pól formularza na stronie.
Pierwsza funkcja getForm wyszukuje formularz zawierający podany jako argument element.
<pre>
var getForm = function(htmlObj){
return htmlObj.form || (function callee(o){
return o.tagName === 'FORM' ? o : o.parentNode && callee(o.parentNode);
})(htmlObj);
};
</pre>
Kolejna funkcja getFormInputs znajduje wszystkie pola wysyłane do serwera. Zwraca obiekt z kluczami zawierającymi name pola oraz im odpowiadającymi wartościami zawierającymi value pola.
<pre>
var getFormInputs = function(form){
var res = {};
[].concat(
[].slice.call(document.getElementsByTagName('textarea')),
[].slice.call(document.getElementsByTagName('input'))
).map(function(obj){
if( typeof obj.name !== 'undefined' ){
res[obj.name] = obj.value;
}
});
return res;
};
</pre>Grzegorz Kućmierzhttp://www.blogger.com/profile/05099605285045088669noreply@blogger.com0tag:blogger.com,1999:blog-1606583518894072496.post-79207100841429066002012-12-28T20:21:00.000+01:002013-01-23T10:26:19.854+01:00Breakpoint jsBreakpoint - przydatna funkcja do przerywania asynchronicznego kodu.
Wymaga obecności DOM (Document Object Model). Tworzy w nim przycisk, który umożliwia ręczne wywołanie zatrzymanych fragmentów kodu. Funkcja pozwala sprawnie śledzić błędy w ekstremalnych warunkach :)
<pre>var Breakpoint = (function(doc){
doc = doc || document;
var fns = [];
var btn = doc.createElement('button');
btn.innerHTML = 'Breakpoint';
btn.addEventListener('click', function(e){
fns.shift().call();
update();
});
doc.body.appendChild(btn);
var update = function(){
btn.disabled = !fns.length;
};
update();
return {
add: function(fn){
fns.push(fn);
update();
}
};
})();</pre>
Przykład użycia:
<pre>// bez Breakpoint:
var test = function(){
// czynnosc A
// czynnosc B
};
// to samo z Breakpoint:
var test = function(){
// czynnosc A
Breakpoint.add(function(){
// czynnosc B
});
};</pre>Grzegorz Kućmierzhttp://www.blogger.com/profile/05099605285045088669noreply@blogger.com0tag:blogger.com,1999:blog-1606583518894072496.post-12997003647271815622012-09-28T15:54:00.003+02:002013-01-23T10:45:25.702+01:00LIFE, THE UNIVERSE, AND EVERYTHING<pre>#include <stdio.h>
int main(){
int i;
while( 1 ){
scanf("%d", &i);
if( i == 42 )
break;
printf("%d\n", i);
}
return 0;
}</pre>Grzegorz Kućmierzhttp://www.blogger.com/profile/05099605285045088669noreply@blogger.com0tag:blogger.com,1999:blog-1606583518894072496.post-31088555810966443962012-03-03T10:10:00.003+01:002018-12-13T07:17:46.235+01:00Array unique - czyli pozbywamy się duplikatówFunkcja jako argument przyjmuje tablicę z danymi dowolnego typu. W rezultacie funkcja zwraca tablicę zawierającą tylko unikalne elementy tablicy źródłowej. <pre>var unique = function(arr){
return arr.filter(function(el, i){
return arr.indexOf(el, i+1) === -1;
});
};</pre>Poniżej zamieszczam funkcję robiącą to samo co powyższa funkcja z drobnym wyjątkiem. Poniższa funkcja zawiera dwa dodatkowe wykonania funkcji reverse co pozwoliło na zachowanie naturalnej kolejności elementów występujących w tablicy. Pierwsze wystąpienie danego elementu pozostaje w tym samym miejscu, kolejne wystąpienia tego samego elementu są ignorowane. W poprzedniej wersji funkcji to ostatni element zostałby zachowany. <pre>var unique = function(arr){
return arr.reverse().filter(function(el, i){
return arr.indexOf(el, i+1) === -1;
}).reverse();
};</pre><br />
<pre>let unique = [...new Set(myArray)];
</pre>Grzegorz Kućmierzhttp://www.blogger.com/profile/05099605285045088669noreply@blogger.com0tag:blogger.com,1999:blog-1606583518894072496.post-13267967288231236452012-02-22T00:45:00.001+01:002012-02-22T04:00:38.421+01:00getType - sprawdzenie typu, pewniejsze od typeofPoniżej zamieszczam funkcję zwracającą typ danej. Funkcja w przeciwieństwie do operatora typeof znacznie skuteczniej oddaje typ przekazanej danej. Pomysł został zaczerpnięty z serwisu <a href="http://bonsaiden.github.com/JavaScript-Garden/pl/">JavaScript Garden</a>. Funkcja do sprawdzenia typu wykorzystuje generyczną funkcję toString podstawowego obiektu.
<pre>var getType = function(obj){
return ({}).toString.call(obj).slice(8, -1);
};</pre>
Poniżej szybkie sprawdzenie różnic funkcji getType oraz operatora typeof. Pomaga on uświadomić sobie, z jakimi problemami mamy do czynienia, jeśli używamy operatora typeof.
<pre>[{}, [], '', 0, 1/0, false, function(){}, /./, null, undefined].map(function(obj){
return [getType(obj), typeof obj];
});</pre>
Tak naprawdę operator typeof JavaScriptu ma tylko jedno uzasadnione zastosowanie.
<pre>typeof variable === 'undefined';</pre>Grzegorz Kućmierzhttp://www.blogger.com/profile/05099605285045088669noreply@blogger.com0tag:blogger.com,1999:blog-1606583518894072496.post-82690082095740710852012-02-14T19:44:00.000+01:002012-02-14T19:44:44.758+01:00Object each - iteracja po obiekciePoniżej zamieszczam bardzo przydatną funkcję pozwalającą w prosty sposób iterować po obiekcie.
<pre>var each = function(obj, fn){
var res = {};
for( var i in obj ){
if( obj.hasOwnProperty(i) ){
res[i] = fn.call(obj, obj[i], i);
}
}
return res;
};</pre>
Przykład zastosowania:
<pre>each({
name: 'Grzegorz',
job: 'web developer',
website: 'gkucmierz.blogspot.com'
}, function(value, key){
alert([key, ': ', value].join(''));
});</pre>Grzegorz Kućmierzhttp://www.blogger.com/profile/05099605285045088669noreply@blogger.com0tag:blogger.com,1999:blog-1606583518894072496.post-58497153709131573502012-02-13T02:01:00.002+01:002012-02-13T02:01:40.614+01:00Twoja przeglądarka nie obsługuje JavaScriptPrzeglądając kod źródłowy pewnej strony natknąłem się na ciekawy kawałek kodu. Na szczególną uwagę zasługuje linijka 902 :)
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9Dwfeb1f90Uyw3GU39xsKnrCUo3Ku5cFObt0ZsnAu_rzS6cHxAb7G7kerp8IdiIuBCQRiPfBKjl5YZ0KHEfRGRewFtt5qzd8Jp_2XO5Ma-mKGgNfiXmAZWFBiLGKVZtrJtFwtkrZxyi4/s1600/Zrzut+ekranu+2012-02-13+o+01.56.28.png" imageanchor="1" style=""><img border="0" height="136" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9Dwfeb1f90Uyw3GU39xsKnrCUo3Ku5cFObt0ZsnAu_rzS6cHxAb7G7kerp8IdiIuBCQRiPfBKjl5YZ0KHEfRGRewFtt5qzd8Jp_2XO5Ma-mKGgNfiXmAZWFBiLGKVZtrJtFwtkrZxyi4/s400/Zrzut+ekranu+2012-02-13+o+01.56.28.png" /></a></div>Grzegorz Kućmierzhttp://www.blogger.com/profile/05099605285045088669noreply@blogger.com0tag:blogger.com,1999:blog-1606583518894072496.post-21507327667858547202012-02-11T16:50:00.001+01:002014-06-30T15:59:35.857+02:00Array shuffleImplementacja funkcji mieszającej elementy tablicy w języku JavaScript. <pre>Array.prototype.shuffle = function(){
return this.sort(function(){
return Math.random() - 0.5;
});
};</pre>Przykład użycia: <pre>[1, 2, 3].shuffle();</pre>Poniżej inna implementacja bez użycia prototypów. <pre>var shuffle = function(arr){
return arr.sort(function(){
return Math.random() - 0.5;
});
};</pre>Grzegorz Kućmierzhttp://www.blogger.com/profile/05099605285045088669noreply@blogger.com0tag:blogger.com,1999:blog-1606583518894072496.post-28348814855373485892012-02-10T01:45:00.001+01:002012-02-10T03:24:55.968+01:00Pobranie treści strony przy pomocy XMLHttpRequestPoniższa funkcja pozwala pobrać treść podstrony przy pomocy JavaScript.
<pre>var get = function(url, fn){
var xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.onabort = xhr.onerror = function(){
fn(false);
};
xhr.onreadystatechange = function(resp){
if( xhr.readyState === 4 ){
fn(resp.target.responseText, resp);
}
};
xhr.send();
};</pre>Grzegorz Kućmierzhttp://www.blogger.com/profile/05099605285045088669noreply@blogger.com0tag:blogger.com,1999:blog-1606583518894072496.post-31899247980623528062012-02-03T19:42:00.000+01:002012-02-03T19:45:13.681+01:00Kliknięcie w dowolny element HTML przy pomocy jsPoniższa funkcja pozwala na kliknięcie w dowolny obiekt HTML przy pomocy JavaScript, niemal identycznie jak gdyby to zrobił użytkownik.
<pre>var click = function(htmlElement){
var evt = document.createEvent('MouseEvents');
evt.initMouseEvent('click');
htmlElement.dispatchEvent(evt);
};</pre>
W podobny sposób można oczywiście wywoływać wszystkie inne możliwe zdarzenia.Grzegorz Kućmierzhttp://www.blogger.com/profile/05099605285045088669noreply@blogger.com0