Wojciech Mazurek

Wojciech Mazurek właściciel, PPHU
Neuron

Temat: odswiezenie grafiki dopiero po jej pobraniu

witam
moj program ma wbudowany serwer. Program generuje grafike wykres.jpg
i przygotowuje odpowiedz dla zapytania get_wykres
o tresci <img src="wykres.jpg?83748738">
( ta liczba jest generowana przypadkowo po kazdej modyfikacji wykresu i zalatwia mi keszowanie gobrazka przez przegladarke - bez tego niewazne jakie sa ustawiania mata - i tak przegladarka keszuje wykres)

W glownym pliku html projektu mam funkcje load z jQuery ktora wywolywana w timerze co jakis czas w sekcji div wstawia wynik zaptyania get_wykres
czyli pobiera i wyswietla plik wykres.jpg

Jestem strasznie w tym cienki (programuje aplikacje desktopowe a to ma byc dodatek do jednej z nich) ale jakos udalo mi sie podstawie roznych przykladow toto posakladac.

Pozostal mi jeszcze jeden problem ktorego ni jak nie potrafie ugryzc
Kiedy funkcja load sciaga z serwera obrazek wykres to na chwile (na czas sciagania) on znika
Jak rozwiazac ten problem ? Czy da sie jakos pozostawic zawartosc sekcji do ktorej sciagany jest obrazek az nadejdzie nowy, albo sciagnac go do zmiennej i podmienic albo sam nie wiem co ;)

moj skrypt ktory mam teraz:
<script type="text/javascript"
src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<script type="text/javascript">
$.ajaxSetup({ cache : false});
$(document).ready(function() {
$("#grafika1").load("get_wykres");
}
);

setInterval(function() {
$("#grafika1").load("get_wykres");
}, 4000);
</script>

jakis kod html ...
<div id="grafika1"></div>

konto usunięte

Temat: odswiezenie grafiki dopiero po jej pobraniu

Jeżeli mamy
<img id="grafika" src="wykres.jpg?48695">


to robimy coś takiego w javascript:

var img = new Image();
img.src="wykres.jpg";
img.onload = function() {
$('#grafika').src = img.src;
}


Coś w tym stylu. Ogólnie działa to tak że Javascript najpierw ładuje obrazek a jak już się załaduje to zmieniając atrybut SRC elementu IMG odświeża go.
Ta sama metoda jest używana do dynamicznego ładowania obrazków na stronach. Tzn jeżeli grafiki zajmują za dużo miejsca (google image jest tu przykładem) to są one ładowane dynamicznie już po wyświetleniu strony.

Ty robisz to samo. Ładujesz obrazek gdy już nadchodzi czas ale podmieniasz go dopiero jak jest on załadowany. Przeglądarka powinna zrobić to błyskawicznie więc nikt nic nie zauważy.

Osobiście radził bym Ci rysować same wykresy bezpośrednio na stronie. Oto 75 gotowych sposobów do pokazania wykresu na stronie:

http://www.tripwiremagazine.com/2009/12/70-tools-for-v...

PozdrawiamDariusz Półtorak edytował(a) ten post dnia 01.11.11 o godzinie 22:20

konto usunięte

Temat: odswiezenie grafiki dopiero po jej pobraniu

Proponuję najpierw podpiąć event, potem zmienić source.
Wojciech Mazurek

Wojciech Mazurek właściciel, PPHU
Neuron

Temat: odswiezenie grafiki dopiero po jej pobraniu

Dariusz Półtorak:
Jeżeli mamy
<img id="grafika" src="wykres.jpg?48695">


to robimy coś takiego w javascript:

var img = new Image();
img.src="wykres.jpg";
img.onload = function() {
$('#grafika').src = img.src;
}

Musze prosic o pomoc - nie bardzo wiem jak to zastosowac
Probowalem zmodyfikowac moj kod tak

var img = new Image();

