Az IoT-hez JavaScript segítségével csatlakoztatott érzékelők adatainak SVG-grafikáinak létrehozása és módosítása

Az IoT-hez JavaScript segítségével csatlakoztatott érzékelők adatainak SVG-grafikáinak létrehozása és módosítása

Az IoT-hez JavaScript segítségével csatlakoztatott érzékelők adatainak SVG-grafikáinak létrehozása és módosítása

A rajzról szóló cikksorozat utolsó részében grafikák a dolgok internetéhez csatlakoztatott érzékelők adataival, itt az ideje, hogy beszéljünk arról, hogyan lehet létrehozni vagy módosítani JavaScript rajzok formátumban SVG és néhány elem HTML amelyek tárolóként szolgálnak, vagy amelyek kiegészítő információkat jelenítenek meg a grafikához.

Tartalomjegyzék

    Adatgrafikonok az Internet of Things (IoT) tárolóhoz csatlakoztatott érzékelőktől HTML-benA dolgok internetéhez (IoT) csatlakoztatott érzékelők adatainak grafikonjai a CSS-ben való megjelenés meghatározásaAdatgrafikonok a Dolgok Internetéhez (IoT) csatlakoztatott érzékelőktől, SVG-vel rajzolvaAdatgrafikonok az Internet of Things (IoT) érzékelőktől Előállítás és módosítás JavaScript segítségével

    Az oktatóanyag célfelhasználóinak elektronikai és számítógépes programozási profilt kell alkotniuk. mikrovezérlők, lehet, hogy nem ismerik HTML, CSS o SVG; Emiatt az előző részekben rövid bemutatkozás készült a nyelvről vagy a megfelelő technológiáról. Ebben az utolsó részben a megközelítés egy kicsit más, hiszen az olvasók biztosan tudnak programozni, lehetséges, hogy a nyelv használatával C + + hogy, hogyan JavaScript, megosztja az alapvető szintaxist C és referenciaként használható arra, hogy kihagyjuk a legtöbb alapvető programozási koncepciót, és így a különbségekre és arra a konkrét felhasználásra összpontosítunk, amely érdekli a szenzorgrafikák létrehozása az IoT-ben.

    A név utal az első különbségre: JavaScript Ez egy programozási nyelv forgatókönyv (kötőjel), és mint ilyen, az értelmezhető, nem kell lefordítani; az a kontextus, amelyben a forgatókönyv (például egy webböngésző) elolvassa, lefordítja és végrehajtja a megbízásokat. Hogy pontosak legyünk, a legtöbb esetben létezik a futásidejű fordítás (JIT), hanem a kódírási folyamathoz JavaScript Ez minket nem érint, egyszerűen megírjuk a kódot és működhet.

    A név tartalmazza az első félreértést is: JavaScript a legcsekélyebb kapcsolata sincs vele Jáva. Kezdetben, amikor kidolgozták Netscape böngészőjéhez először Mocha, majd a kevésbé zavaró LiveScript nevet kapta. A böngészőkben való sikeres implementáció után, és azokon túllépve szabványosították a ECMAScript (To ECMA-262, 6-os verzió az írás idején), hogy semlegessé váljon az azt megvalósító böngészők tekintetében. Jelenleg is létezik szabvány ISO 5-es 2011-ös verziótól (ISO / IEC 16262: 2011 a cikk írásakor)

    Változók, alapvető adattípusok és objektumok JavaScriptben

    Ellentétben azzal, ami pl C + +, en JavaScript az adattípus nem szerepel a változó deklarálásakor és a változóhoz tartozó típus sem fix, lehetőség van más típusú érték hozzárendelésére a program végrehajtása során.

    Az előző példában a "dolog" változót deklaráltuk (az adattípus megjelölése nélkül), majd más típusú adatokat rendelünk hozzá, és lekérdezzük typeof az a típus JavaScript hogy ő tolmácsolta. A kód hibakereséséhez beírhatja a webböngésző Inspector konzoljába (ami nem befolyásolja a web megjelenítését) console.log().

    Az adatok meghatározott típussá konvertálásához, különösen a szöveg numerikussá, olyan funkciókat használhat, mint pl parseInt() o parseFloat() amelyek rendre egész számokká vagy lebegőpontos számokká konvertálnak. Ezzel az ellenkező átalakítást is meg lehet tenni String(), bár valószínűleg nem lesz rá szükség, mivel általában elegendő az automatikus átalakítás. Val vel parseFloat()Például megkaphatja egy weboldal tulajdonság értékét, például egy objektum szélességét vagy magasságát, amely egységeket tartalmaz; Ily módon a kifejezés parseFloat("50px"); eredményként 50-et, egy numerikus értéket ad vissza.

    En JavaScript nincs különbség kettős és szimpla idézőjel között; Az adattípus mindkét esetben az string, és mindegyik tartalmazhatja a másikat anélkül, hogy szükség lenne escape kódokra.

    Az előző példában látható, hogy egy változó, ha deklarálva van (létezik), de nem kapott értéket, meghatározatlan adattípust tartalmaz (undefined). Egy hozzá nem rendelt objektumnak van értéke null; Vagyis a tárgy létezik, de érték nélkül; a rá hivatkozó változónak nem lenne a typeof undefined de object. Egy objektum lehet üres is, azaz nem nulla, de nem rendelkezik semmilyen tulajdonsággal.

    hogy definiáljon egy objektumot JavaScript zárójelbe zárják ({ y }) a tulajdonságokat vagy módszereket kettősponttal elválasztva (:) tulajdonság neve tulajdonság értéke és vesszővel (,) a különböző tulajdonságokat. Az objektum kifejezésének erről a módjáról további információkat találhat a cikkben JSON formátum.

    Bár használhat olyan szintaxist, amely másként gondolkodhat, en JavaScript Nincsenek osztályok, csak prototípusokVagyis ahhoz, hogy egy objektum örökölje a tulajdonságokat és metódusokat, létrejön egy másik objektum (a prototípus), amelyet a többiek (a gyerekek) referenciaként használnak. A stílushoz legközelebb álló szintaxis JavaScript prototípust használni az Object.create bár az is lehetséges (és néha hasznos is). new mint más objektumorientált nyelvekben.

    hogy lekérdezi, ha az egyik objektum egy másik példánya, ha prototípusként használod, ha örökölöd a tulajdonságait, egyszóval használhatod instanceof (alkalmazva new) o isPrototypeOf (alkalmazva Object.create), amely igazra értékeli, ha az objektum használja a prototípust, és hamisra, ha nem.

    Ha egy objektumot egy másik prototípus felhasználásával hoztak létre, vagyis ha egy objektumot példányosítottak, akkor új tulajdonságok hozzáadása vagy prototípus tulajdonságainak felülírása pont szintaxis használatával, mint itt gato.peso=2.5.

    La tömbök be JavaScript Eltérnek azoktól, amelyeket valószínűleg ismer C. Kezdetben hosszuk feltüntetése nélkül deklarálják őket, csak a nyitó és záró szögletes zárójelekkel ([ y ]), az összetevők lehetnek heterogének (különböző adattípusok ugyanabban a tömbben), és új elemek hozzáadhatók korlátozás nélkül. A mátrixok JavaScript valójában olyan elemek listái (gyűjteményei), amelyekhez számmutatóval vagy névvel hivatkozva. Egy tömb egyidejűleg tartalmazhat numerikus indexeket és elemneveket, de gyakori, hogy objektumokat (tulajdonságokat) használnak a második típus kihasználására.

    Amint az az előző példában látható, annak megtudásához, hogy egy változó megfelel-e egy tömb példányának (ez egy tömbobjektum), használhatja instanceof, ahogyan azt már általános objektumoknál használták, vagy a legújabb verzióiban JavaScript igénybe veheti Array.isArray()

    A tömb elemeinek eléréséhez használhatja az indexét (matriz[7]) vagy a tulajdonság nevével, a névvel szögletes zárójelben (matriz["nombre"]) vagy az objektumok szokásos pont szintaxisával (matriz.nombre). Mivel a név egy szöveges karakterlánc, egy kifejezés, beleértve a változókat is, felhasználható az összeállításához. Tulajdonságokkal rendelkező tömbön való hurkoláshoz használhat egy ciklust a formátummal for(propiedad in matriz).

    Célunk szempontjából érdekes kezelni a tárgy Date, amellyel megjelenítheti és kezelheti a dátumot és az időt JavaScript. Az objektum adat nélkül is példányosítható, így az aktuális dátumot és időt veszi fel, vagy létre lehet hozni egy dátum értékként történő megadásával, akár ezredmásodpercben 1. január 1970-je óta (pl. Unix idő vagy POSIX idő de másodpercek helyett ezredmásodpercben fejezik ki) vagy külön év, hónap, nap, óra érték megadásával...

    Az objektum egy teljes sorozatot tartalmaz módszerek a dátum és az idő lekérdezésére vagy beállítására:

    • now()
      Az aktuális dátumot és időt adja vissza ezredmásodpercben 1. január 1970. óta

    • getTime() | setTime()
      Lekéri vagy módosítja az időértéket ezredmásodpercben 1. január 1970. óta. valueOf(), amely a legtöbb objektumban jelen lévő metódus, a megfelelő Date objektum értékét is megkapjuk, mint pl getTime() a Unix idő vagy POSIX idő ms-ban kifejezve.

    • getMilliseconds() | setMilliseconds()
      Az objektum tört ezredmásodperces részének lekérdezésére vagy beállítására szolgál Date amelyen kivégzik. Ha megvizsgáljuk, a kapott érték 0 és 999 között van, de nagyobb értékek is hozzárendelhetők, amelyek felhalmozódnak a teljes dátumban és időben, így a többi get metódushoz hasonlóan az objektum értékének növelését szolgálja. Date (vagy csökkentse, ha negatív értékeket használ).

    • getSeconds() | setSeconds()
      Visszaadja vagy módosítja az objektum másodperceinek értékét Date.

    • getMinutes() | setMinutes()
      Az objektum perceinek lekérdezésére vagy beállítására szolgál Date.

    • getHours() | setHours()
      Lehetővé teszi az objektum óráinak megtekintését vagy módosítását (0 és 23 között). Date.

    • getDay()
      A hét napját adja vissza a dátumhoz, 0 és 6 közötti értékben kifejezve (vasárnaptól szombatig).

    • getDate() | setDate()
      Visszaadja vagy módosítja az objektum hónapjának napját Date amelyen alkalmazzák.

    • getMonth() | setMonth()
      Az objektum hónapszámának lekérdezésére vagy módosítására szolgál Date.

    • getFullYear() | setFullYear()
      Lekérdezi vagy beállítja az év értékét a dátumot és időt tartalmazó objektumon.

    A korábbi módszerek Date verziót is tartalmazzon UTC hogy az univerzális idővel közvetlenül dolgozhassunk anélkül, hogy közbenső számításokat kellene végezni. Ilyen értelemben pl. getHours() van egy verziója getUTCHours() o getMilliseconds() egy alternatíva getUTCMilliseconds() felváltva a hivatalos (törvényes) vagy egyetemes idővel dolgozni. Val vel getTimezoneOffset() Tudja, mi a különbség az egyetemes idő és a helyi hivatalos idő között.

    JavaScript funkciók

    Ha ezt olvasod, biztosan tudod, hogyan kell programozni. mikrovezérlők en C Az in C + + és ismerje a funkció fogalmát. Bár az alapötlet ugyanaz, in JavaScript Meghatározásuk és használatuk módja kissé eltér. Kezdetben már elhangzott, JavaScript Nem használ kifejezetten adattípusokat, így a függvény definiálásakor nem kell feltüntetni. Követni, Egy függvénynek nem kötelező neve, lehetnek névtelenek. Változóhoz társíthatók a meghíváshoz, de előfordulhat, hogy nincs is rá szükség, mert esetenként célszerű azonnal meghívni őket, amihez a zárójeleket és a paramétereket a függvény definíciója után hozzá kell adni.

    Függvény meghatározásához az előtagot function, ha alkalmazható, zárójelben írja be a nevet, az argumentumokat (a függvénynek átadott paramétereket), és a függvény meghívásakor végrehajtandó kódot kapcsos zárójelek közé.

    Természetesen az előző példában az "eredmény" változóra egyáltalán nem volt szükség, de jó ürügy arra, hogy emlékezzünk a változó hatókör, ami a várt módon működik: az "eredmény" változó csak a "double" függvényen belül létezik. Ban ben JavaScript is használható lethelyett var, egy változó kódblokk-kontextusba való hatókörébe (kapcsos zárójelek közé zárva, { y })

    Amikor az előző részben az objektumokról beszéltünk, valami alapvető hiányzott: a tulajdonságok definiáltak, de a metódusok nincsenek meghatározva. Ahogy az várható volt, az objektum metódusok függvények, nincs nevük, és az objektumdefiníció által hozzárendelt (tulajdon)névből használatosak (meghívásuk).

    Az előző példában már létezik egy "view_temperature" metódus, amely a "current_temperature" tulajdonság értékét jeleníti meg a konzolon keresztül. Nem túl hasznos, de teljesebb képet ad arról, hogy mi is az objektum meghatározása JavaScript.

    Egy objektum (függvények) metódusainak eléréséhez a tulajdonságaihoz használja a this, mint az előző példában a 11. sorban, a „current_temperature” tulajdonság használatakor.

    Hozzáférés a dokumentumobjektum-modellhez (DOM) JavaScript segítségével

    -tól JavaScript Hozzáférhet annak a weboldalnak a tartalmához, amelyen az fut, valamint az oldalt megjelenítő böngésző egyes elemeihez, bár nem a rendszererőforrásokhoz. Az adatstruktúra, amely támogatja az innen elérhető tulajdonságokat és metódusokat JavaScript az ablak objektum része, konkrétan az objektum (a dokumentum) tartalma HTML) az objektumnak felel meg document. Bár néha az áttekinthetőség kedvéért használják, nem szükséges a metódusok vagy tulajdonságok előtt ablak előtt hivatkozni rájuk, elég pl. document, nem kell a gyökérobjektum nevét úgy beírni, mint a window.document, mindaddig, amíg az aktuális ablakra hivatkozik.

    A leggyakrabban használt formája keressen egy objektumot a dokumentumban HTML A módszeren keresztül történik getElementById(), amelyhez a kód létrehozásakor jelzett azonosító argumentumként kerül átadásra HTML. Az előző részekben leírtak alapján könnyen feltételezhető, hogy az objektumon belüli összetevőket is elérheti document pont szintaxis használatával (document.componente) vagy zárójelben használja mindkét nevet (document["componente"]), a leghasznosabb, például a numerikus index, amely nehezen használható és nem praktikus egy kézzel összeállított weboldal tartalmának elérésekor.

    a JavaScript tudsz lekérni azt az elemet, amely egy másik elemet tartalmaz (elem vagy szülő csomópont) ingatlanának tanácsadása parentNode vagy a tulajdonát parentElement, a különbség az, hogy a szülő elem (parentElement) a karakterlánc utolsó eleme DOM Ez null (null) és a szülőcsomópont (parentNode) maga a dokumentum (document).

    hogy módosítani egy elem tartalmát HTML, például egy címkét <div>, Használható innerHTML és tulajdonságainak megváltoztatásához választhat, hogy egy másik osztályt rendel hozzá className vagy egyedileg módosíthatja a tulajdonságait style. A weboldal elemei által megjelenített stílus megtekintése nem feltétlenül hasznos style mivel ez több tényezőtől is függhet, vagy egyszerűen nem határozták meg kifejezetten. A weboldalon végül megjelenő elem stílusának ellenőrzéséhez a getComputedStyle metódust használjuk.

    Egy dokumentumelemhez HTML Több osztály is hozzárendelhető hozzá, hogy meghatározzuk megjelenését és viselkedését innen kezelheti egy objektum osztálylistáját JavaScript igénybe veheti classList amely a módszereket kínálja add új osztály hozzáadásához a listához, remove eltávolítani, toggle lecserélni, vagy megnézni egy elem osztálylistájának tartalmát item és contains, amely visszaadja a listában egy bizonyos pozíciót elfoglaló osztályt és egy értéket true o false hogy egy bizonyos osztály szerepel-e a listán vagy sem.

    Az előző példában a következővel található: getElementById a kezelni kívánt objektum (egy elem <div> az ő számára id), a megjelenés megváltoztatása előtt a tartalom törlésre kerül a -val történő hozzárendeléssel innerHTML üres szöveges karakterláncot, akkor új osztályt rendel hozzá className stílusa pedig módosul style a tartalom (hőmérséklet) értékétől függően színváltoztatás, adott esetben az ingatlanon keresztül color. A szempont létrehozása után az érték újra a használatával kerül kiírásra innerHTML.

    A fenti példa második részében (9-19. sorok) egy kódelem érhető el HTML a szintaxist használva document[] és az ingatlan id az elem osztálylistájának módosításához a metódussal classList.remove() és a módszerrelclassList.add(), több lekérdezés eredménye alapján, amelyeket feltételes végrehajtásban hajtanak végre, és ezeket összehasonlítják classList.contains().

    Mikor fog elemre hivatkozik HTML számos alkalommal a kódban JavaScript, ez egy kicsit hatékonyabb hozzárendelni egy változóhoz vagy használja az indexét a név helyett, mivel ellenkező esetben az Ön által használt módszer JavaScript minden alkalommal meg kell keresni a nevét, ami kicsit több időt vesz igénybe, mintha egy változót elérnénk.

    hogy új objektumok hozzáadása a dokumentumhoz HTML, először a módszerrel hozhatók létre createElement de document és később beépítik őket a többi elembe a fa azon pontján, amelyre szükség van appendChild. Objektum létrehozásához XML, mint a tárgyak SVG amelyet az IoT-érzékelők grafikonjának megrajzolásához használunk, használhatja createElementNS (NS for névtér). Ahogyan a formátumról beszélünk SVG, a neki megfelelő névtér (az aktuális verzióhoz). http://www.w3.org/2000/svg, amelyet át kell adni createElementNS argumentumként az elem típusával együtt, svg, ebben az esetben.

    egy alternatívája innerHTML hogy szöveget adjunk tartalomként egy dokumentumelemhez HTML a módszer createTextNode() az objektum document. Ezzel az alternatívával megteheti új szöveget létrehozni (amely később elérhető, ha változóhoz van rendelve), amely a metódussal beépül az objektumfába appendChild(). Hogyan alternatívája appendChild(), amely hozzáadja az új tartalmat annak a csomópontnak a végéhez, amely már létezik abban a csomópontban, amelyhez hozzáadta, használhatja a módszer, a metódus insertBefore(), amely egy új objektumot ad egy meglévő elé. Viselet insertBefore() helyett appendChild() olyan módszert biztosít, amely például arra szolgál rendezze az új objektumokat a meglévők elé amikor egy elemnek egy másik előtt kell lennie (mint egy listában), vagy fednie kell vagy le kell fednie egy olyan grafikus struktúrát, amelyben az előtérhez vagy a háttérhez közelebbi elemek vannak.

    Reagálj az eseményekre JavaScript segítségével

    Amikor az utat használjon egy weboldalt tárolóként az IoT-hez kapcsolódó szenzorgrafikonokhoz azt használták onload A címkén <body> hogy elkezdje rajzolni a grafikont. Ez a kódobjektumokhoz társított tulajdonság HTML, utal a Események JavaScript. Ahogy már kifejtettük, az oldal betöltésekor végrehajt egy funkciót. Bár a kódhoz társították HTML hogy jobban észben tartsuk, a kódba bele lehetett volna írni JavaScript mint body.onload=dibujar; lét dibujar annak a függvénynek a neve, amelyet a weboldal betöltésekor el kell indítani.

    A legújabb verziókban JavaScript Az események a függvényekkel társíthatók addEventListener a formátummal objeto.addEventListener(evento,función); vagy a szintaxis használatával objeto.evento=función; amely régebbi megvalósításokban is működik. Az eseményhez társított funkció leválasztásához meg kell tennie removeEventListener amelynek formátuma megegyezik addEventListener.

    JavaScript Képes reagálni a weboldalon előforduló események sokaságára. Például képes érzékelni, ha egy elemre kattintanak HTML a onmousedown, vagy ha rákattint onclick, ha egy billentyűt lenyomnak a gombbal onkeydown, a görgetősáv használatával onscroll. Célunknak ez elég nekünk oldalbetöltés észlelése onload és átméretezése -val onresize. Ezeket az eseményeket társítjuk a tárgyakkal body y window del DOM illetőleg. Az első hozzárendelhető a kódban HTML, amint látható és a második a kódon belül JavaScript az első által meghívott függvényen belül és a formátummal window.onresize=redimensionar; lét redimensionar a függvény, amely minden alkalommal meghívásra kerül, amikor az ablak mérete megváltozik.

    Fuss egy időintervallum után

    JavaScript két forrása van halasztott végrehajtás: setTimeout, amely egy időintervallum után végrehajt egy függvényt és setInterval amely bizonyos időintervallumonként végrehajt egy függvényt. Mindkét módszer paraméterként megköveteli (1) a meghívott függvényt és (2) az ezredmásodpercben kifejezett időintervallumot. Működésük leállításához a függvények által visszaadott eredményt hozzárendelheti a változókhoz, és argumentumként átadhatja őket clearTimeout vagy clearInterval amikor nem akarja újra meghívni őket (vagy ha nem akarja, hogy először hajtsák végre őket) setTimeout o setInterval volt.

    Az előző példában a módszert mutatjuk be alert amely figyelmeztető tábla megjelenítésére szolgál. Bár korábban széles körben használták, jelenleg szinte ki van tiltva a kódból JavaScript mert mennyire agresszív (tolakodó) a weblapot egy párbeszédpanel borítani.

    A számára írt programban mikrovezérlő egy kis sorozatból (mint amilyen a tányéron van). Arduino Uno) általános a globális változók használata, mint az előző példában JavaScript, mivel a kód rövid és nem különösebben zavaró, mert sokszor ad hoc módon valósulnak meg a funkciók, és mert a globális változók használata nagyon egyszerű és intuitív módon teszi lehetővé a memóriahasználat előrejelzését, ami kritikus a kevés erőforrással rendelkező rendszerekben. . Helyette, en JavaScript Gyakori, hogy a globális változók használatát a lehető legkisebbre csökkentik. mert nem kell siettetni a memóriahasználatot, mivel rendesen fut a CPU erőforrásaival, amelyek messze felülmúlják a MCU, mert valószínűleg sok harmadik féltől származó kóddal együtt létezik, amelyekkel beavatkozás nélkül kell működnie, és mivel nyílt rendszerről van szó, a jövőbeni végrehajtási környezet nem jósolható meg (a mikrovezérlő Small teljesen meghatározza a működését anélkül, hogy a működés után további kódot adna hozzá), és mivel az alkalmazások méretei megnehezíthetik az olvasást, ha a kód nem zárja be a működését, így a módszerek a lehető legönállóbbakká válnak.

    Matematikai műveletek a JavaScript Math objektummal

    A bonyolultabb matematikai számítások matematikai műveletei az objektumban vannak csoportosítva Math. Ezt az objektumot közvetlenül használjuk, nem szükséges példányosítása a benne foglalt metódusok vagy tulajdonságok (konstansok) használatához.

    • Math.abs(n) Az n paraméter abszolút értéke
    • Math.acos(n) Az n paraméter arkoszinusza (eredmény radiánban)
    • Math.asin(n) Az n paraméter arcszinusza (eredmény radiánban)
    • Math.atan(n) Az n paraméter arktangense (eredmény radiánban)
    • Math.atan2(n,m) n/m arktangens (az eredmény radiánban)
    • Math.ceil(n) Kerekítse fel a paramétert a legközelebbi egész számra
    • Math.cos(α) Az α paraméter koszinusza (α radiánban)
    • Math.E e-szám (≃2.718281828459045)
    • Math.exp(n) e az n paraméterre emelve: en
    • Math.floor(n) Kerekítse le az n paramétert a legközelebbi egész számra
    • Math.log(n) Az n paraméter természetes logaritmusa (e bázisa).
    • Math.LN2 2-es természetes logaritmus (e bázis) (≃0.6931471805599453)
    • Math.LN10 10-es természetes logaritmus (e bázis) (≃2.302585092994046)
    • Math.LOG2E e 2. alapú logaritmusa (≃1.4426950408889634)
    • Math.LOG10E e 10. alapú logaritmusa (≃0.4342944819032518)
    • Math.max(a,b,c,…) Az átadott paraméterek listájának legnagyobb értéke
    • Math.min(a,b,c,…) Az átadott paraméterek listájának legkisebb értéke
    • Math.PI π szám (≃3.141592653589793)
    • Math.pow(n,m) Az első n paraméter a második m paraméterre emelve: nm
    • Math.random() (Majdnem) véletlen szám 0.0 és 1.0 között
    • Math.round(n) Az n paramétert a legközelebbi egész számra kerekítse
    • Math.sin(α) Az α paraméter szinusza (α radiánban)
    • Math.sqrt(n) Az n paraméter négyzetgyöke
    • Math.SQRT1_2 1/2 négyzetgyöke (≃0.7071067811865476)
    • Math.SQRT2 2 négyzetgyöke (≃1.4142135623730951)
    • Math.tan(α) Az α paraméter tangense (α radiánban)

    Adatok betöltése a szerverről AJAX-szal

    Az IoT-ben tárolt információk megrajzolásának módszere abból áll, hogy időről időre betöltik az adatokat a szerverről, és újrarajzolják azt a grafikont, amellyel ábrázolják őket. A szerverről származó adatok olvasásához technológiát használnak AJAX (aszinkron JavaScript és XML) tárgyon keresztül XMLHttpRequest de JavaScript. Az adatgráf ábrázolása egy objektum újrafelhasználásával történik SVG ami már benne van a kódban HTML és amely egy diagramot tartalmaz, amelynek koordinátáit úgy módosítjuk, hogy azok megfeleljenek az újonnan betöltött adatoknak.

    A javaslat példájában a rajz frissítése mellett egy olyan szöveg is frissül a weboldalon, amely minden grafikonhoz mutatja az utolsó mért adat dátumát és értékét.

    A szerver oldalon van egy adatbázis, amely tartalmazza az információkat hogy az IoT-hez csatlakoztatott érzékelők figyelték. Ezt az adatbázist az objektumkérés olvassa be XMLHttpRequest a kódolt információval válaszol JSON formátum, bár az alkalmazott módszer neve a formátummal való kapcsolatra utal XML.

    Az első polaridad.es oktatóanyagban a IoT adattárolás Láthat egy példát egy olyan infrastruktúrára, amely szerveroldalról kezeli a tárgyak internetéhez csatlakoztatott eszközök által szolgáltatott információkat. Ebben a cikksorozatban egy szervert használunk erőforrásként Apache amelyből használhatja a programozási nyelvet PHP adatbázis eléréséhez MySQL o MariaDB. Az IoT támogatására használt szervereken nagyon gyakori az adatbázisok keresése MongoDB (NoSQL) és a programozási nyelv JavaScript tovább node.js mint szoftver infrastruktúra.

    A következő funkció a legfrissebb adatok lekéréséért felel az egyik érzékelőtől a szervertől. A függvényhívásban az objektumot argumentumként használják JavaScript amely támogatja a rajzolt adatokat. Ha ugyanaz a gráf több értéket ábrázol, például egy összefüggés vizuális keresése érdekében, akkor kérhető a szerver, hogy egyszerre több értéket adjon vissza, ami a szerver működése miatt optimálisabb módszer. HTTP protokoll.

    Az előző példa harmadik sorában készül el a szerver felé irányuló lekérdezés, amelyben a "zóna" argumentum kerül átadásra, melynek értéke a megfigyelt hely neve vagy kódja lesz, mivel a különböző érzékelők (például hőmérők, amelyek különböző helyiségekben mérik a hőmérsékletet). Az előző függvénynek, a diagramadatokat tartalmazó objektumnak átadott paraméternek tartalmaznia kell egy tulajdonságot a szoba nevével ("name_suffix").

    Az előző kód 7. és 14. sora között a objektum XMLHttpRequest amelyet az "ajax" változóban tárolunk. Mielőtt kiválasztaná az objektum létrehozásának módját, keressen window ha XMLHttpRequest nem volt elérhető (valami, ami a Microsoft Explorer régi verzióiban történt, és bár messze elmaradt, példaként szolgál az objektum (natívabb) szintaxissal történő létrehozására) Object.create o new, hasonlóan a többi objektum-orientált nyelvhez.

    A válasz azonnali kezelése érdekében a 15-26. sorokban elkészítjük az azt kezelő kódot, mielőtt a kiszolgáló felé fordulna.

    Az út hajtsa végre a lekérdezést HTTP hogy a szerver áll kapcsolatot nyitni a open típus és oldal jelzése (opcionálisan felhasználónév és jelszó), készítse elő a fejléceket a protokollból setRequestHeader y küldje el a kérést a send. A fejléc HTTP Content-length tudnia kell a lekérdezés hosszát (karakterek számát), amelyet a segítségével számítanak ki length.

    Amikor a kérés AJAX készen áll, az eseményhez tartozó funkció végrehajtásra kerül onreadystatechange. Funkció hozzárendelése helyett az előző példában egy anonim függvényt definiálunk menet közben, amely a szerverről érkező adatok fogadását fogja kezelni. Először is a 18. sorban ellenőrizzük, hogy a kérés állapota "befejezett", ami megfelel az értéknek. 4 az ingatlan readyState, hogy az állapot "OK" a HTTP protokoll (kód 200), amely az ingatlanból beszerezhető status és hogy a megérkezett adatok az JSON formátum, tanácsadás az ingatlannal responseType.

    Miután ellenőrizte, hogy a válasz állapota a vártnak megfelelő-e, az előző példa 20. sorában objektumot hoz létre az eredménnyel, átalakítva a szöveget JSON. A válasz megadja a visszaküldendő dátumot, ez lehetővé teszi, hogy megnézzük, hogy a szerver által küldött eredmény szerepel-e már korábban a grafikonon, amit a 21. sorban ellenőriztünk. Ha az adatok újak, a 23. sorban Az a függvény, felelős a grafikon újrarajzolásáért az új információkkal ún.

    Ennek az olvasási módszernek az a gondolata, hogy az adatokat nagyon gyakran frissítik. Ha a bemutatott információ hosszú távnak felel meg (például egy nap vagy egy hét hőmérséklete), akkor végrehajtható egy kezdeti kérés, amely összegyűjti az összes rendelkezésre álló adatot, majd egy, a példában szereplőhöz hasonló, amely frissíti azokat az időszaki tudósító.

    Véletlenszerű adatokat generál a teszteléshez

    Amikor az összes szerver és kliens infrastruktúra készen áll, az előző részhez hasonló függvény lesz felelős az adatok beolvasásáért és a grafikon megrajzolásáért, de A tesztelési szakaszban célszerűbb lehet véletlen számokat használni egy ellenőrzött tartományon belül hogy megnézze, helyes-e az írott kód. A következő funkció példaként szolgálhat adatok beszerzésére a végső alkalmazás felépítése során.

    Ahelyett, hogy egy adatbázisból olvasná ki az információkat, a fenti példa véletlenszerűen generálja azokat, és átadja a grafikon megrajzolásáért felelős függvénynek. A kitalált adat egy vektor, amelyet egy ezredmásodpercben kifejezett dátum, a szenzor információ rögzítésének pillanata és a megfigyelt adat alkot, amely egy maximális érték és egy minimális érték között van.

    Ebben a példában egy dátum generálásakor az akár egy másodpercig (1000 ezredmásodpercig) késleltethető a feltaláláskori dátumhoz képest. Mint Math.random() 0.0 és 1.0 közötti számot generál, 1000-zel megszorozva 0 és 1000 közötti számot kap, amelyet aztán egész számmá alakít. Ugyanígy az értéket úgy kapjuk meg, hogy a véletlen számot megszorozzuk a tartománnyal (maximum mínusz minimum), és összeadjuk a minimumot.

    Rajzolja meg az IoT-érzékelők grafikonját SVG-grafikonnal

    Mivel láttuk, hogyan kaphatjuk meg az ábrázolni kívánt értékeket (hőmérséklet, a példában) és azok időbeli elhelyezkedését, amelyek együttesen koordináták formájában fejezhetők ki, az alábbi példa egy útvonal rajzolására szolgáló függvényt mutat be. amely összeköti ezeket a pontokat és opcionálisan egy színes területet, amelyet az a vonal határol a tetején. Az eredmény olyan lenne, mint a következő képen.

    Példa egy SVG-vel és JavaScripttel generált diagramra, amely az IoT-érzékelőkből származó adatokat ábrázolja

    A grafikon vízszintes tengelye (X) az időt, a függőleges tengely (Y) pedig azokat az értékeket jelöli, amelyeket az IoT-hez csatlakoztatott érzékelők figyeltek. A vízszintes intervallum néhány másodperc, mivel ebben a javaslatban a grafikont nagyon gyakran (például másodpercenként) frissítik, hogy szinte valós idejű információkat nyújtsanak az érzékelők állapotáról.

    Az előző kódban két érdekes szempont van, először is a számítás, amely lehetővé teszi igazítsa a megjelenített értéktartományt másodszor pedig a ingatlanépítés d amely jelzi a pontok koordinátáit az elrendezésen (path).

    A megjelenített értékek tartományának igazítása érdekében azokat a minimumtól elmozdítjuk, és úgy skálázzuk, hogy a látható nagyság megfeleljen a grafikon méretének.. Idő esetén az eltolást úgy kapjuk meg, hogy kivonjuk a megjeleníteni kívánt tartományt a leghosszabb időből (az aktuálishoz legközelebb eső dátum és idő) (a példában 20 másodperc). A hőmérsékleti értékek eltolása az alsó tartomány (egy fok) mínusz a legalacsonyabb érték, így az alább látható adatok a leginkább hasonlítanak a megengedett legalacsonyabb értékhez, de hagynak egy határt, amely lehetővé teszi számunkra, hogy értékeljük az áthaladást.

    Az időértékeket megszorzó együtthatót a grafikon vízszintes koordinátáinak megszerzéséhez úgy kapjuk meg, hogy a grafikon teljes szélességét (a példában 100 egység) elosztjuk a reprezentált időtartománnyal (a példában 20 másodperc). Ahhoz, hogy a skaláris hőmérsékleti értékekkel együtt megkapjuk az együtthatót, emlékeznünk kell arra, hogy a reprezentált tartomány a minimális érték alatti margótól a maximum feletti margóig terjed, mindkét esetben egy fokkal. Ily módon a függőleges skálaegyüttható a grafikon magasságának (a példában 100 egység) elosztásából adódik a maximális értékkel, mínusz a minimum plusz a felső és alsó margó. Mivel ezek az értékek negatív hőmérsékleten teljesen kialakulhatnak, ezért használjuk Math.abs() hogy a különbség abszolút értékét használjuk.

    A tulajdon d az objektum path A szövegben lévő pontok koordinátáinak összefűzésével készül. Minden koordinátapárt egy kód előz meg SVG L, amely vonalat húz az aktuális pozícióból egy abszolút értékre, amelyet a koordináták jeleznek. Az X és Y értékeket vesszővel és minden művelettel választjuk el SVG szóköz választja el a következőtől.

    Az elrendezés elindításához használja a kódot M (mozgás egy abszolút koordinátára). A zárt és kitöltött telek esetén a jobb alsó sarokban, az adatprofilt rajzoló nyitott telek esetében az utoljára ábrázolt értékkel (a legfrissebb) kezdjük. A zárt elrendezés befejezéséhez a kódot használják Z Utolsó pontként azt adjuk hozzá, amelynek az X koordináta értéke megegyezik az egyenes utolsó pontjával, Y koordinátaként pedig a legkisebb képviselt értéket.

    Ebben a példában a függvény dibujar_grafico(), amely az oldalbetöltéskor hívás, megkapja a tesztelendő kezdeti értékeket (nem az utolsó valós idejű értéket), és előkészíti az adatok megjelenítési tartományát: 20 másodperc (20000 ms) vízszintesen és 15°C függőleges -5°C és +10°C között egy fokos felső és alsó margóval. Két hívás kezdeményezése actualizar_grafico(), az első menetben true argumentumként, ami azt jelzi, hogy a diagramot be kell zárni, hogy egy kitöltött területet ábrázoljon, és a második hívásnál átmegy false meghúzni a határt. Minden esetben az objektum path Módosítva az, amelyik a megfelelő megjelenésű, az első esetben kitöltéssel és szegély nélkül, a másodikban pedig bizonyos vonalvastagsággal és kitöltés nélkül.

    A funkció actualizar_grafico() munka egy tárgyon SVG amely a következő kódot használja tárolóként HTML. A tárgy SVG két útvonalat tartalmaz, az egyik a vonal, a másik pedig a kitöltött terület rajzolására szolgál. A weboldal betöltésekor az elemből <body> az előző függvény automatikusan meghívásra kerül, dibujar_grafico() az eseménynek köszönhetően JavaScript onload.

    A kód 10. sorában HTML fent a stílusban 820 px szélesség (példaként) és 150 px magasság van beállítva (amit a végső változatban ajánlatos egy osztályhoz és egy dokumentumhoz tenni CSS). Furcsának tűnik, hogy a 13. és 14. sor határozza meg az objektum méretét SVG mint a 100%-os szélesség és magasság (ami a legjobban megfelel az ablakméreteknek, 100×100). Mint már említettük, ennek az az oka, hogy mindig ismert méretekkel dolgozzunk, és ehhez igazítsuk a megjelenített értékeket. A másik alternatíva az lenne, hogy minden alkalommal kiszámítjuk a grafikon terét, majd újra beállítjuk az értékeket, vagy kényszerítjük a grafikon rögzített méreteit, amelyeket a dokumentumnak be kell tartania.

    Olyan grafikon mellett döntött, amelynek méretei a kód szerint változnak HTML, szükséges az ingatlan szerepeltetése vector-effect a bátorsággal non-scaling-stroke annak megakadályozására, hogy a vonalvastagság deformálódjon, amikor a grafikon nem tartja meg a kiválasztott 1:1 arányt azon a weboldalon, amelyen megjelenik, ahogy az az előző javaslatban is előfordul.

    A diagram „kivágásához”, és csak a kiválasztott terület megjelenítéséhez használja a gombot viewBox. Ebben az esetben úgy döntöttünk, hogy a grafikonnak azt a részét nézzük, amely 0,0-val kezdődik (bal felső sarokban), és mérete 100x100 lefelé és jobbra. A rajz negatív értékű vagy 100-nál nagyobb koordinátákban lévő része nem jelenik meg a weboldalon, még akkor sem, ha az objektumban létezik SVG

    Új elemek hozzáadása az SVG-rajzhoz

    Az előző példában a függvény actualizar_grafico() elrendezést használjon SVG amelyre a tulajdonjog megváltozik d, ami a koordinátaláncot fejezi ki. Az alternatíva az lenne, ha a teljes objektumot minden újrarajzoláskor létrehozná. Az első lehetőség előnye, hogy a grafikus megjelenés (például vastagság vagy szín) a kódban van meghatározva HTML, a korlátozás az, hogy az objektumokat korábban létre kell hozni.

    SVG objektumok létrehozásához használja a createElementNS(), amely lehetővé teszi többek között a névtér. Az alábbi példában egy új szövegobjektum jön létre (text), és egy elemhez van társítva SVG amely már létezik a kódban HTML a webhelyről. Az új elem létrehozása után a tulajdonságok hozzá vannak rendelve setAttribute() és hozzáadódik SVG a appendChild().

    Módosítsa a rajzelemek arányát

    Ha az előző szakasz példájában szereplő függvény segítségével próbálta meg a címkézést, látni fogja, hogy a szöveg deformáltnak tűnik, amikor az objektum aránya a weboldalon (width y height A kódtól HTML) nem egyenlő az ábrázolt területtel (viewBox). Az arány adaptálásához ismerni kell a tárgy méreteit SVG amelyhez megtekintheti az objektum vagy a tároló stílusát HTML, ha az objektum SVG adja át ezt az ingatlant. Tulajdonjog hozzárendelése transform tárgyakhoz SVG az aránytól függő alakváltozás korrigálható skálázó művelettel scale() amelyben az X-beli együttható különbözik az Y-beli együtthatótól.

    SVG lehetővé teszi több objektum csoportosítását, új összetett elemet alkotva, amely a tulajdonságokat is támogatja, mint az egyszerű tárgyak. Ha ugyanazt a transzformációt egyszerre több objektumsorozatra szeretné alkalmazni ahelyett, hogy minden objektum külön-külön, csoportosítható őket ennek az erőforrásnak megfelelően, és egyetlen tulajdonságot alkalmazhat. transform mindegyiknek.

    Ahogy arról beszélünk SVG formátum, egy csoport elemei a címkék közé vannak zárva <g> y </g>. Hozzáadni innen JavaScript elemeket egy csoporthoz SVG használják, amint az az előző példában is látható, appendChild() az új objektum meghatározása után.

    A transzformációk alkalmazásakor eredet megállapításához a tulajdonság objektumokon használható SVG transform-origin, melynek értéke annak a pontnak az X és Y koordinátája, ahonnan a transzformáció kezdődik. Ha a transzformáció eredetének értéke nincs kifejezetten feltüntetve (a webböngészőben), akkor a koordináták középpontja kerül felhasználásra. Sajnos a cikk írásakor az átalakítások viselkedésének megadása az alapértelmezetttől eltérő forrás használatával nem homogén a böngészők között, ezért óvatosan kell használni.

    A skála transzformációval együtt scale Vannak mások, mint például a forgatás rotation és a mozgást translate, amelyek a alternatívája a gráfábrázolásnak: ahelyett, hogy új koordinátákat kapna, ábrázolhatja őket a saját terükben, és átalakíthatja a grafikont, hogy illeszkedjen ahhoz a formátumhoz, amelyben ábrázolni szeretné őket.

    Adjon hozzá hivatkozásokat a diagramhoz

    Most, hogy a grafikon fő része az értékek profillal és kitöltött területtel való ábrázolásával megoldott, kiegészíthető hivatkozásokkal, amelyek segítik az olvasást. Példaként kezdjük azzal, hogy rajzoljunk néhány vízszintes hivatkozást (vonalat), amelyek megjelölik a maximális és minimális elfogadható értékeket, valamint a kívánt értéket. Amint azt elmagyaráztuk, kiválaszthatja, hogy hozzáadja az objektumokat a SVG egyenesen JavaScript vagy manuálisan belefoglalhatja őket a kódba HTML és módosítsa őket később a segítségével JavaScript.

    Logikusnak tűnik, hogy ezeket a vízszintes hivatkozásokat olyan szöveggel jelöljük, amely tisztázza az általuk képviselt értéket. A szöveg kiemeléséhez használhat téglalapokat, amelyek kiemelkednek a háttérből és a grafikából. Mivel a szövegeket méretezni kell az alakváltozás kompenzálásához, mindegyik csoportosítható egy objektumba, amelyre a skálát alkalmazni kell; Ennek a módszernek az a fő előnye, hogy egyetlen művelettel módosítható, ha a grafikontárolót (a böngészőablakot) átméretezzük, és a skála által korrigált arányt módosítjuk.

    A fenti példakódban több érdekes szempont is van. Először is jegyezd meg, hogy konstansokat (globális változókat) használtak arra, hogy a példát olvashatóbbá tegyék a programozásból érkező felhasználók számára. mikrovezérlők en C Az in C + +. Mint később látni fogjuk, a programozás optimális módja JavaScript Ez olyan objektumok használata lenne, amelyek ezeket az értékeket tartalmaznák, és olyan módszereket használnának, amelyek kezelnék a példában szereplő hivatkozásokat vagy általában a grafikont egy éles rendszerben.

    Másrészt az általánosabb kód előmozdítása érdekében külön függvényeket fejlesztettek ki, amelyek kiszámítják a különböző együtthatókat, amelyek korrigálják a grafikon arányát a szöveg módosításához. proporcion_grafico(), az értékek skálája a tartományuktól függően escala() és korrekciós tényező az abszolút értékben ismert mérésekhez, például a referenciaértékekben végzett mérésekhez medida_grafico().

    Ennek a kódnak az olvasása segíthet tisztázni a kontextust, amelyben egy ilyen alkalmazás működik, amely valós időben rajzol grafikát, és rugalmasnak kell lennie ahhoz, hogy különféle grafikus kontextusokban (legalábbis különféle méretekben és arányokban) megjelenjen. Mindenekelőtt az objektumokat kell generálni SVG, vagy "manuálisan" a kódban HTML, akár kódon keresztül JavaScript és mindenesetre utólag hivatkozásokat kell szerezni ezekre az objektumokra, hogy manipulálhassuk őket JavaScript hogy új grafikonokat lehessen rajzolni, és egy már megrajzolt gráf ábrázolása adaptálható legyen a bemutatás közegének változásához.

    Egy másik hivatkozás, amely segíthet egy grafikon egyszerű értelmezésében, a konkrét értékeket képviselő pontok (a vonal csomópontjai). Ebben a példában, amelyben egyetlen magnitúdót ábrázolunk, a szimbólum kiválasztása nem kritikus, de ha több különböző értéket egymásra rakunk a korreláció keresése érdekében, akkor érdekes megkülönböztetni, amellett, hogy más erőforrásokat, például színt használunk. , különböző szimbólumok rajzolásával. A vonalcsomóponthoz használt grafikát méretben és arányban módosítani kell, mint például a szövegeknél, hogy a méretei abszolútak legyenek, és arányai akkor is megmaradjanak, ha a benne lévő dobozé változna.

    Az előző példában már láttuk, hogyan kell kiszámítani a különböző együtthatókat a rajz arányának átméretezéséhez és korrigálásához; A gráf csomópontjainak vagy csúcsainak szimbólumainak kezelését illetően egy lehetséges megoldás lehet az objektumok tárolása. SVG egy vektorba, és módosítsa a pozícióját, amikor a grafikont egy új érték beolvasásával frissítik, vagy amikor a tároló átméretezésével újrarajzolják. Az első esetben a helyzetét, a második esetben az ingatlannal való arányát kellene módosítani transform és a scale. A következő kód a funkció módosítása actualizar_grafico() hogy tartalmazza a gráfcsúcs szimbólumainak áthelyezését.

    A funkció módosításai actualizar_grafico() hogy megkapja az új funkciót actualizar_grafico_puntos() Ezek azok, amelyek az előző példa kódjában kiemeltek. Először az 5. sorban veszünk egy objektumvektort SVG paraméterként. Ez a vektor fogja tartalmazni azokat a szimbólumokat, amelyeket át kell helyezni a gráf új csomópontjaiban.

    A 39. és 40. sorban a középpont új koordinátái vannak hozzárendelve, cx y cy, azokhoz az értékekhez, amelyeket képviselnek. Ha a szimbólum nem a középponton alapult, valószínűleg szükség lesz egy eltolás hozzáadására cx a szélesség fele és be cy fele magasságú, hogy pontosan áthelyezze őket a gráf csomópontjára.

    Az 57-61. sorokban azok a pontok, amelyek megfelelnek azoknak a koordinátáknak, amelyek nincsenek megrajzolva, mert a bal él levágja őket, áthelyeződik a grafikonon kívülre. A koordinátája cy nullára és annak cx tetszőleges negatív számra (nagyobb, mint maga a pont), így nem jelenik meg, amikor a grafikon bal oldalához hasonlóan a SVG.

    Kezelje a diagramot egy objektumból JavaScript segítségével

    Az összes eddig elmagyarázott művelet integrálható egy objektumba, hogy a gráfot az új verziókra jellemzőbb stílusban kezelje. JavaScript. Ennek a megvalósítási alternatívának az a további előnye, hogy leegyszerűsíti több különböző értékű grafikon beépítését ugyanazon a weboldalon.

    Mielőtt a megvalósításról beszélnénk, tekintsük át az objektumok létrehozásának leggyakoribb módjait JavaScript és a funkciók néhány sajátossága, amelyek befolyásolják az IoT szenzorgrafika rajzolására vonatkozó javaslatot.

    Már elmagyarázták, hogy az objektumok létrehozásának új módja a JavaScript (az 5-ös verzió óta elérhető ECMAScript) használatából áll Object.create, amelyet meg kell szokni a "klasszikus" helyett new, ami természetesen továbbra is megfelelően működik, bár célja inkább a nyelvek stílusának szimulálása osztályalapú objektumokkal (JavaScript prototípusokra alapozza az objektumok létrehozását), mint működő alternatíva.

    Az előző kód lehetővé teszi, hogy emlékezzen az objektumok létrehozása közötti különbségekre Object.create o con new. Azt is hangsúlyozni szolgálja, hogy míg a funkció, amellyel az objektum létrejön new bárhol lehet a kódban, az objektumnak már léteznie kell, mielőtt példányosítható vele Object.create (ES5_Object objektum nem függvény).

    A 3. és 4. sorban az objektumot létrehozó függvény tulajdonságainak alapértelmezett értékének beállítása new, minden tulajdonság a megfelelő argumentum értékéhez van rendelve vagy (||), ha nem adtak át argumentumot, vagyis ha nem definiáltak (undefined), mivel ezt a körülményt úgy értékelik false, az alapértelmezett érték hozzá van rendelve.

    A kontextus, amelyben egy függvény végrehajtásra kerül JavaScript két olyan kérdést vet fel, amelyeket fontos szem előtt tartani, és amelyek szintén zavaróak lehetnek a programozási nyelv használatakor, miután másokkal dolgozott együtt, mint pl. C o C + +, a mi esetünkben. A kontextus tartalmazza a függvény hatókörében definiált változókat (és a globálisakat), ami egyébként egy érdekes koncepciót vet fel, a "lezárásokat", amelyek egy teljes programozási stílust hoznak létre a programozásban. JavaScript. Mondjuk erre számítani lehetett this, amely az objektumra utal, ha az azt definiáló kódon belül használják, a végrehajtási környezet, amelyben meghatározták, megmarad, de az általa használt környezet az, amelyből a függvény meghívódik. Ez a viselkedés a legtöbb esetben transzparens, de két körülmény között zavaró lehet: egy másik függvényen belül definiált függvény és egy objektumeseményből meghívott metódus. window.

    Az előző kód végrehajtásakor a konzolban megjelenik a végén kommentált szöveg. A két megjelölt vonal olyan viselkedést tükröz, amely zavaró lehet: a függvényvégrehajtási környezetet probar_dentro() ez nem probar(), ahogy az várható is volt, de window, amely a globális változókat mutatja, és nem az azonos nevű tulajdonságokat. Ha nem szeretné ezt a viselkedést, egyszerűen hozzon létre egy változót a legmagasabb szintű függvényben, és rendelje hozzá this, mint a következő kódban.

    A végrehajtási környezet szabályozása, amikor egy metódust eseményből hívják meg window, például a böngészőablak átméretezésével, ami egy másik sajátossága JavaScript: "függvénygyárak", azaz olyan függvények programozásának lehetősége, amelyek más függvényeket generálnak, visszaadva azokat return.

    A fenti példakódban a metódus llamar() a tárgyak közül Contexto Nem végzi el a munkát, hanem egy névtelen függvényt ad vissza, amely gondoskodik róla. Annak ellenőrzésére, hogy minden a várt módon működik-e, van egy globális változó, amelynek neve megegyezik a függvény által a konzolban megjelenített tulajdonsággal; Ha a kontextus helyes, akkor a tulajdonság értéke jelenik meg, és nem a globális változóé.

    JavaScript Próbálja kijavítani azokat a pontosvesszőket, amelyeket a mondatok végéről kihagyunk. Ez nyugodt írásmódot tesz lehetővé, de kétélű fegyver, amelyet óvatosan kell kezelni. A legtöbb esetben, hogy elkerülje azokat a nemkívánatos hatásokat, amelyeket ez a több sort elfoglaló kifejezésekben okoz, zárójeleket használhat, vagy megelőzheti a JavaScript értelmezni fogja a kódot; Ezért tartalmazza a példa 8. sora function A hátulján return, ha egy másik sort használtam volna, a jelentés nagyon más lenne. Véleményem szerint a legolvashatóbb megoldás egy köztes (elhagyható) változó használata, mint a következő verzióban; Nyilvánvalóan, ha a viselkedést megértjük, a döntés megfelel a programozónak.

    Ugyanabban az értelemben, hogy egy kifejezést függvényként értékelünk, vagyis egy függvényt adunk vissza, és nem a függvény által visszaadott értéket; az utolsó példa 21. sorában (az előző példa 19. sorában volt) ezzel megáll clearInterval -val meghívott függvény setInterval. Annak érdekében, hogy 30 másodpercig működjön, a leállítást elhalasztják setTimeout, amelynek viszont szüksége van egy függvényre első argumentumként; hogy a végrehajtást paraméterként kézbesítse clearInterval azzal a változóval, amely a periodikus hívást tartalmazza (és nem a függvényt clearInterval) erre jön létre az utolsó sorban lévő névtelen függvény.

    A választás, hogy a kódot a függvénydefiníciót integrálva, tömörebben (mint a 21. sorban) vagy egy segédváltozót használunk, véleményem szerint jobban olvasható (mint a 19. és 20. sorban), a teljesítményben alig változik, és jobban stílustól és olvashatóságtól függ. karbantartás.

    A kód teszteléséhez, mielőtt adatok lennének a szerveren, használhat egy véletlenszerű értékek generátort a kívánt tartományban, vagy készíthet táblázatokat ellenőrzött értékekkel, amelyek szimulálják a kívánt körülmények közötti működést. A következő példa egy egyszerű adatgenerátort használ a teljes tartományban, ezért kissé eltúlzottnak tűnnek.

    A teszteléshez megteheti töltse le a példa teljes kódját beírt weboldal alkotja HTML, a stílus CSS és a kódot JavaScript. Ez utóbbi a legrelevánsabb, mivel a többi komponens csak minimális támogatást jelent, nagyon leegyszerűsített és sokkal jobban kidolgozott a megfelelő szakaszokban található cikkekben.

    Hozzászólás Comment

    Lehet, hogy lemaradtál