Generuj i modyfikuj grafikę SVG danych z czujników podłączonych do IoT za pomocą JavaScript

Generuj i modyfikuj grafikę SVG danych z czujników podłączonych do IoT za pomocą JavaScript

Generuj i modyfikuj grafikę SVG danych z czujników podłączonych do IoT za pomocą JavaScript

W tej ostatniej części cyklu artykułów o rysunku grafika z danymi z czujników podłączonych do Internetu Rzeczy, czas porozmawiać o tym, jak generować lub modyfikować za pomocą JAVASCRIPT rysunki w formacie SVG i niektóre elementy HTML które służą jako pojemnik lub prezentują informacje uzupełniające grafikę.

Spis treści

    Wykresy danych z czujników podłączonych do kontenera Internetu Rzeczy (IoT) w formacie HTMLWykresy danych z czujników podłączonych do Internetu Rzeczy (IoT) definicja wyglądu w CSSWykresy danych z czujników podłączonych do Internetu rzeczy (IoT) rysowane za pomocą SVGWykresy danych z czujników podłączonych do Internetu Rzeczy (IoT) Generowanie i modyfikacja za pomocą JavaScript

    Docelowi użytkownicy tego samouczka powinni stworzyć profil elektroniki i programowania komputerowego. mikrokontrolery, mogą nie być zaznajomieni HTML, CSS o SVG; Z tego powodu w poprzednich odsłonach dokonano krótkiego wprowadzenia do języka lub odpowiadającej mu technologii. W tej ostatniej części podejście jest nieco inne, ponieważ czytelnicy z pewnością wiedzą, jak programować, możliwe jest, że użyją tego języka C + + co, jak JAVASCRIPT, ma taką samą podstawową składnię jak C i można go wykorzystać jako odniesienie, aby pominąć większość podstawowych koncepcji programowania i w ten sposób skupić się na różnicach i konkretnym zastosowaniu, które nas interesuje przy tworzeniu grafiki czujników w IoT.

    Nazwa daje wskazówkę co do pierwszej różnicy: JAVASCRIPT Jest to język programowania scenariusz (łącznik) i jako taki, tak jest interpretowane, nie ma potrzeby go kompilować; kontekst, w którym scenariusz (np. przeglądarka internetowa) odczyta, przetłumaczy i zrealizuje zamówienia. Mówiąc ściślej, w większości przypadków istnieje kompilacja środowiska uruchomieniowego (JIT), ale dla procesu pisania kodu JAVASCRIPT Nas to nie dotyczy, po prostu piszemy kod i może działać.

    W nazwie kryje się także pierwsze zamieszanie: JAVASCRIPT nie ma najmniejszego związku z Java. Początkowo, kiedy został opracowany Netscape w swojej przeglądarce nazywał się najpierw Mocha, a następnie mniej zagmatwany LiveScript. Po pomyślnym wdrożeniu w przeglądarkach i przekroczeniu ich, został ustandaryzowany jako ECMAScript (Na ECMA-262, wersja 6 w momencie pisania tego tekstu), aby stać się neutralnym w stosunku do przeglądarek, które je implementują. Obecnie istnieje również standard ISO od wersji 5, 2011 (ISO / IEC 16262: 2011 w momencie pisania artykułu)

    Zmienne, podstawowe typy danych i obiekty w JavaScript

    W odróżnieniu od tego, co dzieje się np C + +, en JAVASCRIPT typ danych nie jest uwzględniany podczas deklarowania zmiennej a także typ powiązany ze zmienną nie jest ustalony, możliwe jest przypisanie wartości innego typu w trakcie wykonywania programu.

    W poprzednim przykładzie zadeklarowana została zmienna „thing” (bez wskazania typu danych), następnie przypisane są dane innego typu i są one konsultowane z typeof typ, który JAVASCRIPT który zinterpretował. Aby zdebugować kod, możesz napisać go w konsoli inspektora przeglądarki internetowej (co nie będzie miało wpływu na prezentację sieci) za pomocą console.log().

    Aby wymusić konwersję danych na określony typ, szczególnie tekstowy na numeryczny, można skorzystać z funkcji takich jak parseInt() o parseFloat() które konwertują odpowiednio na liczby całkowite lub zmiennoprzecinkowe. Można dokonać odwrotnej konwersji String(), chociaż jest mało prawdopodobne, aby było to konieczne, ponieważ zwykle wystarcza automatyczna konwersja. Z parseFloat()Na przykład można uzyskać wartość właściwości strony internetowej, taką jak szerokość lub wysokość obiektu, zawierającą jednostki; W ten sposób wyrażenie parseFloat("50px"); w rezultacie zwróci 50, czyli wartość liczbową.

    En JAVASCRIPT nie ma rozróżnienia między cudzysłowami podwójnymi i pojedynczymi; Typ danych w obu przypadkach to string, a każdy z nich może zawierać drugi bez potrzeby stosowania kodów ucieczki.

    W poprzednim przykładzie widać, że zmienna, gdy została zadeklarowana (istnieje), ale nie ma przypisanej żadnej wartości, zawiera niezdefiniowany typ danych (undefined). Nieprzypisany obiekt ma wartość null; Oznacza to, że przedmiot istnieje, ale bez wartości; zmienna, która się do niej odwołuje, nie miałaby a typeof undefined ale object. Obiekt może być również pusty, to znaczy nie mieć wartości null, ale nie może mieć żadnych właściwości.

    do zdefiniować obiekt w JAVASCRIPT są ujęte w nawiasy klamrowe ({ y }) właściwości lub metody oddzielone dwukropkiem (:) nazwa właściwości wartość właściwości i przecinek (,) różne właściwości. Więcej informacji na temat tego sposobu wyrażania przedmiotu znajdziesz w artykule na temat Format JSON.

    Chociaż możesz użyć składni, która może skłonić Cię do innego myślenia, en JAVASCRIPT Nie ma klas, są tylko prototypyOznacza to, że aby obiekt mógł dziedziczyć właściwości i metody, tworzony jest inny obiekt (prototyp), którego inne obiekty (dzieci) używają jako odniesienia. Składnia najbliższa stylowi JAVASCRIPT użycie prototypu jest Object.create chociaż jest to również możliwe (i czasami przydatne) w użyciu new jak w innych językach obiektowych.

    do zapytanie, czy jeden obiekt jest instancją innego, jeśli użyjesz go jako prototypu, jeśli odziedziczysz jego właściwości, krótko mówiąc, możesz użyć instanceof (utworzony z new) Lub isPrototypeOf (utworzony z Object.create), która będzie miała wartość true, gdy obiekt użyje prototypu, i false, jeśli tego nie zrobi.

    Po utworzeniu obiektu przy użyciu innego obiektu jako prototypu, to znaczy po utworzeniu instancji obiektu, można go dodać nowe właściwości lub zastąpić właściwości prototypu używając składni kropki jak w gato.peso=2.5.

    La tablice w JAVASCRIPT Różnią się od tych, które zapewne znasz C. Na początek deklaruje się je bez konieczności podawania ich długości, jedynie ze znakami otwierania i zamykania nawiasów kwadratowych ([ y ]), komponenty mogą być heterogeniczne (różne typy danych w tej samej tablicy), a nowe elementy można dodawać bez ograniczeń. Macierze JAVASCRIPT są w rzeczywistości listami (zbiórami) elementów, do których odwołuje się do indeksu liczbowego lub nazwy. Tablica może jednocześnie zawierać indeksy numeryczne i nazwy elementów, ale często używa się obiektów (właściwości) do wykorzystania drugiego typu.

    Jak widać w poprzednim przykładzie, aby dowiedzieć się, czy zmienna odpowiada instancji tablicy (jest to obiekt tablicowy), można użyć instanceof, jak to było już używane w przypadku obiektów ogólnych lub, w nowszych wersjach JAVASCRIPT możesz się powołać Array.isArray()

    Aby uzyskać dostęp do elementów tablicy, możesz użyć jej indeksu (matriz[7]) lub po nazwie nieruchomości z nazwą w nawiasie kwadratowym (matriz["nombre"]) lub ze zwykłą składnią kropkową dla obiektów (matriz.nombre). Ponieważ nazwa jest ciągiem tekstowym, do jej utworzenia można użyć wyrażenia zawierającego zmienne. Aby przejść przez tablicę z właściwościami, można użyć pętli z formatem for(propiedad in matriz).

    Leczenie jest interesujące z punktu widzenia naszego celu obiekt Date, za pomocą którego można reprezentować datę i godzinę oraz zarządzać nią w JAVASCRIPT. Obiekt można utworzyć bez danych, więc będzie przyjmować bieżącą datę i godzinę, lub można go utworzyć poprzez wskazanie daty jako wartości w milisekundach od 1 stycznia 1970 r. (np. Czas uniksowy lub czas POSIX ale wyrażone w milisekundach zamiast w sekundach) lub podając osobne wartości roku, miesiąca, dnia, godziny...

    Obiekt obejmuje kompletną serię metody wysyłania zapytań lub ustawiania daty i godziny:

    • now()
      Zwraca bieżącą datę i godzinę wyrażoną w milisekundach od 1 stycznia 1970 r

    • getTime() | setTime()
      Pobiera lub zmienia odpowiednio wartość czasu w milisekundach od 1 stycznia 1970 r. Używanie valueOf(), czyli metoda występująca w większości obiektów, uzyskiwana jest także wartość odpowiedniego obiektu Date, np getTime() z Czas uniksowy lub czas POSIX wyrażone w ms.

    • getMilliseconds() | setMilliseconds()
      Służy do wysyłania zapytań lub ustawiania ułamkowej milisekundowej części obiektu Date na którym jest wykonywany. Po konsultacji uzyskana wartość mieści się w przedziale od 0 do 999, ale można przypisać większe wartości, które będą kumulować się w całkowitej dacie i godzinie, więc podobnie jak pozostałe metody get służy to zwiększeniu wartości obiektu Date (lub zmniejsz ją, jeśli używane są wartości ujemne).

    • getSeconds() | setSeconds()
      Odpowiednio zwraca lub zmienia wartość sekund obiektu Date.

    • getMinutes() | setMinutes()
      Służy do sprawdzania lub ustawiania minut obiektu Date.

    • getHours() | setHours()
      Umożliwia sprawdzenie lub modyfikację godzin (od 0 do 23) obiektu Date.

    • getDay()
      Zwraca dzień tygodnia dla daty wyrażonej jako wartość od 0 do 6 (od niedzieli do soboty).

    • getDate() | setDate()
      Zwraca lub zmienia dzień miesiąca obiektu Date na którym jest stosowany.

    • getMonth() | setMonth()
      Służy do sprawdzania lub modyfikowania numeru miesiąca obiektu Date.

    • getFullYear() | setFullYear()
      Wysyła zapytanie o wartość roku lub ustawia ją w obiekcie zawierającym datę i godzinę.

    Poprzednie metody Date zawierać wersję UTC aby móc bezpośrednio pracować z czasem uniwersalnym, bez konieczności wykonywania obliczeń pośrednich. W tym sensie np. getHours() ma wersję getUTCHours() o getMilliseconds() alternatywa getUTCMilliseconds() pracować na zmianę z czasem urzędowym (prawnym) lub powszechnym. Z getTimezoneOffset() Możesz poznać różnicę między czasem uniwersalnym a lokalnym czasem urzędowym.

    Funkcje JavaScriptu

    Jeśli to czytasz, na pewno wiesz, jak programować. mikrokontrolery en C lub C + + i znać pojęcie funkcji. Chociaż podstawowa idea jest taka sama, w JAVASCRIPT Sposób ich definiowania i używania jest nieco inny. Na początek powiedziano już, że JAVASCRIPT Nie używa jawnie typów danych, więc nie trzeba tego wskazywać przy definiowaniu funkcji. Podążać, Funkcja nie musi mieć nazwy, może być anonimowa. Można je powiązać ze zmienną w celu ich wywołania, ale może też nie być konieczne, gdyż czasem warto wywołać je od razu, dla czego nawiasy i parametry dodawane są po definicji funkcji.

    Aby zdefiniować funkcję, przedrostek function, jeśli ma to zastosowanie, wpisz nazwę, argumenty (parametry przekazywane do funkcji) w nawiasach, a w nawiasach klamrowych kod, który zostanie wykonany po wywołaniu funkcji.

    Oczywiście w poprzednim przykładzie zmienna „result” nie była w ogóle potrzebna, ale jest to dobry pretekst, aby o tym pamiętać zakres zmienny, który działa zgodnie z oczekiwaniami: zmienna „result” istnieje tylko w funkcji „double”. W JAVASCRIPT można również użyć let, zamiast var, aby określić zakres zmiennej w kontekście bloku kodu (ujętego w nawiasy klamrowe, { y })

    Mówiąc o obiektach w poprzedniej sekcji, zabrakło czegoś podstawowego: zdefiniowano właściwości, ale nie zdefiniowano metod. Zgodnie z oczekiwaniami, metody obiektowe są funkcjami, nie mają nazwy i są używane (wywoływane) na podstawie nazwy (właściwości) przypisanej przez definicję obiektu.

    W poprzednim przykładzie istnieje już metoda „view_temperature”, która wyświetla w konsoli wartość właściwości „current_temperature”. Nie jest to zbyt przydatne, ale daje pełniejszy obraz tego, jak wygląda definicja obiektu JAVASCRIPT.

    Aby uzyskać dostęp do metod obiektu (funkcji) i jego właściwości, użyj this, jak w poprzednim przykładzie w linii 11, gdy używana jest właściwość „current_temperature”.

    Uzyskaj dostęp do modelu obiektowego dokumentu (DOM) za pomocą JavaScript

    z JAVASCRIPT Masz dostęp do zawartości strony internetowej, na której ona działa, a także do niektórych aspektów przeglądarki, która wyświetla tę stronę, ale nie do zasobów systemowych. Struktura danych obsługująca właściwości i metody, z których można uzyskać dostęp JAVASCRIPT część obiektu okna, w szczególności zawartość obiektu (dokument HTML) odpowiada obiektowi document. Chociaż czasami używa się go dla przejrzystości, nie jest konieczne poprzedzanie okna do metod lub właściwości, aby się do nich odwołać, wystarczy np. użyć document, nie ma potrzeby wpisywania nazwy obiektu głównego jak w window.document, o ile odwołuje się do bieżącego okna.

    Najczęściej używana forma znaleźć obiekt w dokumencie HTML To poprzez metodę getElementById(), do którego jako argument przekazywany jest identyfikator wskazany podczas tworzenia kodu HTML. Z tego, co wyjaśniono w poprzednich sekcjach, łatwo założyć, że dostęp do komponentów wewnątrz obiektu jest również możliwy document używając składni kropki (document.componente) lub nawiasy, używając zarówno nazwy (document["componente"]), najbardziej przydatne, jak indeks liczbowy, trudne w użyciu i niepraktyczne przy dostępie do treści ręcznie utworzonej strony internetowej.

    z JAVASCRIPT możesz pobierz element zawierający inny element (element lub węzeł nadrzędny) konsultacja z Twoją nieruchomością parentNode lub Twoją własność parentElementróżnica polega na tym, że element nadrzędny (parentElement) ostatniego elementu ciągu DOM Jest zerowy (null) i węzeł nadrzędny (parentNode) to sam dokument (document).

    do modyfikować zawartość elementu HTML, na przykład etykieta <div>, To może być użyte innerHTML i aby zmienić jego właściwości, możesz przypisać mu inną klasę className lub zmieniać jego właściwości indywidualnie za pomocą style. Sprawdzanie stylu wyświetlanego przez element na stronie internetowej niekoniecznie jest przydatne style ponieważ może to zależeć od kilku czynników lub po prostu nie zostało wyraźnie określone. Aby sprawdzić styl elementu ostatecznie wyświetlonego na stronie internetowej, wykorzystywana jest metoda getComputedStyle.

    Do elementu dokumentu HTML Można mu przypisać kilka klas, aby określić jego wygląd i zachowanie zarządzaj listą klas obiektu z JAVASCRIPT możesz się powołać classList który oferuje metody add aby dodać nową klasę do listy, remove aby go usunąć, toggle aby go zastąpić lub sprawdzić zawartość listy klas elementu item i contains, która zwraca klasę zajmującą określoną pozycję na liście oraz wartość true o false czy dana klasa znajduje się na liście.

    W poprzednim przykładzie znajduje się on w getElementById obiekt, którym chcesz manipulować (element <div> dla jego id), przed zmianą wyglądu treść zostaje usunięta poprzez przypisanie za pomocą innerHTML pusty ciąg tekstowy, z którym zostaje przypisana nowa klasa className i jego styl jest modyfikowany za pomocą style w zależności od wartości zawartości (temperatury), ewentualnie zmieniając kolor poprzez właściwość color. Po ustaleniu aspektu wartość jest zapisywana ponownie za pomocą innerHTML.

    W drugiej części powyższego przykładu (linie od 9 do 19) uzyskiwany jest dostęp do elementu kodu HTML używając składni document[] i własności id elementu, aby zmienić jego listę klas za pomocą metody classList.remove() i z metodąclassList.add(), na podstawie wyników kilku zapytań wykonywanych w wykonaniach warunkowych, za pomocą których porównują classList.contains().

    Kiedy to się stanie odnosić się do elementu HTML varias razy w całym kodzie JAVASCRIPT, To trochę bardziej efektywne jest przypisanie go do zmiennej lub użyj jego indeksu zamiast nazwy, ponieważ w przeciwnym razie użyłbyś metody JAVASCRIPT uzyskanie go za każdym razem wymagałoby wyszukiwania jego nazwy, co zajęłoby nieco więcej czasu niż w przypadku dostępu do zmiennej.

    do dodać nowe obiekty do dokumentu HTML, można je najpierw utworzyć za pomocą metody createElement de document a później dołącz je do pozostałych elementów w odpowiednim miejscu drzewa appendChild. Aby utworzyć obiekt XML, jak przedmioty SVG którego używamy do rysowania wykresu czujników IoT, możesz użyć createElementNS (NS dla przestrzeń nazw). Jak wyjaśniono, mówiąc o formacie SVG, odpowiadająca mu przestrzeń nazw (dla bieżącej wersji) to http://www.w3.org/2000/svg, do którego należy przekazać createElementNS jako argument wraz z typem elementu, svg, w tym przypadku.

    A alternatywa dla innerHTML aby dodać tekst jako treść do elementu dokumentu HTML jest metoda createTextNode() Obiekt document. Dzięki tej alternatywie możesz utwórz nowy tekst (który jest później dostępny, jeśli jest przypisany do zmiennej), który jest włączany do drzewa obiektów za pomocą metody appendChild(). Jak alternatywa dla appendChild(), który dodaje nową treść na końcu tego, co już istnieje w węźle, do którego jest dodawana, możesz użyć metoda insertBefore(), który dodaje nowy obiekt przed istniejącym. Nosić insertBefore() zamiast appendChild() udostępnia metodę, która służy np sortuj nowe obiekty przed istniejącymi gdy element musi znajdować się przed innym (jak na liście) lub zakrywać lub być przykryty strukturą graficzną, w której znajdują się elementy bliżej pierwszego planu lub tła.

    Reaguj na wydarzenia za pomocą JavaScript

    Kiedy sposób użyj strony internetowej jako pojemnika na wykresy czujników podłączonych do IoT było użyte onload Na etykiecie <body> aby rozpocząć rysowanie wykresu. Ta właściwość powiązana z obiektami kodu HTML, odnosi się do wydarzenia JAVASCRIPT. Jak już wyjaśniono, wykonuje funkcję po załadowaniu strony. Chociaż zostało to powiązane z kodem HTML aby lepiej o tym pamiętać, można było to zapisać w kodzie JAVASCRIPT jako body.onload=dibujar; bycie dibujar nazwa funkcji, która powinna zostać uruchomiona podczas ładowania strony internetowej.

    W najnowszych wersjach JAVASCRIPT zdarzenia można powiązać z funkcjami za pomocą addEventListener z formatem objeto.addEventListener(evento,función); lub używając składni objeto.evento=función; co działa również w starszych wdrożeniach. Aby odłączyć funkcję powiązaną ze zdarzeniem, musisz removeEventListener który ma taki sam format jak addEventListener.

    JAVASCRIPT Potrafi reagować na wiele zdarzeń, które mogą wystąpić na stronie internetowej. Może na przykład wykryć kliknięcie elementu HTML z onmousedownlub po kliknięciu onclick, po naciśnięciu klawisza onkeydown, korzystając z paska przewijania za pomocą onscroll. Dla naszych celów to wystarczy wykryć ładowanie strony za pomocą onload i jego zmiana rozmiaru za pomocą onresize. Skojarzymy te zdarzenia z przedmiotami body y window del DOM odpowiednio. Pierwszy można przypisać w kodzie HTML, jak widać, i drugi w kodzie JAVASCRIPT wewnątrz funkcji wywoływanej przez pierwszą i z formatem window.onresize=redimensionar; bycie redimensionar funkcja, która będzie wywoływana za każdym razem, gdy okno zmieni rozmiar.

    Uruchom po pewnym czasie

    JAVASCRIPT ma dwa zasoby dla odroczona realizacja: setTimeout, który wykonuje funkcję po upływie określonego czasu i setInterval który będzie wykonywał funkcję w określonym przedziale czasu. Obie metody wymagają jako parametrów (1) wywoływanej funkcji i (2) przedziału czasu wyrażonego w milisekundach. Aby zatrzymać ich działanie, możesz przypisać wynik zwracany przez te funkcje do zmiennych i przekazać je jako argument do clearTimeout lub clearInterval kiedy nie chcesz ich ponownie wywoływać (lub kiedy nie chcesz, aby były wykonywane po raz pierwszy) setTimeout o setInterval odpowiednio.

    W poprzednim przykładzie wprowadzono metodę alert który służy do wyświetlania znaku ostrzegawczego. Chociaż był szeroko stosowany w przeszłości, obecnie jest prawie zakazany w kodzie JAVASCRIPT ze względu na to, jak agresywne (natrętne) jest zakrywanie strony internetowej oknem dialogowym.

    W programie napisanym dla a mikrokontroler małej serii (takiej jak ta na talerzu Arduino Uno) często stosuje się zmienne globalne, jak w poprzednim przykładzie JAVASCRIPT, ponieważ kod jest krótki i niezbyt zagmatwany, ponieważ wielokrotnie funkcje są implementowane ad hoc, a użycie zmiennych globalnych pozwala w bardzo prosty i intuicyjny sposób przewidzieć wykorzystanie pamięci, co jest krytyczne w systemach o małych zasobach . Zamiast, en JAVASCRIPT Powszechnym zjawiskiem jest ograniczanie użycia zmiennych globalnych do możliwego minimum. ponieważ nie musi przyspieszać użycia pamięci, ponieważ działa normalnie na komputerze CPU z zasobami znacznie przewyższającymi zasoby A MCU, ponieważ prawdopodobnie współistnieje z dużą ilością kodu stron trzecich, z którym musi współpracować bez ingerencji, a ponieważ jest to system otwarty, nie można przewidzieć przyszłego kontekstu wykonania (program mikrokontroler small całkowicie określa jego działanie bez dodawania więcej kodu po jego uruchomieniu) oraz ponieważ wymiary aplikacji mogą utrudniać czytanie, jeśli kod nie zawiera jego działania, czyniąc metody tak samodzielnymi, jak to tylko możliwe.

    Operacje matematyczne na obiekcie JavaScript Math

    W obiekcie zgrupowane są operacje matematyczne bardziej skomplikowanych obliczeń matematycznych Math. Ten obiekt jest używany bezpośrednio, nie jest konieczne tworzenie jego instancji, aby móc korzystać z metod lub właściwości (stałych), które zawiera.

    • Math.abs(n) Wartość bezwzględna parametru n
    • Math.acos(n) Arccosinus parametru n (wynik w radianach)
    • Math.asin(n) Arcsine parametru n (wynik w radianach)
    • Math.atan(n) Arcus tangens parametru n (wynik w radianach)
    • Math.atan2(n,m) Arcus tangens n/m (wynik w radianach)
    • Math.ceil(n) Zaokrąglij parametr do najbliższej liczby całkowitej w górę
    • Math.cos(α) Cosinus parametru α (α w radianach)
    • Math.E liczba (≃2.718281828459045)
    • Math.exp(n) e podniesione do parametru n: en
    • Math.floor(n) Zaokrąglij parametr n do najbliższej liczby całkowitej w dół
    • Math.log(n) Logarytm naturalny (o podstawie e) parametru n
    • Math.LN2 Logarytm naturalny (podstawa e) liczby 2 (≃0.6931471805599453)
    • Math.LN10 Logarytm naturalny (podstawa e) liczby 10 (≃2.302585092994046)
    • Math.LOG2E Logarytm o podstawie 2 z e (≃1.4426950408889634)
    • Math.LOG10E Logarytm o podstawie 10 z e (≃0.4342944819032518)
    • Math.max(a,b,c,…) Największa wartość z listy przekazanych parametrów
    • Math.min(a,b,c,…) Najmniejsza wartość z listy przekazanych parametrów
    • Math.PI Liczba π (≃3.141592653589793)
    • Math.pow(n,m) Pierwszy parametr n podniesiony do drugiego parametru m: nm
    • Math.random() (Prawie) losowa liczba z zakresu od 0.0 do 1.0
    • Math.round(n) Zaokrąglij parametr n do najbliższej liczby całkowitej
    • Math.sin(α) Sinus parametru α (α w radianach)
    • Math.sqrt(n) Pierwiastek kwadratowy z parametru n
    • Math.SQRT1_2 Pierwiastek kwadratowy z 1/2 (≃0.7071067811865476)
    • Math.SQRT2 Pierwiastek kwadratowy z 2 (≃1.4142135623730951)
    • Math.tan(α) Tangens parametru α (α w radianach)

    Załaduj dane z serwera za pomocą AJAX

    Metoda rysowania informacji przechowywanych w IoT polega na co pewien czas ładowaniu danych z serwera i ponownym rysowaniu wykresu, za pomocą którego są one reprezentowane. Do odczytu danych z serwera wykorzystywana jest technologia AJAX (asynchroniczny JavaScript i XML) przez obiekt XMLHttpRequest de JAVASCRIPT. Wykreślanie wykresu danych odbywa się poprzez ponowne wykorzystanie obiektu SVG co jest już w kodzie HTML i który zawiera wykres, którego współrzędne są modyfikowane, aby odpowiadały nowym załadowanym danym.

    W przykładzie tej propozycji, oprócz aktualizacji rysunku, zaktualizowano także tekst na stronie internetowej, który pokazuje datę i wartość ostatnich danych pomiarowych dla każdego wykresu.

    Po stronie serwera znajduje się baza danych zawierająca informacje że czujniki podłączone do Internetu Rzeczy monitorują. Ta baza danych jest odczytywana przez żądanie obiektu XMLHttpRequest odpowiadając informacjami zakodowanymi w pliku Format JSON, choć nazwa zastosowanej metody sugeruje związek z formatem XML.

    W pierwszym tutorialu polaridad.es na temat Przechowywanie danych IoT Można zobaczyć przykładową infrastrukturę do zarządzania od strony serwera informacjami dostarczanymi przez urządzenia podłączone do Internetu Rzeczy. W tej serii artykułów serwer jest używany jako zasób Apache z którego można korzystać z języka programowania PHP aby uzyskać dostęp do bazy danych MySQL o MariaDB. Na serwerach obsługujących IoT bardzo często spotyka się bazy danych MongoDB (NoSQL) i język programowania JAVASCRIPT na node.js jako infrastruktura oprogramowania.

    Kolejna funkcja odpowiada za żądanie od serwera najświeższych danych z jednego z czujników. W wywołaniu funkcji obiekt jest używany jako argument JAVASCRIPT obsługujący rysowane dane. Jeśli ten sam wykres przedstawia kilka wartości, na przykład w celu wizualnego wyszukiwania korelacji, do serwera można wysłać żądanie zwrócenia kilku wartości jednocześnie, co jest metodą bardziej optymalną ze względu na sposób działania serwera. Protokół HTTP.

    W trzeciej linii poprzedniego przykładu przygotowywane jest zapytanie, które zostanie skierowane do serwera, w którym zostanie przekazany argument „strefa”, którego wartością będzie nazwa lub kod monitorowanego miejsca, gdyż informacja o obszar może współistnieć w tej samej bazie danych, różne czujniki (np. termometry mierzące temperaturę w różnych pomieszczeniach). Oczekuje się, że parametr przekazany do poprzedniej funkcji, czyli obiekt z danymi wykresu, będzie zawierał właściwość z nazwą pomieszczenia („przyrostek_nazwy”).

    Pomiędzy wierszami 7 i 14 poprzedniego kodu, obiekt XMLHttpRequest który jest przechowywany w zmiennej „ajax”. Zanim wybierzesz sposób utworzenia obiektu, przeprowadzasz wyszukiwanie window Jeśli XMLHttpRequest nie był dostępny (coś, co miało miejsce w starych wersjach eksploratora Microsoftu i chociaż jest daleko w tyle, służy jako przykład alternatywy do utworzenia obiektu przy użyciu (bardziej natywnej) składni. Object.create o new, podobnie jak w przypadku innych języków obiektowych.

    Aby móc natychmiast zarządzać odpowiedzią, kod obsługujący ją jest przygotowywany w liniach od 15 do 26 przed wysłaniem żądania do serwera.

    Sposób wykonać zapytanie HTTP na serwer składa się z otwórz połączenie z open wskazanie typu i strony (opcjonalnie nazwa użytkownika i hasło), przygotuj nagłówki protokołu z setRequestHeader y wyślij prośbę z send. Nagłówek HTTP Content-length będziesz musiał znać długość zapytania (liczbę znaków), która jest obliczana za pomocą length.

    Kiedy prośba AJAX jest gotowy, wykonywana jest funkcja powiązana ze zdarzeniem onreadystatechange. Zamiast przypisywać funkcję, w poprzednim przykładzie na bieżąco definiowana jest anonimowa funkcja, która będzie zarządzać odbiorem danych przychodzących z serwera. Przede wszystkim w linii 18 sprawdzane jest, czy status żądania to „zakończone”, co odpowiada wartości 4 nieruchomości readyState, że status pliku to „OK”. Protokół HTTP (kod 200), które można uzyskać od nieruchomości status i że dane, które nadeszły, są Format JSON, konsultując nieruchomość responseType.

    Po sprawdzeniu, czy status odpowiedzi jest zgodny z oczekiwaniami, w linii 20 poprzedniego przykładu tworzy obiekt z wynikiem, konwertując tekst JSON. W odpowiedzi oczekuje się zwrócenia daty, dzięki temu możemy sprawdzić, czy wynik, który wysyła serwer, był już wcześniej przedstawiony na wykresie, co jest weryfikowane w linii 21. Jeżeli dane są nowe, w linii 23 nazywa się funkcję odpowiedzialną za przerysowanie wykresu o nowe informacje.

    Założeniem proponowania tej metody odczytu jest to, że dane będą bardzo często odświeżane. Jeśli prezentowane informacje dotyczą okresu długoterminowego (np. temperatury w ciągu dnia lub tygodnia), można wdrożyć żądanie wstępne, które zbierze wszystkie dostępne dane, a następnie podobne do tego w przykładzie, które je zaktualizuje w ciągu korespondent epoki.

    Generuj losowe dane do testów

    Kiedy cała infrastruktura serwerowa i kliencka będzie gotowa, funkcja taka jak w poprzedniej sekcji będzie odpowiedzialna za odczytanie danych i narysowanie z nich wykresu, ale W fazie testowania bardziej praktyczne może być użycie liczb losowych w kontrolowanym zakresie aby sprawdzić, czy pisany kod jest poprawny. Poniższa funkcja może posłużyć jako przykład pozyskiwania danych podczas budowania finalnej aplikacji.

    Zamiast czytać informacje z bazy danych, powyższy przykład generuje je losowo i przekazuje do funkcji odpowiedzialnej za rysowanie wykresu. Wymyślone dane to wektor utworzony przez datę wyrażoną w milisekundach, moment zarejestrowania informacji z czujnika oraz monitorowane dane, które mieszczą się pomiędzy wartością maksymalną a wartością minimalną.

    W tym przykładzie podczas generowania daty można ją opóźnić o maksymalnie jedną sekundę (1000 milisekund) w stosunku do daty w momencie wynalezienia. Jak Math.random() generuje liczbę od 0.0 do 1.0, pomnożenie jej przez 1000 daje liczbę od 0 do 1000, która następnie jest konwertowana na liczbę całkowitą. W ten sam sposób wartość uzyskuje się, mnożąc liczbę losową przez zakres (maksimum minus minimum) i dodając minimum.

    Narysuj wykres czujników IoT z wykresem SVG

    Ponieważ widzieliśmy, jak możemy uzyskać wartości, które chcemy przedstawić (w przykładzie temperaturę) i ich położenie w czasie, które można wyrazić łącznie w postaci współrzędnych, poniższy przykład pokazuje funkcję rysowania ścieżki łączący te punkty i opcjonalnie kolorowy obszar ograniczony tą linią u góry. Rezultat będzie taki jak na poniższym obrazku.

    Przykład wykresu wygenerowanego za pomocą SVG i JavaScript w celu przedstawienia danych z czujników IoT

    Oś pozioma (X) wykresu przedstawia czas, a oś pionowa (Y) wartości monitorowane przez czujniki podłączone do IoT. Odstęp poziomy wynosi kilka sekund, ponieważ w tej propozycji wykres jest aktualizowany bardzo często (na przykład co sekundę), aby zapewnić informacje o stanie czujników w czasie niemal rzeczywistym.

    W poprzednim kodzie są dwa interesujące aspekty, po pierwsze, obliczenia, które na to pozwalają dostosować zakres reprezentowanych wartości a po drugie budowa nieruchomości d który wskazuje współrzędne punktów na układzie (path).

    Aby dostosować zakres reprezentowanych wartości, przesuwa się je od minimum i skaluje tak, aby widoczna wielkość odpowiadała rozmiarowi wykresu. W przypadku czasu przesunięcie uzyskuje się poprzez odjęcie zakresu, który chcesz wyświetlić od najdłuższego czasu (data i godzina najbliższa bieżącej) (w przykładzie 20 sekund). Przesunięcie wartości temperatur to dolny zakres (jeden stopień) minus najniższa wartość, tak aby dane pokazane poniżej były jak najbardziej zbliżone do najniższej dopuszczalnej wartości, ale z pozostawieniem marginesu, który pozwala nam docenić to, co mija

    Współczynnik mnożący wartości czasu w celu uzyskania współrzędnych poziomych wykresu uzyskuje się poprzez podzielenie całkowitej szerokości wykresu (w przykładzie 100 jednostek) przez reprezentowany zakres czasu (w przykładzie 20 sekund). Aby uzyskać współczynnik ze skalarnymi wartościami temperatury, należy pamiętać, że przedstawiony zakres rozciąga się od marginesu poniżej wartości minimalnej do marginesu powyżej maksimum, o jeden stopień w obu przypadkach. W ten sposób współczynnik skali pionowej wynika z podzielenia wysokości wykresu (w przykładzie 100 jednostek) przez wartość maksymalną minus minimum plus górny i dolny margines. Ponieważ wartości te mogą całkowicie rozwinąć się w temperaturach ujemnych, używamy Math.abs() użyć wartości bezwzględnej różnicy.

    Własność d Obiekt path Konstruuje się go poprzez połączenie współrzędnych punktów w tekście. Każda para współrzędnych jest poprzedzona kodem SVG L, który rysuje linię od aktualnej pozycji do wartości bezwzględnej wskazanej przez współrzędne. Wartości X i Y oddzielamy przecinkami i każdą operację SVG jest oddzielona spacją od następnego.

    Aby rozpocząć układ, użyj kodu M (przejdź do współrzędnej absolutnej). W przypadku wykresu zamkniętego i wypełnionego zaczynasz od prawego dolnego rogu, w przypadku wykresu otwartego rysującego profil danych zaczynasz od ostatniej reprezentowanej wartości (najnowszej). Aby zakończyć zamknięty układ, używany jest kod Z dodając jako ostatni punkt ten, który ma tę samą wartość współrzędnej X co ostatni punkt linii, a jako współrzędną Y najmniejszą reprezentowaną wartość.

    W tym przykładzie funkcja dibujar_grafico(), czyli wywołanie ładowania strony, pobiera początkowe wartości do przetestowania (nie ostatnią wartość w czasie rzeczywistym) i przygotowuje zakres, w jakim dane będą renderowane: 20 sekund (20000 ms) w poziomie i 15°C w pionowo od -5°C do +10°C z jednostopniowym marginesem górnym i dolnym. Wykonaj dwa połączenia do actualizar_grafico(), w pierwszym przejściu true jako argument wskazujący, że wykres powinien zostać zamknięty, aby reprezentował wypełniony obszar, a przy drugim wywołaniu zostaje uznany false narysować linię. W każdym przypadku przedmiot path zmodyfikowany to taki, który ma odpowiedni wygląd, z wypełnieniem i bez obramowania w pierwszym przypadku oraz z określoną grubością linii i bez wypełnienia w drugim przypadku.

    Funkcja actualizar_grafico() pracować nad przedmiotem SVG który używa następującego kodu jako kontenera HTML. Obiekt SVG zawiera dwie ścieżki, jedną do rysowania linii i drugą do rysowania wypełnionego obszaru. Podczas ładowania strony internetowej z elementu <body> poprzednia funkcja wywoływana jest automatycznie, dibujar_grafico() dzięki wydarzeniu JAVASCRIPT onload.

    W linii 10 kodu HTML powyżej, w stylu ustalona jest szerokość (dla przykładu) 820 px i wysokość 150 px (coś, co w ostatecznej wersji będzie wskazane z klasą i dokumentem CSS). Wydaje się dziwne, że linie 13 i 14 określają rozmiar obiektu SVG np. 100% szerokości i wysokości (która najlepiej odpowiada wymiarom okna, 100×100). Jak już wspomniano, powodem tego jest zawsze praca ze znanymi wymiarami i dostosowywanie do nich reprezentowanych wartości. Inną alternatywą byłoby każdorazowe obliczenie przestrzeni wykresu i późniejsze dostosowanie wartości lub wymuszenie stałych wymiarów wykresu, których dokument będzie musiał przestrzegać.

    Wybierając wykres, którego wymiary zmieniają się zgodnie z kodem HTML, konieczne jest uwzględnienie nieruchomości vector-effect z odwagą non-scaling-stroke aby zapobiec deformacji grubości linii, gdy wykres nie zachowuje wybranych proporcji 1:1 na stronie internetowej, na której jest wyświetlany, jak to miało miejsce w poprzedniej propozycji.

    Aby „przyciąć” wykres i wyświetlić tylko wybrany obszar, użyj opcji viewBox. W tym przypadku wybraliśmy część wykresu zaczynającą się od 0,0 (lewy górny róg) i mającą wymiary 100x100 w dół i w prawo. Część rysunku znajdująca się we współrzędnych o wartościach ujemnych lub większych niż 100 nie będzie wyświetlana na stronie internetowej nawet jeśli istnieją w obiekcie SVG

    Dodaj nowe elementy do rysunku SVG

    W poprzednim przykładzie funkcja actualizar_grafico() użyj układu SVG na który następuje zmiana właściciela d, co wyraża łańcuch współrzędnych. Alternatywą byłoby utworzenie całego obiektu za każdym razem, gdy jest on przerysowywany. Zaletą pierwszej opcji jest to, że wygląd graficzny (np. grubość czy kolor) jest zdefiniowany w kodzie HTMLograniczeniem jest to, że obiekty muszą zostać wcześniej utworzone.

    Aby utworzyć obiekty SVG, użyj createElementNS(), co pozwala na włączenie przestrzeń nazw. W poniższym przykładzie tworzony jest nowy obiekt tekstowy (text) i jest powiązany z elementem SVG który już istnieje w kodzie HTML strony internetowej. Po utworzeniu nowego elementu przypisywane są jego właściwości setAttribute() i jest dodawany do SVG z appendChild().

    Zmień proporcje elementów rysunku

    Jeśli próbowałeś etykietować za pomocą funkcji z przykładu z poprzedniej sekcji, zauważyłeś, że tekst wydaje się zdeformowany, gdy proporcje obiektu na stronie internetowej (width y height kodu HTML) nie jest równy reprezentowanemu obszarowi (viewBox). Aby dostosować proporcje, konieczna jest znajomość wymiarów obiektu SVG dla którego możesz sprawdzić styl obiektu lub pojemnika HTML, jeśli obiekt SVG przenieść tę nieruchomość. Przypisywanie własności transform do przedmiotów SVG które zależą od proporcji, deformację można skorygować, stosując operację skalowania scale() w którym współczynnik w X jest inny niż w Y.

    SVG umożliwia zgrupowanie kilku obiektów w nowy element złożony, który obsługuje również właściwościjak proste przedmioty. Aby zastosować tę samą transformację do szeregu obiektów na raz, a nie do każdego obiektu osobno, możesz pogrupować je według tego zasobu i zastosować pojedynczą właściwość transform do nich wszystkich.

    Jak wyjaśniono podczas rozmowy Format SVG, elementy grupy są otoczone etykietami <g> y </g>. Aby dodać z JAVASCRIPT elementy do grupy SVG jest używany, jak widać w poprzednim przykładzie, appendChild() po zdefiniowaniu nowego obiektu.

    Aby ustalić początek podczas stosowania przekształceń, właściwość można zastosować na obiektach SVG transform-origin, którego wartością są współrzędne X i Y punktu, od którego rozpoczyna się transformacja. Jeżeli wartość początku transformacji nie jest wyraźnie wskazana (w przeglądarce internetowej), stosowany jest środek współrzędnych. Niestety, w momencie pisania tego tekstu, określenie zachowania transformacji przy użyciu źródła innego niż domyślne nie jest jednolite w różnych przeglądarkach i należy stosować je ostrożnie.

    Wraz z transformacją skali za pomocą scale Istnieją inne, takie jak obrót z rotation i ruch z translate, które oferują alternatywa dla reprezentacji graficznej: zamiast uzyskiwać nowe współrzędne, możesz przedstawić je w ich własnej przestrzeni i przekształcić wykres tak, aby pasował do formatu, w jakim chcesz je przedstawić.

    Dodaj odniesienia do wykresu

    Teraz, gdy główna część wykresu została rozwiązana poprzez wykreślenie wartości z profilem i wypełnionym obszarem, można go uzupełnić odniesieniami, które pomogą w jego odczytaniu. Jako przykład zacznijmy od narysowania poziomych odniesień (linii), które zaznaczają maksymalne i minimalne akceptowalne wartości, a także pożądaną wartość. Jak wyjaśniono, możesz dodać obiekty do pliku SVG prosto z JAVASCRIPT lub umieść je ręcznie w kodzie HTML i zmodyfikuj je później za pomocą JAVASCRIPT.

    Logiczne wydaje się oznaczenie tych odniesień poziomych tekstem wyjaśniającym wartość, jaką reprezentują. Do wyróżnienia tekstu można zastosować prostokąty, które wyróżnią się na tle tła i grafiki. Ponieważ teksty będą musiały zostać przeskalowane, aby skompensować deformację, można je wszystkie pogrupować w obiekt, do którego zostanie zastosowana skala; Główną zaletą takiego działania jest możliwość ich modyfikacji w jednej operacji, jeśli rozmiar kontenera wykresu (okna przeglądarki) zostanie zmieniony i zmieni się proporcja korygowana przez skalę.

    W powyższym przykładowym kodzie jest kilka interesujących aspektów. Na początek zauważ, że zastosowano stałe (zmienne globalne), aby przykład był bardziej czytelny dla użytkowników zajmujących się programowaniem. mikrokontrolery en C lub C + +. Jak się później okaże, optymalny sposób na zaprogramowanie tego JAVASCRIPT Byłoby to użycie obiektów zawierających te wartości i metod, które zarządzałyby referencjami w tym przykładzie lub ogólnie na wykresie w systemie produkcyjnym.

    Z drugiej strony, udoskonalając wygląd bardziej ogólnego kodu, opracowano osobne funkcje, które obliczają różne współczynniki korygujące proporcje wykresu w celu dostosowania tekstu proporcion_grafico(), skala wartości w zależności od ich zakresu escala() oraz współczynnik korekcyjny dla pomiarów znanych w wartościach bezwzględnych, takich jak pomiary w odniesieniach medida_grafico().

    Lektura tego kodu powinna pomóc w wyjaśnieniu kontekstu, w którym działa taka aplikacja, która rysuje grafikę w czasie rzeczywistym i musi być elastyczna, aby można ją było prezentować w różnych kontekstach graficznych (przynajmniej w różnych rozmiarach i proporcjach). Przede wszystkim należy wygenerować obiekty SVG, „ręcznie” w kodzie HTML, albo poprzez kod JAVASCRIPT w każdym razie należy następnie uzyskać odniesienia do tych obiektów, aby nimi manipulować JAVASCRIPT dzięki czemu można rysować nowe wykresy i dostosowywać reprezentację już narysowanego wykresu do zmiany medium, w którym jest on prezentowany.

    Kolejnym odniesieniem, które może pomóc w łatwej interpretacji wykresu, są punkty reprezentujące określone wartości (węzły prostej). W tym przykładzie, w którym reprezentujemy pojedynczą wielkość, wybór symbolu nie jest krytyczny, ale jeśli nałoży się na siebie kilka różnych wartości w celu poszukiwania korelacji, warto rozróżnić, oprócz wykorzystania innych zasobów, takich jak kolor , rysując różne symbole. Grafika używana dla węzła linii musi zostać zmodyfikowana pod względem wielkości i proporcji, jak to ma miejsce na przykład w przypadku tekstów, tak aby jej wymiary były absolutne i aby jej proporcje zostały zachowane nawet w przypadku zmiany zawartych w grafice ramek.

    W poprzednim przykładzie widzieliśmy już, jak obliczyć różne współczynniki w celu przeskalowania i skorygowania proporcji rysunku; Jeśli chodzi o sposób wdrożenia zarządzania symbolami węzłów lub wierzchołków grafu, możliwym rozwiązaniem może być przechowywanie obiektów SVG do wektora i modyfikować jego położenie podczas aktualizacji wykresu poprzez odczytanie nowej wartości lub podczas ponownego rysowania poprzez zmianę rozmiaru kontenera. W pierwszym przypadku należałoby zmienić jego położenie, a w drugim jego proporcje w stosunku do nieruchomości transform i wartość scale. Poniższy kod jest modyfikacją funkcji actualizar_grafico() aby uwzględnić zmianę położenia symboli wierzchołków wykresu.

    Modyfikacje wprowadzone w funkcji actualizar_grafico() aby uzyskać nową funkcję actualizar_grafico_puntos() Są to te wyróżnione w kodzie poprzedniego przykładu. Najpierw w linii 5 bierzemy wektor obiektów SVG jako parametr. Ten wektor będzie zawierał symbole, które należy zmienić w nowych węzłach wykresu.

    W liniach 39 i 40 przypisane są nowe współrzędne środka, cx y cy, do wartości, które są reprezentowane. Jeżeli symbol nie opierał się na środku, prawdopodobnie konieczne będzie dodanie przesunięcia cx połowę szerokości i w cy połowy wysokości, aby przenieść je dokładnie w węźle wykresu.

    W liniach od 57 do 61 punkty odpowiadające współrzędnym, które nie zostały narysowane, ponieważ zostały obcięte lewą krawędzią, są przenoszone poza wykres. Współrzędna cy do zera i tyle cx do dowolnej liczby ujemnej (większej niż sam punkt), tak aby nie była ona pokazywana po przecięciu, podobnie jak lewa część wykresu, przez okno SVG.

    Zarządzaj wykresem z obiektu za pomocą JavaScript

    Wszystkie wyjaśnione do tej pory operacje można zintegrować w obiekcie, aby zarządzać wykresem w stylu bardziej typowym dla nowych wersji JAVASCRIPT. Ta alternatywa implementacyjna ma dodatkową zaletę polegającą na uproszczeniu włączenia kilku wykresów o różnych wartościach na tej samej stronie internetowej.

    Zanim omówimy implementację, przejrzyjmy najczęstsze sposoby tworzenia obiektów JAVASCRIPT oraz niektóre cechy funkcji, które wpływają na propozycję rysowania grafiki czujnika IoT.

    Wyjaśniono już, że nowy sposób tworzenia obiektów w JAVASCRIPT (dostępne od wersji 5 ECMAScript) polega na używaniu Object.create, do którego należy się przyzwyczaić zamiast „klasycznego” new, który oczywiście nadal działa poprawnie, chociaż jego celem jest bardziej symulowanie stylu języków za pomocą obiektów klasowych (JAVASCRIPT opiera tworzenie obiektów na prototypach) niż działająca alternatywa.

    Poprzedni kod pozwala zapamiętać różnice pomiędzy tworzeniem obiektów za pomocą Object.create lub new. Służy to również podkreśleniu tego, choć funkcja, z jaką obiekt jest tworzony new może znajdować się w dowolnym miejscu kodu, obiekt musi już istnieć, zanim będzie można utworzyć jego instancję Object.create (Obiekt ES5_Object nie jest funkcją).

    W liniach 3 i 4, aby ustawić wartość domyślną właściwości w funkcji, która tworzy obiekt new, każda właściwość jest przypisana do wartości odpowiedniego argumentu lub (||), jeśli nie przekazano żadnych argumentów, to znaczy, jeśli są one niezdefiniowane (undefined), ponieważ okoliczność ta jest oceniana jako false, przypisana jest wartość domyślna.

    Kontekst, w którym wykonywana jest funkcja JAVASCRIPT podnosi dwie kwestie, o których należy pamiętać i które mogą być mylące podczas używania tego języka programowania po pracy z innymi, np. C o C + +, w naszym przypadku. Kontekst obejmuje zmienne zdefiniowane w zakresie funkcji (i te globalne), co swoją drogą nasuwa ciekawą koncepcję, „domknięcia”, które ustanawiają cały styl programowania w JAVASCRIPT. To powiedziawszy, można było się tego spodziewać this, który odnosi się do obiektu, gdy jest używany w kodzie go definiującym, kontekst wykonania, w którym został zdefiniowany, jest zachowywany, ale ten, którego używa, jest kontekstem, z którego wywoływana jest funkcja. To zachowanie jest w większości przypadków przezroczyste, ale istnieją dwie okoliczności, w których może być mylące: funkcja zdefiniowana wewnątrz innej funkcji i metoda wywoływana ze zdarzenia obiektu. window.

    Podczas wykonywania poprzedniego kodu w konsoli wyświetlany jest tekst z komentarzem na końcu. Dwie zaznaczone linie odzwierciedlają zachowanie, które może być mylące: kontekst wykonania funkcji probar_dentro() nie probar()jak można się było spodziewać, ale window, który pokazuje zmienne globalne, a nie właściwości o tej samej nazwie. Jeśli nie chcesz takiego zachowania, po prostu utwórz zmienną w funkcji najwyższego poziomu i przypisz ją do this, jak w poniższym kodzie.

    Aby kontrolować kontekst wykonania, gdy metoda jest wywoływana ze zdarzenia window, na przykład poprzez zmianę rozmiaru okna przeglądarki, co jest kolejną osobliwością JAVASCRIPT: możliwość programowania „fabryk funkcji”, czyli funkcji generujących inne funkcje, zwracając je return.

    W powyższym przykładowym kodzie metoda llamar() obiektów Contexto Nie wykonuje całej pracy, ale zwraca anonimową funkcję, która się tym zajmuje. Aby sprawdzić, czy wszystko działa zgodnie z oczekiwaniami, istnieje zmienna globalna o tej samej nazwie, co właściwość wyświetlana przez funkcję w konsoli; Jeśli kontekst jest poprawny, zostanie wyświetlona wartość właściwości, a nie zmiennej globalnej.

    JAVASCRIPT Spróbuj poprawić znaki średnika, które pomijamy na końcu zdań. Pozwala to na swobodny styl pisania, ale jest mieczem obosiecznym, z którym należy obchodzić się ostrożnie. W większości przypadków, aby uniknąć niepożądanych efektów, jakie powoduje to w wyrażeniach zajmujących kilka wierszy, można użyć nawiasów lub poprzedzić sposób, w jaki JAVASCRIPT zinterpretuje kod; Dlatego linia 8 przykładu zawiera function z tyłu return, gdybym użył innego wersu, znaczenie byłoby zupełnie inne. Moim zdaniem najbardziej czytelnym rozwiązaniem jest użycie zmiennej pośredniej (zbędnej) jak w poniższej wersji; Oczywiście po zrozumieniu zachowania decyzja należy do programisty.

    W tym samym sensie oceniania wyrażenia jako funkcji, to znaczy zwracania funkcji, a nie wartości, którą funkcja zwraca; w linii 21 ostatniego przykładu (było w linii 19 poprzedniego) kończy się clearInterval funkcja wywołana with setInterval. Aby mógł działać przez 30 sekund, zatrzymanie zostaje odroczone za pomocą setTimeout, co z kolei wymaga funkcji jako pierwszego argumentu; aby dostarczyć wykonanie jako parametr clearInterval ze zmienną zawierającą wywołanie okresowe (a nie funkcję clearInterval) jest tym, do czego utworzono funkcję anonimową w ostatniej linii.

    Wybór pomiędzy napisaniem kodu integrującego definicję funkcji, bardziej zwartego (jak w linii 21) lub użyciem zmiennej pomocniczej, moim zdaniem, bardziej czytelnej (jak w liniach 19 i 20) różni się nieznacznie pod względem wydajności i zależy od większego stylu i czytelności konserwacja.

    Aby przetestować kod, zanim dane znajdą się na serwerze, można skorzystać z generatora wartości losowych z żądanego zakresu lub przygotować tabele z kontrolowanymi wartościami, które symulują działanie w zadanych warunkach. Poniższy przykład wykorzystuje prosty generator danych w całym zakresie, dlatego wydają się one nieco przesadzone.

    Aby przetestować, możesz pobierz pełny kod przykładu utworzony przez stronę internetową napisaną w HTML, styl CSS i kod JAVASCRIPT. To ostatnie jest najbardziej istotne, ponieważ pozostałe komponenty mają jedynie minimalne wsparcie, są bardzo uproszczone i są znacznie bardziej rozwinięte w artykułach w odpowiednich sekcjach.

    Zamieść komentarz

    Być może przegapiłeś