setInterval(function() {
img.src="wykres.jpg";
img.onload = function() {
$('#grafika1').src = img.src;
}

}, 4000);

w body
<img id="grafika1" src= >

ale mi to nie dziala - widze ze sciaga z serwera grafike ale nie mam zadnego efektu. Probowalem kilku innych kombinacji ale wtedy procedura wewnatrz
SetInterval wywolywana jest tylko raz - oczywiscie bez efektu.

Sory za beginerskie pytania ale na codzien pisze w obiektpascalu i jeszcze nie do konca lapie sama strukture programu w js - wszytsko co dotad robilem w tym temacie to bylo na zasadzie copy paste ;)
Wiec jakby kolega mial tyle cierpliwosci aby napisac mi caly kompletny kod zakadajac ze informacja o grafice zwracana jest z zapytania get_wykres
( tak jak tu $("#grafika1").load("get_wykres");, mysle ze bedzie to odpowiednik zapytania do skryptu php choc ja to robie bezposrednio w kodzie mojego serwera ) ktore zwraca <img src="wykres.jpg?3324">
moze tez zwracac sam link:wykres.jpg?3324,
to bylbym wdzieczny.

Nurtuje mnie np pytanie czy zmienna var img = new Image();
powinna byc tak jak mam czy powinna byc wewnatrz setInterval, nie wiem czy w js jest pojecie zmienna lokalna zmienna globalna.


Osobiście radził bym Ci rysować same wykresy bezpośrednio na stronie. Oto 75 gotowych sposobów do pokazania wykresu na stronie:

http://www.tripwiremagazine.com/2009/12/70-tools-for-v...
To nie jest zwykly wykres.

pozdrawiam i dziekuje ;)

konto usunięte

Temat: odswiezenie grafiki dopiero po jej pobraniu

Złożyłem na szybko małe demko. To obrazek którym się posłużyłem (na potrzeby testu):

plik img.php

<?php

$pass = date('H:s');

$width = 100;
$height = 20;

$image = ImageCreate($width, $height);

$white = ImageColorAllocate($image, 255, 255, 255);
$black = ImageColorAllocate($image, 0, 0, 0);
$grey = ImageColorAllocate($image, 204, 204, 204);

ImageFill($image, 0, 0, $black);

ImageString($image, 3, 30, 3, $pass, $white);

header("Content-Type: image/jpeg");

ImageJpeg($image);

ImageDestroy($image);


Za każdym razem jak go wywołujesz, generuje obrazek z aktualną godziną. Żeby było jasno widać że się odświeża. A tak wygląda cały dokument HTML:


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Demo</title>
<script type="text/javascript" src="jquery.js"></script>
</head>
<body>
<img src="img.php" id="grafika" alt="zegar">
<script type="text/javascript">
var img = new Image();
$("document").ready(function(){
img.onload = function(){
$('#grafika').attr('src', img.src);
}
setInterval("get_image()", 4000);
});
function get_image() {
img.src = "img.php?"+(new Date).getTime(); }
</script>
</body>
</html>


To co pokazałem to był przykład. Myślałem że już będzie jasne no ale skoro w JavaScript nie siedzisz to masz całość. To że nie byłem zbyt dokładny na pewno nie pomogło. Ogólnie działa to tak:

1. tworzymy obiekt img który będzie ładował nasz obrazek
2. ustawiamy funkcję na onload na nim. Zostanie ona wykonana za każdym razem gdy obrazek się załaduje. Wszystko co robi to zmienia atrybut SRC. Wykorzystałem jQuery z uwagi na to że z niego korzystasz. Samo
document.getElementById('grafika').src = img.src;
też będzie.
3. co 4 sekundy zmieniamy źródło obrazka. Z uwagi że adres jest taki sam dokładamy timestamp żeby url był unikatowy. To na wypadek gdyby cache nie odświeżał obrazka.
4. cieszymy się efektem. Obrazek powinien być podmieniany tylko kiedy się załaduje - co 4 sekundy.

Jak by coś nie grało to tu jest demo:
http://dariuszp.pl/rimg/Dariusz Półtorak edytował(a) ten post dnia 02.11.11 o godzinie 08:07
Wojciech Mazurek

Wojciech Mazurek właściciel, PPHU
Neuron

Temat: odswiezenie grafiki dopiero po jej pobraniu

Dariusz Półtorak:
Złożyłem na szybko małe demko.
Wielkie dzieki ;)
Wieczorem bede sie bawil. Generalnie to postanowilem jednak sie zaprzyjaznic z js i jquery. Dotad traktowalem js jako lightowa pomoc przy tworzeniu wlasnej strony a aplikacje dzialjace w przegladarkach www traktowalem z rezerwa (szczegolnie robienie troche na sile calych aplikacji) ale widze ze usupelnienie mojego softu o funkcjonalnosci dostepne via przegladarki ma sens ;)

jeszcze raz dziekuje
wojtek

konto usunięte

Temat: odswiezenie grafiki dopiero po jej pobraniu

Wojciech Mazurek:
Dariusz Półtorak:
Złożyłem na szybko małe demko.
Wielkie dzieki ;)
Wieczorem bede sie bawil. Generalnie to postanowilem jednak sie zaprzyjaznic z js i jquery. Dotad traktowalem js jako lightowa pomoc przy tworzeniu wlasnej strony a aplikacje dzialjace w przegladarkach www traktowalem z rezerwa (szczegolnie robienie troche na sile calych aplikacji) ale widze ze usupelnienie mojego softu o funkcjonalnosci dostepne via przegladarki ma sens ;)

jeszcze raz dziekuje
wojtek

Zanim zaczniesz bawić się jQuery, radzę nauczyć się JavaScript. jQuery to bardzo fajne narzędzie które często jest niefajnie wykorzystywane. Dlatego warto wiedzieć jak działają mechanizmy które siedzą pod spodem.

konto usunięte

Temat: odswiezenie grafiki dopiero po jej pobraniu

Proponuję najpierw podpiąć event, potem zmienić source.
Co do zasady masz rację, ale czy JavaScript będąc jednowątkową nie gwarantuje, że kod i tak wykona się synchronicznie do końca funkcji?

Pytam aby upewnić się co do zasady działania JS.
Wojciech Mazurek

Wojciech Mazurek właściciel, PPHU
Neuron

Temat: odswiezenie grafiki dopiero po jej pobraniu

Dariusz Półtorak:

Zanim zaczniesz bawić się jQuery, radzę nauczyć się JavaScript. jQuery to bardzo fajne narzędzie które często jest niefajnie wykorzystywane. Dlatego warto wiedzieć jak działają mechanizmy które siedzą pod spodem.

Tu to kolega nie musi mnie przekonywac. Tak naprawde chodzi o zrobienie wizualizacji procesow w przegladarce ale bez zadnych pluginow (z tego co sie zdazylem zorientowac profesjonalne pakiety dzialaja tak ze producent dostarcza odpowiednie pluginy np w javie i wtedy ladnie i pieknie nam sie na ekranie rysuja trendy, zegary ledy i inne tego typu bajery)
Przez kilkanascie godzin probowalem posklejac testowa aplikacje z czego sie dalo aby sie przekonac czy sie wogole da.
Jesli uda mi sie uzyskac jakikolwiek zadawalajacy efekt to oczywiscie zaczne od doksztalcenia sie w js bo jak na razie DOM to dla mnie budynek mieszkalny a ajax to plyn do zmywania ;)

Co do jQery - od wielu lat programuje w delphi i wiem jak "przyjazne" srodowiska programistyczne potrafia czlowieka zmalpic ;))))

konto usunięte

Temat: odswiezenie grafiki dopiero po jej pobraniu

Wojciech Mazurek:
Dariusz Półtorak:

Zanim zaczniesz bawić się jQuery, radzę nauczyć się JavaScript. jQuery to bardzo fajne narzędzie które często jest niefajnie wykorzystywane. Dlatego warto wiedzieć jak działają mechanizmy które siedzą pod spodem.

Tu to kolega nie musi mnie przekonywac. Tak naprawde chodzi o zrobienie wizualizacji procesow w przegladarce ale bez zadnych pluginow (z tego co sie zdazylem zorientowac profesjonalne pakiety dzialaja tak ze producent dostarcza odpowiednie pluginy np w javie i wtedy ladnie i pieknie nam sie na ekranie rysuja trendy, zegary ledy i inne tego typu bajery)
Przez kilkanascie godzin probowalem posklejac testowa aplikacje z czego sie dalo aby sie przekonac czy sie wogole da.
Jesli uda mi sie uzyskac jakikolwiek zadawalajacy efekt to oczywiscie zaczne od doksztalcenia sie w js bo jak na razie DOM to dla mnie budynek mieszkalny a ajax to plyn do zmywania ;)

Co do jQery - od wielu lat programuje w delphi i wiem jak "przyjazne" srodowiska programistyczne potrafia czlowieka zmalpic ;))))

Zawsze można pomyśleć nad stworzeniem własnych narzędzi. Później nie dość że sami je możemy wykorzystywać to możemy je próbować odsprzedać dalej dla dodatkowych zysków.
Jeżeli nie jesteście jakoś ograniczeni do starych przeglądarek (zwłaszcza IE) to można się pokusić o wykonanie wizualizacji np w canvas. I tak dzięki temu są one łatwe do zmodyfikowania, szybkie, responsywne i na dodatek wszystko odbywa się po stronie klienta więc nie katujecie serwera generowaniem coraz to nowych obrazków.

Ot taki przykład (prosty i paskudny ale przykład):
http://dariuszp.pl/canvas/

W źródle jest cały kod potrzebny do narysowania i animacji tego. Na upartego jak w tym wypadku nie trzeba nawet grafik.

Robi się kilka takich elementów (wskaźniki, przełączniki, zegary itp) a potem składa się to na stronie WWW.

konto usunięte

Temat: odswiezenie grafiki dopiero po jej pobraniu

maciek kański:
Proponuję najpierw podpiąć event, potem zmienić source.
Co do zasady masz rację, ale czy JavaScript będąc jednowątkową nie gwarantuje, że kod i tak wykona się synchronicznie do końca funkcji?

Pytam aby upewnić się co do zasady działania JS.

Kod się wykona, hadler się podepnie, ale jest szansa, że sam event wystartuje zbyt wcześnie (np obrazek pójdzie z keszu?) i x-wątkowość javascriptu nie ma tu chyba nic do rzeczy.

konto usunięte

Temat: odswiezenie grafiki dopiero po jej pobraniu

rafał krupiński:
(...) ale jest szansa, że sam event wystartuje zbyt wcześnie (...)
Na pewno? Bardzo proszę o potwierdzenie, nie zgadywanie, w jakich okolicznościach byłoby to możliwe w tym konkretnym przypadku.

Moim zdaniem funkcja wykona się do końca (o ile nie będzie wstawki typu window.alert, setTimeout) - jeżeli ktoś zna proszę o linka np. do materiałów.
Piotr Koszuliński

Piotr Koszuliński JavaScript ninja

Temat: odswiezenie grafiki dopiero po jej pobraniu

maciek kański:
rafał krupiński:
(...) ale jest szansa, że sam event wystartuje zbyt wcześnie (...)
Na pewno? Bardzo proszę o potwierdzenie, nie zgadywanie, w jakich okolicznościach byłoby to możliwe w tym konkretnym przypadku.

Moim zdaniem funkcja wykona się do końca (o ile nie będzie wstawki typu window.alert, setTimeout) - jeżeli ktoś zna proszę o linka np. do materiałów.

Bardzo ciekawe pytanie i... nie mogę znaleźć na nie odpowiedzi. Z jednej strony mamy ciągłość jednego wątku, z drugiej jednak samo dodawanie callbacków eventów do event loopa jest z założenia obsługiwane w osobnym wątku. Tak więc na mój gust i według mojego stanu wiedzy nie ma żadnej zasady, która by zapewniła Cię, że event nie zostanie odpalony nim zdążysz przypisać callback, który by go obsłużył. Jedyne czego możesz być oczywiście pewien, to że callback nie zostanie wykonany w trakcie trwania innego kodu. Callback eventa zawsze trafia na koniec event loopa. Czyli w przypadku tego pytania http://stackoverflow.com/questions/7552629/can-onload-... zawsze to będzie AAAAAAAAB. Aż dziw, że nikt nie był pewien na SO poprawnej odpowiedzi.

Jest jeszcze jedna sprawa - przeglądarki sobie cache'ują operacje na DOM-ie i wykonują je dopiero kiedy muszą (jakieś wymuszenie reflowu). Możliwe, że w tym wypadku cache'owanie też ma zastosowanie i przeglądarka najpierw wykona cały kod do końca, a później dopiero weźmie się za obsługę tego co związane z DOM-em.

Osobiście bym obstawiał, że wszystko się może zdarzyć i, że wynik może być zależny od przeglądarki. Sam onload dla img jest w ogóle bardzo niepewny - http://api.jquery.com/load-event/ (box Caveats), a obsługiwanie onload po zmianie src to tylko dokładanie do pieca :P Aczkolwiek z testów na szybko - Fx i Chrome wywołują callback i tego zachowania spodziewałbym się we wszystkich nowszych przeglądarkach. Dowodów jednak (na razie :P) nie mam.
Piotr Koszuliński

Piotr Koszuliński JavaScript ninja

Temat: odswiezenie grafiki dopiero po jej pobraniu

Z ciekawości jeszcze przetestowałem taki kod:

var i = new Image(), j = 0; i.src = 'http://code42.pl/wp-content/uploads/middleend.png'; while(j < 1e6) j++; i.onload = alert.bind(null, 666);

Alert wyświetla mi się w Chrome i Fx zawsze - niezależnie czy obrazek już idzie z cache'a, czy nie. A przypisanie onloada wykonywane jest po 1e6 iteracjach (0.2s w Chrome, 1s w Fx), więc sporo później.

Tak więc w tych przeglądarkach na pewno nawet handlowanie samego eventa czeka w kolejce. W innych trzeba by było przetestować.
Wojciech Mazurek

Wojciech Mazurek właściciel, PPHU
Neuron

Temat: odswiezenie grafiki dopiero po jej pobraniu

maciek kański:
Proponuję najpierw podpiąć event, potem zmienić source.
Co do zasady masz rację, ale czy JavaScript będąc jednowątkową nie gwarantuje, że kod i tak wykona się synchronicznie do końca funkcji?

Pytam aby upewnić się co do zasady działania JS.
Jednowatkowosc aplikacji nie zawsze gwarantuje ze kolejnosc realizowania zdarzen bedzie taka jak oczekujemy. Patrzac z punktu widzenia systemu operacyjnego kazdy event to komunikat ktory zostaje wyslany do okna glownego aplikacji przez system albo kontrolke tej aplikacji pod kontrola tegoz systemu

Nie wiem jak przegladarki realizuja skrypty i jak zarzadzanja kolejka komunikatow swoich okien ale jesli zrobimy prosta windosowa aplikacje
gdzie damy dwa butony i timer to mozemy zalozyc ze przyciskajac kolejno buttony 1 i 2 zostana wykonane kolejno zdarzenia onButton1 i onButton2 ale juz takie zalozenia sa ryzykowne z punktu widzenia timera
Bo co robi TTimer (setInterval) - mowi do systemu: za X czasu przyslij do kolejki mojego okna stosowny komunikat. Jak komunikat dotrze do kolejki to handler timera NAJPIERW wysle zadanie o nastepny komunikat a dopiero potem przejdzie do realizacji podpietego kodu.
Kiedys sie na tym przejechalem dlatego teraz w delphi jak uzywam ttimera to zawsze daje cos takiego

onTimer:
if flaga then exit
flaga := true
JAKIS KOD
flaga := false

bo pomimo tego ze jest tylko jeden watek to event timera potrafi sie wykonac rekurencyjnie jesli czas jego realizacji jest dluzszy niz interwal.
I blokada timera (nie sprawdzalem jeszcze ale pewnie setInterval tez ma zmianna wlacz/wylacz) nic tu nie daje bo ona blokuje wyslanie nastepnego zamowienia na komunikat ale nie blokuje tego ktory jest juz ZAMOWIONY

Generalnie to bym zacza zwracac uwage na tego typu sprawy bo ilosc rdzeni rosnie i stosujac jezyki skryptowe moze sie okazac ze cos co dziala dobrze dzis bedzie dzialac zle jutro bo przegladarka X.XX znajdzie kilka pracujacych luzem rdzeni i zacznie dzielic obsluge procesu na oddzielne watki aby bylo "szybciej" :)

konto usunięte

Temat: odswiezenie grafiki dopiero po jej pobraniu

Wojciech Mazurek:
Generalnie to bym zacza zwracac uwage na tego typu sprawy bo ilosc rdzeni rosnie i stosujac jezyki skryptowe moze sie okazac ze cos co dziala dobrze dzis bedzie dzialac zle jutro bo przegladarka X.XX znajdzie kilka pracujacych luzem rdzeni i zacznie dzielic obsluge procesu na oddzielne watki aby bylo "szybciej" :)
Ale w jaki sposób zwracać uwagę? O ile systemy operacyjne dają nam odpowiednie narzędzia do synchronizacji pracy wątków, o tyle nic takiego w JS nie występuje. Znaczy się, że nagle taki zapis x += 1; przestanie działać? Nie wierzę:)

Wprowadzenie wielowątkowości poprzez WebWorkery (w FF realnej) sprawia sprawę jasno: 100% izolacji między workerami, brak dostępu do DOMa - nie ma współdzielonego stanu, nie ma kłopotów i to jest chyba wskazówka.

P.S. W zapisie x += 1 zwracam uwagę, że x może - poprzez closure - być dostępne z jakiejś funkcji np. handlera zdarzenia onload; i właśnie na tej podstawie uważam, że JS gwarantuje, choć nieformalnie, że ciało funkcji wykona się do końca po to właśnie, aby nie było takich kwiatków.
Piotr Koszuliński

Piotr Koszuliński JavaScript ninja

Temat: odswiezenie grafiki dopiero po jej pobraniu

W JavaScriptcie sprawa jest jasna i nie ma dyskusji - jest jeden wątek przeznaczony na wykonywanie kodu. ŻADEN inny wątek nie może nam się wtrynić i zrobić bałaganu. Koniec kropka. Przeglądarki tego nie zmienią, bo to podstawowe założenie JavaScriptu i będzie to jasno określone w specyfikacji HTML5 web app apis (http://www.w3.org/TR/html5/webappapis.html#event-loops).

Co ciekawe nie potrafię podeprzeć specyfikacją tego, że ES jest z założenia jednowątkowy. Może więc nie przewidzieli na tym poziomie takiego ograniczenia...

W każdym razie, w JS-ie całość opiera się na event loopie, czyli kolejne zdispatchowane callbacki trafiają do kolejki i są wykonywane w takiej kolejności w jakiej przyszły (trochę uproszczenie, bo są jeszcze tasks listy wewnątrz event loopów). Jeden po drugim. Tyczy się to wszystkiego - timerów, ajaksa, geo lokalizacji, eventów DOM-owych itd.

Jeśli więc jakiś callback będzie ciężki i zajmie wątek na dłużej, to blokuje się wszystko - żaden inny kod się nie wykona. Stąd ważne wymaganie dla programistów, by pisać krótkie wątki i np. cięższe rozbijać do zapętlonych setTimeoutów. Dodatkowo wprowadzono WebWorkery, by umożliwić stworzenie osobnych wątków. Jednak tak jak Maciek napisał - WebWorkery mają w 100% odseparowany kontekst. Jedyna opcja komunikacji to przez sygnały, dzięki czemu nie ma typowych problemów jakie występują w wielowątkowych programach.

Oczywiście "backend" tej konstrukcji event-loopowej musi być wsparty już normalnymi wątkami, bo np. trzeba wrzucić do event loopa callback z jakiegoś timera. Jednak dzięki takiemu podejściu programista JS w ogóle nie musi się martwić co gdzie i jak mu się wykona. O wszystko martwi się przeglądarka bądź inne środowisko wykonawcze, bo tę samą konwencję przyjął np. twórca NodeJS-a.

BTW. gdyby koś interesowało jak działają timery, to ostatnio się trochę rozpisałem na ten temat w innym wątku - http://www.goldenline.pl/forum/2631962/jquery-animate-... Bo rzeczywiście interesujące jest jak zachowuje się setInterval w przypadku kiedy mamy jeden wątek, a wykonanie callbacków trwa dłużej niż ustalony interwał.
Wojciech Mazurek

Wojciech Mazurek właściciel, PPHU
Neuron

Temat: odswiezenie grafiki dopiero po jej pobraniu

maciek kański:
Ale w jaki sposób zwracać uwagę? O ile systemy operacyjne dają nam odpowiednie narzędzia do synchronizacji pracy wątków, o tyle nic takiego w JS nie występuje. Znaczy się, że nagle taki zapis x += 1; przestanie działać? Nie wierzę:)
Ciezko mi sprecyzowac bo jak napisalem we wstepie - stosowalem czasami js na zasadzie malpy w pracach przy mojej stronie ale tak na prawde ze zrozumieniem czytam o nim od kilku godzin ;)

Chodzilo mi jednak o to ze gdy tworzymy program w klasycznym sensie to nasze narzedzia generuja kod maszynowy dla procesora (albo emulacji procesora) ktory bedzie dziala pod kontrola systemu operacyjnego. System moze troche pomieszac np w priorytetach watkow, moze podmienic niektore funkcje api zmienajac w pewnym zakresie sposob dzialnia naszego programu ale nie moze postawic wszytskiego na glowie.

JS jest jednak jezykiem skryptowym. To jakis program ktory moze i powinien ale nie musi trzymac sie ustalonych regol go wykonuje.
Moze tez nagle zaczac egzekwowac regoly ktore byly ustalone ale nie do konca przestrzegane przez programiste(dobrym przykladem sa tu regoly dostepu do plikow - byly one zdefiniowane juz w XP ale nagle w Viscie staly sie obowiazujace - kto projektowal aplikacje niezgodnie z wytycznymi M$ ten sie nagle zdziwil )
Wracajac do przegladarki:
Moge sobie wyobrazic taka oto sytuacje ze programujacy przegladarke wymysla aby zrobic analize kodu do przozdu i sie do neigo dostosowac. Bo jesli src jednego obrazka sciagamy z sieci a nastepny ma isc z keszu to zal tracic czas - przeciez mozna to zrobic wspolbieznie.
W 98 procentach bedzie to dawalo jakis tam zysk i nikomu nie bedzie przeszkadzalo ale w tych 2% programista bedzie gral z nerwow hymn na brzytwie ;)
Mowiac o zwroceniu uwagi mialem nie na mysli wymyslanie jakis wlasnych wynalazkow ale unikanie tego co w tej chwili robie ja i na co zwracal w kontekscie jquery uwage kolega Dariusz - unikanie uzywania technik programowania na zasadzie malpy bez zrozumienia tego co sie dzieje pod maska ;)
Czy sie podepnie event przed pelnym zdefinowaniem obiektu czy po - dzis moze byc bez znaczenia a jutro juz nie - dzis interpreter dopusci konstrukcje ktora nie jest do koncza zgodna z konwencja bo mu to "wisi" jutro okaze sie ze w nowym modelu interpretacji ma znaczenie. Dobrze jak interpreter zasygnalizuje blad - ale na to bym raczej nie liczyl ;))
Piotr Koszuliński

Piotr Koszuliński JavaScript ninja

Temat: odswiezenie grafiki dopiero po jej pobraniu

Wojciech Mazurek:
Czy sie podepnie event przed pelnym zdefinowaniem obiektu czy po - dzis moze byc bez znaczenia a jutro juz nie - dzis interpreter dopusci konstrukcje ktora nie jest do koncza zgodna z konwencja bo mu to "wisi" jutro okaze sie ze w nowym modelu interpretacji ma znaczenie. Dobrze jak interpreter zasygnalizuje blad - ale na to bym raczej nie liczyl ;))

Do tego właśnie wcześniej biłem - jeśli to nie jest opisane w żadnej specyfikacji, to lepiej sobie nie strzelać w stopę i podpinać ten event przed zmianą src. Aczkolwiek tak jak pisałem - bardziej bym się spodziewał, że operacje DOM-owe się cache'ują, tyle że - no właśnie, pewnym być nie można ;>

BTW. zmieniając:
var i = new Image(), j = 0; i.src = 'http://code42.pl/wp-content/uploads/middleend.png'; while(j < 1e6) j++; i.onload = alert.bind(null, 666);

Na:
var i = new Image(), j = 0; i.src = 'http://code42.pl/wp-content/uploads/middleend.png'; alert('a'); i.onload = alert.bind(null, 666);

Pozbawiamy się wykonania callbacka. To ciekawy test, bo mimo że wątek jest wstrzymany (alert jest synchroniczny) to event jest dispatchowany. Czyli widać, że taka sytuacja jest możliwa.
Wojciech Mazurek

Wojciech Mazurek właściciel, PPHU
Neuron

Temat: odswiezenie grafiki dopiero po jej pobraniu

Dariusz Półtorak:
Złożyłem na szybko małe demko. To obrazek którym się posłużyłem (na potrzeby testu):
Troche sie nawalczylem z kolegi demem - moj serwer nie obsluguje php
samodzienie przetwaza zapytanie i odsyla odpowiedz wiec musialem zrobic $.GET

Wyglada to mniej wiecej tak

var img = new Image();
var s;
$(document).ready(function() {
s ='';
img.onload = function() { $("#grafika13").attr('src', img.src); }
});

setInterval(function() {
$.get('get_wykres', function(data) {
s=data });
img.src=s;
}, 3000);

I dziala tak jak chcialem ;)
Zamowilem dwie cegly o js i jquery i bede cwiczyl dalej.
Mam jeszcze pytanie o zmienne i budowe funkcji

Powiedzmy ze mam kilka takich grafik wiec dobrze bylo by zrobic dwie funkcje - jedna ktora zainicjuje element graficzny a druga ktora pobierze dane i przeladuje obiekt graficzny

powiedzmy ze many zmienne var img1, img2 img3

w pascalu aby przekazac zmienna globalna robi sie
function XXX (var jakas_zmienna_globalna:Timage , jakas_zmienna_dla_funkcji:string)

potem wolam np XXX(img1,"get_image")

a w JS ?

W pascalu zmienna lokalna deklarowana jest wewnatrz procedury / funkcji

function XXX
var x:string;
begin
.....
end;
a w JS ?

Następna dyskusja:

to byl dopiero reset!!!




Wyślij zaproszenie do