JavaScript ile IoT'ye bağlı sensörlerden gelen verilerin SVG grafiklerini oluşturun ve değiştirin

JavaScript ile IoT'ye bağlı sensörlerden gelen verilerin SVG grafiklerini oluşturun ve değiştirin

JavaScript ile IoT'ye bağlı sensörlerden gelen verilerin SVG grafiklerini oluşturun ve değiştirin

Çizim üzerine makaleler serisinin bu son bölümünde Nesnelerin İnternetine bağlı sensörlerden gelen verileri içeren grafiklerile nasıl oluşturulacağı veya değiştirileceği hakkında konuşmanın zamanı geldi JavaScript formatındaki çizimler SVG ve bazı elementler HTML kap görevi gören veya grafiklere tamamlayıcı bilgiler sunan.

İçindekiler

    HTML'de Nesnelerin İnterneti (IoT) kapsayıcısına bağlı sensörlerden gelen veri grafikleriCSS'deki görünümün Nesnelerin İnterneti (IoT) tanımına bağlı sensörlerden gelen verilerin grafikleriNesnelerin İnterneti'ne (IoT) bağlı sensörlerden gelen veri grafiklerinin SVG ile çizimiNesnelerin İnterneti (IoT)'ye bağlı sensörlerden gelen veri grafikleri JavaScript ile oluşturulması ve değiştirilmesi

    Bu eğitimin hedef kullanıcılarının bir elektronik ve bilgisayar programlama profili oluşturması gerekmektedir. mikrodenetleyicileraşina olmayabilirler HTML, CSS o SVG; Bu nedenle önceki bölümlerde dile veya ilgili teknolojiye kısa bir giriş yapıldı. Bu son kısımda yaklaşım biraz farklı, okuyucular mutlaka programlamayı bildikleri için dili kullanmaları mümkün. C + + bu nasıl JavaScript, temel sözdizimini şununla paylaşır: C ve temel programlama kavramlarının çoğunu atlamak ve böylece farklılıklara ve IoT'de sensör grafikleri oluşturmak için bizi ilgilendiren spesifik kullanıma odaklanmak için bir referans olarak kullanılabilir.

    İsim ilk farka dair ipucu veriyor: JavaScript Bir programlama dilidir senaryo (tire) ve bu nedenle yorumlanır, derlemeye gerek yoktur; hangi bağlamda senaryo (örneğin bir web tarayıcısı) emirleri okuyacak, tercüme edecek ve uygulayacaktır. Kesin olmak gerekirse, çoğu durumda bir çalışma zamanı derlemesi (JIT), ancak kod yazma işlemi için JavaScript Bu bizi etkilemiyor, sadece kodu yazıyoruz ve çalışabiliyor.

    İsim aynı zamanda ilk karışıklığı da içeriyor: JavaScript ile en ufak bir ilişkisi yok Java. Başlangıçta geliştirildiğinde Netscape tarayıcısı için önce Mocha, ardından daha az kafa karıştırıcı olan LiveScript olarak adlandırıldı. Tarayıcılarda başarılı bir şekilde uygulanıp onları aştıktan sonra şu şekilde standartlaştırıldı: ECMAScript (Için ECMA-262, sürüm 6 Bunu uygulayan tarayıcılara karşı tarafsız olmak için bu yazının yazıldığı sırada). Şu anda da bir standart var ISO sürüm 5, 2011'den itibaren (ISO / IEC 16262: 2011 makalenin yazıldığı sırada)

    JavaScript'te değişkenler, temel veri türleri ve nesneler

    Örneğin, olanlardan farklı olarak C + +, en JavaScript Bir değişken bildirilirken veri türü dahil edilmez ve ayrıca bir değişkenle ilişkili tür sabit değildir, programın yürütülmesi boyunca farklı türde bir değer atamak mümkündür.

    Önceki örnekte, "şey" değişkeni bildirildi (veri tipi belirtilmeden), ardından farklı tipte bir veri atanır ve ona başvurulur. typeof şu tip JavaScript yorumladığını söyledi. Kodun hatalarını ayıklamak için bunu web tarayıcısının denetçi konsoluna (web'in sunumunu etkilemeyecektir) yazabilirsiniz. console.log().

    Verilerin belirli bir türe, özellikle de metinden sayısala dönüştürülmesini zorlamak için aşağıdaki gibi işlevleri kullanabilirsiniz: parseInt() o parseFloat() bunlar sırasıyla tam sayılara veya kayan noktalı sayılara dönüştürülür. Ters dönüşüm şu şekilde yapılabilir: String(), ancak otomatik dönüştürme genellikle yeterli olduğundan gerekli olması pek olası değildir. İle parseFloat()Örneğin, bir web sayfası özelliğinin, birimleri içeren bir nesnenin genişliği veya yüksekliği gibi değerini alabilirsiniz; Bu şekilde ifade parseFloat("50px"); sonuç olarak sayısal bir değer olan 50 değerini döndürecektir.

    En JavaScript çift ​​ve tek tırnak arasında fark yoktur; Her iki durumda da veri türü stringve her biri kaçış kodlarına ihtiyaç duymadan diğerini içerebilir.

    Önceki örnekte, bir değişkenin bildirildiği (var olduğu) ancak herhangi bir değer atanmadığı zaman, tanımlanmamış bir veri türü içerdiği görülebilir (undefined). Atanmamış bir nesnenin değeri vardır null; Yani nesne vardır ama değeri yoktur; ona referans veren bir değişkenin typeof undefined Çin object. Bir nesne aynı zamanda boş olabilir, yani boş olmayabilir ancak herhangi bir özelliğe sahip olmayabilir.

    Daha içinde bir nesne tanımlayın JavaScript parantez içine alınır ({ y }) iki nokta üst üste işaretiyle ayrılmış özellikler veya yöntemler (:) özellik adı özellik değeri ve virgülle (,) farklı özellikler. Bir nesnenin bu şekilde ifade edilmesi hakkında daha fazla bilgiyi şu makalede bulabilirsiniz: JSON biçimi.

    Aksini düşünmenize yol açabilecek sözdizimini kullanabilseniz de, en JavaScript Sınıflar yok ama prototipler varYani, bir nesnenin özellikleri ve yöntemleri miras alması için, diğerlerinin (çocukların) referans olarak kullandığı başka bir nesne (prototip) oluşturulur. Stiline en yakın sözdizimi JavaScript bir prototip kullanmak Object.create kullanılması da mümkün (ve bazen faydalı) olmasına rağmen new diğer nesne yönelimli dillerde olduğu gibi.

    Daha bir nesnenin diğerinin örneği olup olmadığını sorgula, eğer onu prototip olarak kullanırsanız, özelliklerini miras alırsanız, kısacası kullanabilirsiniz. instanceof (ile oluşturuldu new) o isPrototypeOf (ile oluşturuldu Object.create) nesne prototipi kullandığında true, kullanmadığında false olarak değerlendirilecektir.

    Bir nesne bir başka nesneyi prototip olarak kullanarak yaratıldığında, yani bir nesne bir kez başlatıldığında, yeni özellikler ekleyin veya prototip özelliklerini geçersiz kılın olduğu gibi nokta sözdizimini kullanma gato.peso=2.5.

    La diziler JavaScript Muhtemelen tanıdığınız kişilerden farklılar C. Başlangıç ​​olarak uzunluklarını belirtmeye gerek kalmadan sadece köşeli parantezlerin açma ve kapama işaretleri ile bildirilirler ([ y ]), bileşenler heterojen olabilir (aynı dizide farklı veri türleri) ve yeni öğeler bir sınırla sınırlandırılmadan eklenebilir. matrisleri JavaScript aslında öğelerin listeleridir (koleksiyonlarıdır) sayısal bir indeks veya bir isimle referans verilir. Bir dizi aynı anda sayısal dizinler ve öğe adları içerebilir, ancak ikinci türden yararlanmak için nesnelerin (özelliklerin) kullanılması yaygındır.

    Önceki örnekte görülebileceği gibi, bir değişkenin bir dizi örneğine (bu bir dizi nesnesidir) karşılık gelip gelmediğini bilmek için şunu kullanabilirsiniz: instanceofgenel nesnelerde veya daha yeni sürümlerde zaten kullanıldığı gibi JavaScript başvurabilirsin Array.isArray()

    Dizinin elemanlarına erişmek için indeksini kullanabilirsiniz (matriz[7]) veya köşeli parantez içindeki adla birlikte özellik adına göre (matriz["nombre"]) veya nesneler için olağan nokta sözdizimi ile (matriz.nombre). Ad bir metin dizesi olduğundan, onu oluşturmak için değişkenleri içeren bir ifade kullanılabilir. Özelliklere sahip bir dizide döngü yapmak için formata sahip bir döngü kullanılabilir for(propiedad in matriz).

    Tedavi etme amacımız açısından ilginç nesne Datetarih ve saati temsil edecek ve yönetecek olan JavaScript. Nesne veri olmadan oluşturulabilir, dolayısıyla geçerli tarih ve saati alır veya 1 Ocak 1970'ten bu yana milisaniye cinsinden bir değer olarak bir tarih belirtilerek oluşturulabilir (örneğin, Unix zamanı veya POSIX zamanı ancak saniye yerine milisaniye cinsinden ifade edilir) veya yıl, ay, gün, saat gibi ayrı değerler belirtilerek...

    Nesne tam bir dizi içerir tarih ve saati sorgulama veya ayarlama yöntemleri:

    • now()
      1 Ocak 1970'den bu yana milisaniye cinsinden ifade edilen geçerli tarih ve saati döndürür

    • getTime() | setTime()
      1 Ocak 1970'den bu yana milisaniye cinsinden zaman değerini sırasıyla alır veya değiştirir. valueOf()Çoğu nesnede bulunan bir yöntem olan, karşılık gelen Date nesnesinin değeri de elde edilir; getTime() ile Unix zamanı veya POSIX zamanı ms cinsinden ifade edilir.

    • getMilliseconds() | setMilliseconds()
      Nesnenin kesirli milisaniye kısmını sorgulamak veya ayarlamak için kullanılır Date üzerinde yürütülür. Başvurulursa elde edilen değer 0 ile 999 arasındadır ancak toplam tarih ve saatte birikecek daha büyük değerler atanabilir, böylece diğer get yöntemleri gibi nesnenin değerini artırmaya hizmet eder. Date (veya negatif değerler kullanılıyorsa azaltın).

    • getSeconds() | setSeconds()
      Nesnenin saniye değerini sırasıyla döndürür veya değiştirir Date.

    • getMinutes() | setMinutes()
      Nesnenin tutanaklarına danışmak veya ayarlamak için kullanılır Date.

    • getHours() | setHours()
      Nesnenin saatlerine (0'dan 23'e kadar) bakmanıza veya değiştirmenize olanak tanır Date.

    • getDay()
      Tarihe ilişkin haftanın gününü, 0'dan 6'ya (Pazar'dan Cumartesi'ye) kadar bir değer olarak ifade ederek döndürür.

    • getDate() | setDate()
      Nesnenin ayın gününü döndürür veya değiştirir Date hangisinde uygulanır.

    • getMonth() | setMonth()
      Nesnenin ay numarasını incelemek veya değiştirmek için kullanılır Date.

    • getFullYear() | setFullYear()
      Tarih ve saati içeren nesnedeki yıl değerini sorgular veya ayarlar.

    Daha önceki yöntemler Date bir sürüm ekle UTC ara hesaplamalar yapmaya gerek kalmadan doğrudan evrensel zamanla çalışabilmek. Bu anlamda örneğin getHours() bir sürümü var getUTCHours() o getMilliseconds() bir alternatif getUTCMilliseconds() resmi (yasal) veya evrensel zamanla alternatif olarak çalışmak. İle getTimezoneOffset() Evrensel saat ile yerel resmi saat arasındaki farkı biliyorsunuz.

    JavaScript işlevleri

    Eğer bunu okuyorsanız kesinlikle nasıl programlanacağını biliyorsunuzdur. mikrodenetleyiciler en C içinde C + + ve fonksiyon kavramını bilir. Temel fikir aynı olsa da JavaScript Tanımlanma ve kullanılma şekilleri biraz farklıdır. Başlangıç ​​olarak, zaten söylendi, JavaScript Açıkça veri türlerini kullanmadığından, işlevi tanımlarken belirtmenize gerek yoktur.. Takip etmek, Bir işlevin bir isme sahip olması zorunlu değildir; anonim olabilirler. Bunları çağırmak için bir değişkenle ilişkilendirilebilirler ancak bazen gerekli olmayabilir, çünkü bazen parantezlerin ve parametrelerin fonksiyonun tanımından sonra eklendiği hemen çağırmak yararlı olabilir.

    Bir işlevi tanımlamak için önek function, mümkünse adı, argümanları (fonksiyona iletilen parametreler) parantez içine ve fonksiyon çağrıldığında yürütülecek kodu parantez içine yazın.

    Elbette, önceki örnekte "sonuç" değişkenine hiç ihtiyaç duyulmamıştı, ancak bu, şunu hatırlamak için iyi bir bahanedir: değişken kapsam, beklediğiniz gibi çalışır: "sonuç" değişkeni yalnızca "double" işlevi içinde bulunur. İçinde JavaScript ayrıca kullanılabilir letyerine var, bir değişkeni kod bloğu bağlamına dahil etmek için (küme parantezleri içine alınmış, { y })

    Önceki bölümde nesnelerden bahsederken temel bir şey eksikti: özellikler tanımlanmış ancak yöntemler tanımlanmamıştı. Beklenildiği gibi, nesne yöntemleri işlevlerdir, adları yoktur ve nesne tanımı tarafından atanan (özellik) adından kullanılır (çağrılır).

    Önceki örnekte, konsol aracılığıyla "current_temperature" özelliğinin değerini görüntüleyen "view_temperature" adında bir yöntem zaten mevcuttur. Pek kullanışlı değil ama bir nesnenin tanımının neye benzediğine dair daha eksiksiz bir fikir veriyor. JavaScript.

    Bir nesnenin (işlevlerin) yöntemlerine özelliklerine erişmek için şunu kullanın: this11. satırdaki önceki örnekte olduğu gibi, "current_temperature" özelliğini kullanırken.

    Belge Nesne Modeline (DOM) JavaScript ile erişme

    . JavaScript Sistem kaynaklarına olmasa da, üzerinde çalıştığı web sayfasının içeriğine ve o sayfayı görüntüleyen tarayıcının bazı özelliklerine erişebilirsiniz. Erişilen özellikleri ve yöntemleri destekleyen veri yapısı JavaScript pencere nesnesinin bir kısmı, özellikle nesnenin içeriği (belge HTML) nesneye karşılık gelir document. Bazen netlik sağlamak için kullanılsa da, yöntem veya özelliklere atıfta bulunmak için bunların önüne pencere koymak gerekli değildir, örneğin şunu kullanmak yeterlidir: documentolduğu gibi kök nesnenin adını yazmaya gerek yoktur. window.documentGeçerli pencereye başvurulduğu sürece.

    En çok kullanılan şekli belgede bir nesne bulma HTML Bu yöntem sayesinde getElementById(), kod oluşturulurken belirtilen kimliğin argüman olarak iletildiği yer HTML. Önceki bölümlerde anlatılanlardan, nesnenin içindeki bileşenlere de erişebileceğinizi varsaymak kolaydır. document nokta sözdizimini kullanarak (document.componente) veya parantez içinde hem adı (document["componente"]), sayısal dizin gibi en kullanışlı olanı, manuel olarak oluşturulmuş bir web sayfasının içeriğine erişirken kullanımı zor ve pratik değildir.

    ile JavaScript yapabilirsiniz başka bir öğe içeren öğeyi alın (öğe veya ana düğüm) mülkünüzle ilgili danışmanlık parentNode veya mülkünüz parentElementfark, ana öğenin (parentElement) dizenin son elemanının KARAR Bu boş (null) ve ana düğüm (parentNode) belgenin kendisidir (document).

    Daha bir öğenin içeriğini değiştirmek HTMLörneğin bir etiketinki <div>, Kullanılabilir innerHTML ve özelliklerini değiştirmek için ona farklı bir sınıf atamayı seçebilirsiniz. className veya özelliklerini tek tek değiştirin style. Web sayfasındaki bir öğe tarafından görüntülenen stile bakmak her zaman yararlı olmayabilir style çünkü çeşitli faktörlere bağlı olabilir veya açıkça belirtilmemiş olabilir. Sonunda web sayfasında görüntülenen bir öğenin stilini kontrol etmek için getComputedStyle yöntemi kullanılır..

    Bir belge öğesine HTML Görünümünü ve davranışını belirlemek için ona birkaç sınıf atanabilir. bir nesnenin sınıflarının listesini yönetmek JavaScript başvurabilirsin classList yöntemleri sunan add Listeye yeni bir sınıf eklemek için, remove onu kaldırmak için, toggle onu değiştirmek veya bir öğenin sınıf listesinin içeriğine bakmak için item ve containslistede belirli bir konumu kaplayan sınıfı ve bir değeri döndürür true o false Belirli bir sınıfın listede olup olmadığı.

    Önceki örnekte şu konumda bulunur: getElementById işlemek istediğiniz nesne (bir öğe <div> onun için id), görünümü değiştirmeden önce içerik ile atanarak silinir. innerHTML boş bir metin dizesi, yeni bir sınıfa atanır className ve stili şu şekilde değiştirildi: style içeriğin değerine (sıcaklığa) bağlı olarak, varsa özellik aracılığıyla rengin değiştirilmesi color. Görünüm oluşturulduktan sonra değer tekrar kullanılarak yazılır. innerHTML.

    Yukarıdaki örneğin ikinci bölümünde (9'dan 19'a kadar olan satırlar) bir kod öğesine erişilir. HTML sözdizimini kullanarak document[] ve mülk id Bu yöntemle sınıf listesini değiştirmek için öğenin classList.remove() ve yöntemleclassList.add()kullanarak karşılaştırdıkları, koşullu yürütmelerde gerçekleştirilen birkaç sorgunun sonucuna dayalıdır. classList.contains().

    Ne zaman gidiyor bir öğeye atıfta bulunmak HTML varias kod boyunca kere JavaScript, Birazcık onu bir değişkene atamak daha verimli veya isim yerine indeksini kullanın, aksi takdirde kullanacağınız yöntem JavaScript bunu her seferinde elde etmek, adının aranmasını gerektirir ve bir değişkene erişildiğinden biraz daha fazla zaman harcar.

    Daha belgeye yeni nesneler ekleme HTML, yöntemle ilk önce oluşturulabilirler createElement de document ve daha sonra bunları ağacın gerekli olduğu noktada geri kalan öğelere dahil edin. appendChild. Bir nesne oluşturmak için XMLnesneler gibi SVG IoT sensörlerinin grafiğini çizmek için kullandığımız createElementNS (NS için ad alanı). Format hakkında konuşurken açıklandığı gibi SVG, ona karşılık gelen ad alanı (geçerli sürüm için) http://www.w3.org/2000/svg, iletilmesi gereken createElementNS öğe türüyle birlikte bir argüman olarak, svg, bu durumda.

    bir alternatif innerHTML bir belge öğesine içerik olarak metin eklemek için HTML yöntem bu createTextNode() nesne document. Bu alternatifle şunları yapabilirsiniz: yeni metin oluştur (bir değişkene atanırsa daha sonra erişilir) yöntemle nesne ağacına dahil edilir appendChild(). olarak alternatif appendChild()Yeni içeriği, eklendiği düğümde zaten mevcut olanın sonuna ekleyen, kullanabilirsiniz yöntem insertBefore(), mevcut bir nesnenin önüne yeni bir nesne ekler. Giymek insertBefore() yerine appendChild() örneğin aşağıdakilere hizmet eden bir yöntem sağlar: yeni nesneleri mevcut nesnelerin önüne sıralayın bir öğenin diğerinin önünde olması (bir listede olduğu gibi) veya ön plana veya arka plana daha yakın öğelerin bulunduğu bir grafik yapıyı kaplaması veya kaplaması gerektiğinde.

    Etkinliklere JavaScript ile tepki verme

    Ne zaman yolu IoT bağlantılı sensör grafikleri için bir web sayfasını kapsayıcı olarak kullanma kullanılmış onload Etikette <body> Grafiği çizmeye başlamak için. Kod nesneleriyle ilişkili bu özellik HTML, şuna atıfta bulunur: Etkinlikler JavaScript. Daha önce açıklandığı gibi sayfa yüklendiğinde bir işlevi çalıştırır. Her ne kadar kodla ilişkilendirilmiş olsa da HTML daha akılda tutmak için kodda yazılmış olabilir JavaScript olarak body.onload=dibujar; olma dibujar web sayfası yüklendiğinde başlatılması gereken fonksiyonun adı.

    En son sürümlerinde JavaScript olaylar işlevlerle ilişkilendirilebilir. addEventListener format ile objeto.addEventListener(evento,función); veya sözdizimini kullanarak objeto.evento=función; bu aynı zamanda eski uygulamalarda da işe yarar. Etkinlikle ilişkili işlevin bağlantısını kaldırmak için, removeEventListener ile aynı formata sahip olan addEventListener.

    JavaScript Bir web sayfasında meydana gelebilecek çok sayıda olaya tepki verme yeteneğine sahiptir. Örneğin bir öğeye ne zaman tıklandığını algılayabilir HTML ile onmousedownveya ile tıklandığında onclickile bir tuşa basıldığında onkeydownkaydırma çubuğunu kullanarak onscroll. Amacımız açısından bu bizim için yeterli ile sayfa yükünü tespit et onload ve yeniden boyutlandırılması onresize. Bu olayları nesnelerle ilişkilendireceğiz. body y window del KARAR sırasıyla. İlki kodda atanabilir HTML, görüldüğü gibi ve koddaki ikinci JavaScript ilk tarafından çağrılan fonksiyonun içinde ve formatta window.onresize=redimensionar; olma redimensionar pencerenin boyutu her değiştiğinde çağrılacak işlev.

    Belirli bir zaman aralığından sonra çalıştır

    JavaScript için iki kaynağı var ertelenmiş yürütme: setTimeout, belirli bir zaman aralığından sonra bir işlevi yürütür ve setInterval her belirli zaman aralığında bir işlevi yürütecek olan. Her iki yöntem de parametre olarak (1) çağrılan işlevi ve (2) milisaniye cinsinden ifade edilen zaman aralığını gerektirir. İşlemlerini durdurmak için, bu işlevler tarafından döndürülen sonucu değişkenlere atayabilir ve bunları argüman olarak iletebilirsiniz. clearTimeout oa clearInterval onları tekrar çağırmak istemediğinizde (veya ilk kez çalıştırılmalarını istemediğinizde) setTimeout o setInterval sırasıyla.

    Önceki örnekte yöntem tanıtılmıştır. alert bir uyarı işareti göstermeye yarar. Geçmişte yaygın olarak kullanılmasına rağmen şu anda neredeyse koddan yasaklanmıştır. JavaScript web sayfasını bir iletişim kutusuyla kaplamanın ne kadar agresif (müdahaleci) olduğu nedeniyle.

    için yazılmış bir programda mikrodenetleyici küçük bir serinin (tabaktaki gibi) Arduino Uno) önceki örnekte olduğu gibi global değişkenlerin kullanılması yaygındır. JavaScript, kod kısa olduğundan ve özellikle kafa karıştırıcı olmadığından, çoğu zaman işlevler geçici olarak uygulandığından ve küresel değişkenlerin kullanımı, az kaynağa sahip sistemlerde kritik olan, bellek kullanımını çok basit ve sezgisel bir şekilde tahmin etmeyi mümkün kıldığından . Yerine, en JavaScript Küresel değişkenlerin kullanımını mümkün olan en aza indirmek yaygındır. çünkü normal bir şekilde çalıştığı için bellek kullanımını aceleye getirmesi gerekmez. işlemci sahip olduğundan çok daha üstün kaynaklara sahip MCU, müdahale etmeden çalışması gereken birçok üçüncü taraf koduyla bir arada bulunması muhtemel olduğundan ve açık bir sistem olduğundan gelecekteki yürütme bağlamı tahmin edilemez (bir programın programı). mikrodenetleyici Small, çalışmaya başladıktan sonra daha fazla kod eklemeden çalışmasını tamamen belirler) ve uygulamaların boyutları, kodun çalışmasını kapsamaması durumunda okumayı zorlaştırabileceğinden, yöntemleri mümkün olduğunca kendi kendine yeten hale getirir.

    JavaScript Math nesnesiyle matematiksel işlemler

    Daha karmaşık matematiksel hesaplamaların matematiksel işlemleri nesnede gruplandırılmıştır. Math. Bu nesne doğrudan kullanılır; içerdiği yöntemleri veya özellikleri (sabitleri) kullanmak için nesnenin başlatılmasına gerek yoktur.

    • Math.abs(n) N parametresinin mutlak değeri
    • Math.acos(n) N parametresinin arkkosinüsü (radyan cinsinden sonuç)
    • Math.asin(n) N parametresinin ark sinüsü (radyan cinsinden sonuç)
    • Math.atan(n) N parametresinin arktanjantı (radyan cinsinden sonuç)
    • Math.atan2(n,m) N/m'nin arktanjantı (radyan cinsinden sonuç)
    • Math.ceil(n) Parametreyi yukarıya doğru en yakın tam sayıya yuvarlayın
    • Math.cos(α) α parametresinin kosinüsü (radyan cinsinden α)
    • Math.E e numarası (≃2.718281828459045)
    • Math.exp(n) e parametresine yükseltildi n: en
    • Math.floor(n) N parametresini en yakın aşağı tam sayıya yuvarlayın
    • Math.log(n) N parametresinin doğal logaritması (e tabanı)
    • Math.LN2 2'nin doğal logaritması (e tabanı) (≃0.6931471805599453)
    • Math.LN10 10'nin doğal logaritması (e tabanı) (≃2.302585092994046)
    • Math.LOG2E e'nin 2 tabanlı logaritması (≃1.4426950408889634)
    • Math.LOG10E e'nin 10 tabanlı logaritması (≃0.4342944819032518)
    • Math.max(a,b,c,…) Geçirilen parametreler listesinin en büyük değeri
    • Math.min(a,b,c,…) Geçirilen parametreler listesinin en küçük değeri
    • Math.PI Sayı π (≃3.141592653589793)
    • Math.pow(n,m) Birinci parametre n, ikinci parametre m'ye yükseltildi: nm
    • Math.random() (Neredeyse) 0.0 ile 1.0 arasında rastgele sayı
    • Math.round(n) N parametresini en yakın tam sayıya yuvarlayın
    • Math.sin(α) α parametresinin sinüsü (radyan cinsinden α)
    • Math.sqrt(n) N parametresinin karekökü
    • Math.SQRT1_2 1/2'nin karekökü (≃0.7071067811865476)
    • Math.SQRT2 2'nin karekökü (≃1.4142135623730951)
    • Math.tan(α) α parametresinin tanjantı (radyan cinsinden α)

    AJAX ile sunucudan veri yükleme

    IoT'de saklanan bilgilerin çizilmesi için izlenen yöntem, verilerin zaman zaman sunucudan yüklenmesi ve bunların temsil edildiği grafiğin yeniden çizilmesinden oluşur. Sunucudan veri okumak için teknoloji kullanılır AJAX (Eşzamansız JavaScript ve XML) bir nesne aracılığıyla XMLHttpRequest de JavaScript. Veri grafiğinin çizilmesi bir nesnenin yeniden kullanılmasıyla yapılır SVG bu zaten kodda var HTML ve yüklenen yeni verilere karşılık gelecek şekilde koordinatları değiştirilen bir çizim içerir.

    Bu öneri örneğinde, çizimin güncellenmesinin yanı sıra, web sayfasında her grafik için son ölçülen verinin tarihini ve değerini gösteren bir metin de güncellenmektedir.

    Sunucu tarafında bilgilerin yer aldığı bir veritabanı bulunmaktadır. IoT'ye bağlı sensörlerin izlediğini. Bu veritabanı nesne isteği tarafından okunur XMLHttpRequest kodlanmış bilgilerle yanıt vermek JSON biçimi, kullanılan yöntemin adı formatla bir ilişki olduğunu düşündürse de XML.

    Polaridad.es'in ilk eğitiminde Nesnelerin İnterneti veri depolama Nesnelerin İnterneti'ne bağlı cihazların sağladığı bilgilerin sunucu tarafından yönetilmesine yönelik bir altyapı örneğini görebilirsiniz. Bu makale serisinde kaynak olarak bir sunucu kullanılıyor Apache programlama dilini kullanabileceğiniz PHP bir veritabanına erişmek için MySQL o MariaDB. IoT'yi desteklemek için kullanılan sunucularda veritabanları bulmak çok yaygındır. MongoDB (NoSQL) ve programlama dili JavaScript üzerinde node.js Yazılım altyapısı olarak.

    Bir sonraki işlev, sunucudaki sensörlerden birinden en son verilerin talep edilmesinden sorumludur. İşlev çağrısında nesne argüman olarak kullanılır JavaScript çizilen verileri destekleyen. Aynı grafik birkaç değeri temsil ediyorsa, örneğin görsel olarak bir korelasyon aramak için, sunucuya aynı anda birden fazla değer döndürmesi için bir istekte bulunulabilir; bu, sunucunun çalışma şekli nedeniyle daha uygun bir yöntemdir. HTTP protokolü.

    Önceki örneğin üçüncü satırında, sunucuya yapılacak sorguda, izlenen yerin adı veya kodu olacak "zone" argümanının iletileceği sorgu hazırlanır. Aynı veri tabanında farklı sensörler (örneğin farklı odalardaki sıcaklığı ölçen termometreler) bir arada bulunabilir. Önceki işleve iletilen parametrenin, yani grafik verilerinin bulunduğu nesnenin, oda adını ("name_suffix") içeren bir özelliği içermesi beklenir.

    Önceki kodun 7. ve 14. satırları arasında, nesne XMLHttpRequest "ajax" değişkeninde saklanır. Nesnenin nasıl oluşturulacağını seçmeden önce arama yaparsınız window kendi kendine XMLHttpRequest mevcut değildi (Microsoft Explorer'ın eski sürümlerinde olan bir şeydi ve çok geride olmasına rağmen, nesneyi (daha yerel) sözdizimini kullanarak oluşturmak için alternatiflerin bir örneği olarak hizmet ediyor) Object.create o newdiğer nesne yönelimli dillerdekine benzer.

    Yanıtı anında yönetebilmek için, sunucuya istek yapılmadan önce 15'ten 26'ya kadar olan satırlarda onu işleyen kod hazırlanır.

    Yolu sorguyu gerçekleştir HTTP sunucuya oluşur bir bağlantı aç ile open türü ve sayfayı belirten (isteğe bağlı olarak kullanıcı adı ve şifre), başlıkları hazırla ile protokolün setRequestHeader y isteği gönder ile send. Başlık HTTP Content-length kullanılarak hesaplanan sorgunun uzunluğunu (karakter sayısı) bilmeniz gerekir. length.

    Talep ne zaman AJAX hazır olduğunda, olayla ilişkili işlev yürütülür onreadystatechange. Önceki örnekte, bir işlev atamak yerine, sunucudan gelen verilerin alımını yönetecek anonim bir işlev anında tanımlanmıştır. Öncelikle 18. satırda isteğin durumunun "tamamlandı" olduğu doğrulanır, bu da değere karşılık gelir. 4 mülkün readyStatedurumunun "Tamam" olduğunu HTTP protokolü (kod 200) mülkten edinilebilecek status ve gelen veriler şöyle JSON biçimi, mülk danışmanlığı responseType.

    Yanıtın durumunun beklendiği gibi olduğu doğrulandıktan sonra, önceki örneğin 20. satırında sonucu içeren bir nesne oluşturur, metni dönüştürür JSON. Yanıt, döndürülecek bir tarih sağlar; bu, sunucunun gönderdiği sonucun daha önce grafikte temsil edilip edilmediğini görmemize olanak tanır ve bu, 21. satırda doğrulanır. Veriler yeniyse, 23. satırda. Grafiğin yeni bilgilerle yeniden çizilmesinden sorumludur denir.

    Bu okuma yöntemini önerirken amaç, verilerin çok sık yenilenmesidir. Sunulan bilgi uzun bir döneme karşılık geliyorsa (bir günün veya bir haftanın sıcaklıkları gibi), mevcut tüm verileri toplayan bir ilk talep uygulanabilir ve ardından örnektekine benzer şekilde bu verileri güncelleyen bir talep uygulanabilir. Dönem muhabiri.

    Test için rastgele veriler oluşturun

    Tüm sunucu ve istemci altyapısı hazır olduğunda, önceki bölümdeki gibi bir fonksiyon veriyi okumaktan ve onunla grafiği çizmekten sorumlu olacak, ancak Test aşamasında kontrollü bir aralıktaki rastgele sayıları kullanmak daha pratik olabilir yazılan kodun doğru olup olmadığını görmek için Aşağıdaki fonksiyon, son uygulamayı oluştururken veri elde etmek için örnek teşkil edebilir.

    Yukarıdaki örnek, bilgileri bir veritabanından okumak yerine, bunları rastgele oluşturur ve grafiği çizmekten sorumlu fonksiyona iletir. İcat edilen veri, milisaniye cinsinden değer olarak ifade edilen bir tarih, sensör bilgilerinin kaydedildiği an ve maksimum değer ile minimum değer arasındaki izlenen verilerden oluşan bir vektördür.

    Bu örnekte bir tarih üretilirken, buluş tarihindeki tarihe göre bir saniyeye (1000 milisaniye) kadar geciktirilebilmektedir. Gibi Math.random() 0.0 ile 1.0 arasında bir sayı üretir, bu sayının 1000 ile çarpılması 0 ile 1000 arasında bir sayı üretir ve bu sayı daha sonra bir tam sayıya dönüştürülür. Aynı şekilde rastgele sayının aralıkla (maksimum eksi minimum) çarpılıp minimumun eklenmesiyle değer elde edilir.

    IoT sensörleri grafiğini SVG grafiğiyle çizin

    Temsil etmek istediğimiz değerleri (örnekte sıcaklık) ve bunların koordinat şeklinde birlikte ifade edilebilecek zamansal konumlarını nasıl elde edebileceğimizi gördüğümüz için, aşağıdaki örnekte bir yol çizme fonksiyonu gösterilmektedir. bu noktaları birleştiren ve isteğe bağlı olarak üstteki o çizgiyle sınırlandırılan renkli bir alan. Sonuç aşağıdaki resimdeki gibi olacaktır.

    IoT sensörlerinden gelen verileri temsil etmek için SVG ve JavaScript ile oluşturulan bir grafik örneği

    Grafiğin yatay ekseni (X) zamanı, dikey ekseni (Y) ise IoT'ye bağlı sensörlerin izlediği değerleri temsil eder. Yatay aralık birkaç saniyedir, çünkü bu öneride grafik, sensörlerin durumu hakkında neredeyse gerçek zamanlı bilgi sağlamak üzere çok sık (örneğin her saniyede) güncellenmektedir.

    Önceki kodda iki ilginç yön vardır; ilki, hesaplamaya izin veren hesaplamadır. temsil edilen değer aralığını uyarlayın ve ikincisi mülk inşaatı d düzendeki noktaların koordinatlarını gösteren (path).

    Temsil edilen değer aralığını uyarlamak için, bunlar minimumdan hareket ettirilir ve görünür büyüklük grafiğin boyutuna karşılık gelecek şekilde ölçeklendirilir.. Zaman durumunda, uzaklık, görüntülemek istediğiniz aralığın en uzun zamandan (geçerli olana en yakın tarih ve saat) (örnekte 20 saniye) çıkarılmasıyla elde edilir. Sıcaklık değerlerinin yer değiştirmesi, alt aralıktan (bir derece) eksi en düşük değere eşittir, böylece aşağıda gösterilen veriler izin verilen en düşük değere en çok benzeyendir ancak izin verilenleri takdir etmemize izin veren bir marj bırakır. . geçmek

    Grafiğin yatay koordinatlarını elde etmek için zaman değerlerini çarpan katsayı, grafiğin toplam genişliğinin (örnekte 100 birim) temsil edilen zaman aralığına (örnekte 20 saniye) bölünmesiyle elde edilir. Skaler sıcaklık değerleriyle katsayıyı elde etmek için, temsil edilen aralığın minimum değerin altındaki bir marjdan maksimumun üzerindeki bir marja (her iki durumda da bir derece) kadar gittiği unutulmamalıdır. Bu şekilde dikey ölçek katsayısı, grafiğin yüksekliğinin (örnekte 100 birim) maksimum değer eksi minimum artı üst ve alt kenar boşluğuna bölünmesiyle elde edilir. Bu değerler tamamen negatif sıcaklıklarda gelişebileceğinden, Math.abs() farkın mutlak değerini kullanmak.

    Özellikler d nesne path Bir metindeki noktaların koordinatlarının birleştirilmesiyle oluşturulur.. Her koordinat çiftinin önünde bir kod bulunur SVG LGeçerli konumdan koordinatlarla gösterilen mutlak değere bir çizgi çizen. X ve Y değerleri virgülle ayrılır ve her işlem SVG diğerinden bir boşlukla ayrılır.

    Düzeni başlatmak için kodu kullanın M (mutlak bir koordinata gidin). Kapalı ve dolu grafik durumunda sağ alttan başlarsınız, veri profilini çizen açık grafik durumunda temsil edilen son değerle (en yeni) başlarsınız. Kapalı düzeni tamamlamak için kod kullanılır Z son nokta olarak, çizginin son noktasıyla aynı X koordinat değerine sahip olanı ve Y koordinatı olarak temsil edilen en küçük değeri ekler.

    Bu örnekte fonksiyon dibujar_grafico()sayfa yükleme çağrısı olan , test edilecek başlangıç ​​değerlerini alır (son gerçek zamanlı değeri değil) ve verilerin oluşturulacağı aralığı hazırlar: Yatay olarak 20 saniye (20000 ms) ve sıcaklıkta 15°C. -5°C ile +10°C arası dikey, bir derece üst ve alt kenar boşluğu. İki arama yapın actualizar_grafico(), ilk geçişte true grafiğin doldurulmuş bir alanı temsil edecek şekilde kapatılması gerektiğini belirten bir argüman olarak ve ikinci çağrıda geçer false çizgiyi çizmek için. Her durumda nesne path değiştirilmiş, ilk durumda dolgulu ve kenarlıksız, ikinci durumda ise belirli bir çizgi kalınlığı olan ve dolgusuz, karşılık gelen görünüme sahip olandır.

    İşlevi actualizar_grafico() bir nesne üzerinde çalışmak SVG aşağıdaki kodu konteyner olarak kullanan HTML. Nesne SVG biri çizgiyi çizmek için, diğeri ise doldurulmuş alanı çizmek için iki yol içerir. Web sayfasını yüklerken öğeden <body> önceki işlev otomatik olarak çağrılır, dibujar_grafico() etkinlik sayesinde JavaScript onload.

    Kodun 10. satırında HTML yukarıda, stilde 820 piksellik bir genişlik (örnek olarak) ve 150 piksellik bir yükseklik belirlenmiştir (son versiyonda bunun bir sınıf ve bir belge ile yapılması tavsiye edilecektir) CSS). 13 ve 14. satırların nesnenin boyutunu tanımlaması garip görünüyor SVG %100 genişlik ve yükseklik gibi (pencere boyutlarına en iyi uyan, 100×100). Daha önce de belirttiğimiz gibi bunu yapmanın nedeni her zaman bilinen boyutlarla çalışmak ve temsil edilen değerleri ona göre ayarlamaktır. Diğer alternatifler ise her seferinde grafiğin alanını hesaplamak ve ardından değerleri yeniden ayarlamak veya belgenin uyması gereken grafik için sabit boyutları zorlamak olacaktır.

    Koda göre boyutları değişen bir grafik tercih etmiş olmak HTMLözelliği dahil etmek gerekir vector-effect değeri ile non-scaling-stroke önceki teklifte olduğu gibi, grafiğin görüntülendiği web sayfasında seçilen 1:1 oranlarını korumaması durumunda çizgi kalınlıklarının deforme olmasını önlemek için.

    Grafiği "kırpmak" ve yalnızca seçtiğiniz alanı göstermek için şunu kullanın: viewBox. Bu durumda grafiğin 0,0'dan başlayan (sol üst köşe) ve aşağı ve sağa doğru 100x100 ölçüsündeki kısmını görmeyi seçtik. Çizimin negatif değerli veya 100'den büyük koordinatlarda yer alan kısmı, nesnede bulunsa dahi web sayfasında görüntülenmeyecektir. SVG

    SVG çizimine yeni öğeler ekleme

    Önceki örnekte fonksiyon actualizar_grafico() bir düzen kullan SVG sahipliğin değiştirildiği yer dKoordinat zincirini ifade eden şey budur. Alternatif, her yeniden çizildiğinde nesnenin tamamını oluşturmak olabilir. İlk seçeneğin avantajı grafik görünümünün (kalınlık veya renk gibi) kodda tanımlanmış olmasıdır. HTMLsınırlaması nesnelerin önceden oluşturulmuş olması gerektiğidir.

    SVG nesneleri oluşturmak için şunu kullanın: createElementNS()dahil edilmesini sağlayan ad alanı. Aşağıdaki örnekte yeni bir metin nesnesi yaratılmıştır (text) ve bir öğeyle ilişkilidir SVG kodda zaten mevcut olan HTML web sitesinin. Yeni eleman oluşturulduktan sonra özellikleri şu şekilde atanır: setAttribute() ve eklenir SVG ile appendChild().

    Çizim öğelerinin oranını değiştirin

    Bir önceki bölümdeki örnekte yer alan fonksiyonla etiketlemeyi denediyseniz, web sayfasındaki nesnenin oranı (orantısı) bozulduğunda metnin deforme göründüğünü görmüşsünüzdür.width y height kodun HTML) temsil edilen alanınkine eşit değildir (viewBox). Orantıyı ayarlamak için nesnenin ölçülerini bilmek gerekir. SVG bunun için nesnenin veya kabın stiline başvurabilirsiniz HTMLeğer nesne SVG bu mülkü devredin. Sahiplik atama transform nesnelere SVG Orana bağlı olarak deformasyon ölçeklendirme işlemi uygulanarak düzeltilebilir. scale() burada X'teki katsayı Y'dekinden farklıdır.

    SVG özellikleri de destekleyen yeni bir kompozit eleman oluşturacak şekilde birçok nesnenin gruplandırılmasına olanak tanır, basit nesneler gibi. Aynı dönüşümü her nesneyi ayrı ayrı uygulamak yerine bir dizi nesneye aynı anda uygulamak için bunları bu kaynağa göre gruplandırabilir ve tek bir özellik uygulayabilirsiniz. transform hepsine.

    Bahsederken açıklandığı gibi SVG formatı, bir grubun elemanları etiketlerin içine alınır <g> y </g>. Şuradan eklemek için: JavaScript bir gruba ait öğeler SVG Önceki örnekte görüldüğü gibi kullanılır, appendChild() yeni nesne tanımlandıktan sonra.

    Dönüşümleri uygularken bir orijin oluşturmak için bu özellik nesneler üzerinde kullanılabilir. SVG transform-originDeğeri dönüşümün başladığı noktanın X ve Y koordinatlarıdır. Dönüşümün orijini için bir değer açıkça belirtilmemişse (web tarayıcısında), koordinatların merkezi kullanılır. Ne yazık ki, bu yazının yazıldığı sırada, dönüşümlerin davranışını varsayılan kaynak dışında bir kaynak kullanarak belirlemek, tarayıcılar arasında homojen değildir ve dikkatli kullanılmalıdır.

    Ölçek dönüşümüyle birlikte scale Rotasyon gibi başkaları da var rotation ve onunla birlikte hareket translate, bir teklif grafik temsiline alternatif: Yeni koordinatlar elde etmek yerine bunları kendi uzaylarında temsil edebilir ve grafiği temsil etmek istediğiniz formata uyacak şekilde dönüştürebilirsiniz.

    Grafiğe referanslar ekleyin

    Artık grafiğin ana kısmı, değerlerin profil ve dolu alanla çizilmesiyle çözüldüğüne göre, okunmasına yardımcı olacak referanslarla tamamlanabilir. Örnek olarak, istenen değerin yanı sıra kabul edilebilir maksimum ve minimum değerleri işaretleyen bazı yatay referanslar (çizgiler) çizerek başlayalım. Açıklandığı gibi, nesneleri listeye eklemeyi seçebilirsiniz. SVG doğrudan JavaScript veya bunları manuel olarak koda ekleyin HTML ve bunları daha sonra şununla değiştirin: JavaScript.

    Bu yatay referansları temsil ettikleri değeri açıklayan bir metinle etiketlemek mantıklı görünüyor. Metni vurgulamak için arka plandan ve grafikten öne çıkacak dikdörtgenler kullanabilirsiniz. Deformasyonu telafi etmek için metinlerin ölçeklendirilmesi gerekeceğinden, bunların tümü ölçeğin uygulanacağı bir nesne halinde gruplandırılabilir; Bunu bu şekilde yapmanın temel avantajı, grafik kabı (tarayıcı penceresi) yeniden boyutlandırıldığında ve ölçeğin düzelttiği oranı değiştirdiğinde bunları tek bir işlemle değiştirebilmektir.

    Yukarıdaki örnek kodda birkaç ilginç yön vardır. Her şeyden önce, örneği programlamadan gelen kullanıcılar için daha okunaklı hale getirmek için sabitlerin (global değişkenler) kullanıldığını yorumlayın. mikrodenetleyiciler en C içinde C + +. Daha sonra görüleceği gibi, onu programlamanın en uygun yolu JavaScript Bir üretim sisteminde bu değerleri içerecek nesnelerin ve bu örnekteki referansları veya genel olarak grafiği yönetecek yöntemlerin kullanılması olacaktır.

    Öte yandan, daha genel bir kod geliştirilerek, metni ayarlamak için grafiğin oranını düzelten farklı katsayıları hesaplayan ayrı işlevler geliştirilmiştir. proporcion_grafico(), aralıklarına bağlı olarak değerlerin ölçeği escala() ve referanslardaki ölçümler gibi mutlak değeri bilinen ölçümler için bir düzeltme faktörü medida_grafico().

    Bu kodun okunması, grafikleri gerçek zamanlı olarak çizen ve çeşitli grafik bağlamlarında (en azından çeşitli boyut ve oranlarda) sunulmak üzere esnek olması gereken bunun gibi bir uygulamanın çalıştığı bağlamın netleştirilmesine yardımcı olacaktır. Her şeyden önce nesnelerin oluşturulması gerekir. SVG, kodda "manuel olarak" HTML, kod aracılığıyla JavaScript ve her durumda, bu nesnelere yapılan referanslar, bunları manipüle etmek için daha sonra elde edilmelidir. JavaScript böylece yeni grafikler çizilebilir ve önceden çizilmiş bir grafiğin temsili, sunulduğu ortamdaki bir değişikliğe uyarlanabilir.

    Bir grafiğin kolayca yorumlanmasına yardımcı olabilecek diğer bir referans, belirli değerleri temsil eden noktalardır (doğrunun düğümleri). Tek bir büyüklüğü temsil ettiğimiz bu örnekte, bir sembolün seçimi kritik değildir, ancak korelasyon aramak için birkaç farklı değer üst üste bindirilirse, renk gibi diğer kaynakları kullanmanın yanı sıra ayırt etmek ilginç olabilir. , farklı semboller çizerek. Çizgi düğümü için kullanılan grafiklerin boyutları ve oranları, örneğin metinlerde olduğu gibi değiştirilmelidir, böylece boyutları mutlak olur ve içerdiği kutunun oranları grafiği değiştirse bile oranları korunur.

    Önceki örnekte, çizimin oranını yeniden ölçeklendirmek ve düzeltmek için farklı katsayıların nasıl hesaplanacağını zaten gördük; Grafiğin düğümlerinin veya köşelerinin sembollerinin yönetiminin nasıl uygulanacağına ilişkin olası bir çözüm, nesnelerin saklanması olabilir. SVG bir vektöre dönüştürün ve grafik yeni bir değer okunarak güncellendiğinde veya kapsayıcı yeniden boyutlandırılarak yeniden çizildiğinde konumunu değiştirin. İlk durumda konumunun değiştirilmesi, ikinci durumda ise mülkle olan oranının değiştirilmesi gerekecektir. transform ve değeri scale. Aşağıdaki kod işlevin bir modifikasyonudur actualizar_grafico() grafiğin köşe sembollerinin yeniden konumlandırılmasını dahil etmek.

    Fonksiyonda yapılan değişiklikler actualizar_grafico() yeni işlevi almak için actualizar_grafico_puntos() Bunlar önceki örneğin kodunda vurgulananlardır. İlk olarak 5. satırda nesnelerin bir vektörünü alıyoruz SVG parametre olarak. Bu vektör, grafiğin yeni düğümlerinde yeniden konumlandırılması gereken sembolleri içerecektir.

    39. ve 40. satırlarda merkezin yeni koordinatları atanır, cx y cy, temsil edilen değerlerden olanlara. Sembol merkeze dayalı değilse muhtemelen bir uzaklık eklemek gerekli olacaktır. cx genişliğin yarısı kadar ve cy bunları tam olarak grafik düğümünde yeniden konumlandırmak için yüksekliğin yarısı kadar.

    57'den 61'e kadar olan satırlarda, sol kenar tarafından kesildiği için çizilmeyen koordinatlara karşılık gelen noktalar grafiğin dışında yeniden konumlandırılır. Koordinatı cy sıfıra ve buna cx grafiğin sol kısmı gibi pencere tarafından kesildiğinde gösterilmemesi için herhangi bir negatif sayıya (noktadan büyük) SVG.

    Grafiği JavaScript ile bir nesneden yönetin

    Şu ana kadar açıklanan tüm işlemler, grafiğin yeni sürümlerine daha tipik bir stille yönetmek için bir nesneye entegre edilebilir. JavaScript. Bu uygulama alternatifi, farklı değerlere sahip birçok grafiğin aynı web sayfasına dahil edilmesini basitleştirme avantajına sahiptir.

    Uygulamayı tartışmadan önce, nesneler oluşturmanın en yaygın yollarını gözden geçirelim. JavaScript ve IoT sensör grafiklerinin çizilmesine yönelik öneriyi etkileyen fonksiyonların bazı özellikleri.

    Nesneleri yaratmanın yeni yolunun zaten açıklanmıştı. JavaScript (versiyon 5'ten beri mevcut) ECMAScript) kullanmaktan oluşur Object.create"klasik" yerine kullanılmaya alışılması gereken newTabii ki hala doğru çalışıyor, ancak amacı daha çok dillerin stilini sınıf tabanlı nesnelerle simüle etmek olsa da (JavaScript (nesnelerin oluşturulmasını prototiplere dayandırır) çalışan bir alternatiften ziyade.

    Önceki kod, nesneleri oluşturma arasındaki farkları hatırlamanıza olanak tanır. Object.create o con new. Aynı zamanda nesnenin yaratıldığı işlevin de vurgulanmasına hizmet eder. new Kodun herhangi bir yerinde olabilir, nesnenin başlatılabilmesi için nesnenin zaten mevcut olması gerekir. Object.create (ES5_Object nesnesi bir işlev değildir).

    3. ve 4. satırlarda, nesneyi oluşturan fonksiyondaki özelliklere varsayılan bir değer ayarlamak için new, her özellik karşılık gelen bağımsız değişkenin değerine atanır veya (||), eğer hiçbir argüman aktarılmadıysa, yani bunlar tanımsızsa (undefined), bu durum şu şekilde değerlendirilmektedir: falsevarsayılan değer atanır.

    Bir fonksiyonun yürütüldüğü bağlam JavaScript akılda tutulması gereken ve başkalarıyla çalıştıktan sonra bu programlama dilini kullanırken kafa karıştırıcı olabilecek iki konuyu gündeme getiriyor; C o C + +, bizim durumumuzda. Bağlam, fonksiyonun kapsamında tanımlanan değişkenleri (ve global olanları) içerir; bu arada, ilginç bir kavramı gündeme getirir, tüm bir programlama stilini oluşturan "kapanışlar". JavaScript. Bununla birlikte, beklenebilir thisOnu tanımlayan kod içinde kullanıldığında nesneye atıfta bulunan, tanımlandığı yürütme bağlamı korunur, ancak kullandığı bağlam, işlevin çağrıldığı bağlamdır. Bu davranış çoğu durumda şeffaftır ancak kafa karıştırıcı olabileceği iki durum vardır: başka bir işlevin içinde tanımlanan bir işlev ve bir nesne olayından çağrılan bir yöntem. window.

    Önceki kodu çalıştırırken, sondaki yorumlu metin konsolda görüntülenir. İşaretli iki çizgi kafa karıştırıcı olabilecek davranışı yansıtır: işlev yürütme bağlamı probar_dentro() değil probar()beklenebileceği gibi, ancak window, aynı adı taşıyan özellikleri değil, genel değişkenleri gösterir. Bu davranışı istemiyorsanız, en üst düzey fonksiyonda bir değişken oluşturup onu atamanız yeterlidir. this, aşağıdaki kodda olduğu gibi.

    Bir olaydan bir yöntem çağrıldığında yürütme içeriğini kontrol etmek için windowörneğin tarayıcı penceresini yeniden boyutlandırmak, başka bir özelliktir. JavaScript: "işlev fabrikalarını", yani başka işlevler üreten işlevleri programlama ve bunları geri döndürme olanağı return.

    Yukarıdaki örnek kodda yöntem llamar() de los objeler Contexto İşi yapmaz ancak işle ilgilenen anonim bir işlev döndürür. Her şeyin beklendiği gibi çalıştığını doğrulamak için işlevin konsolda görüntülediği özellikle aynı adı taşıyan bir genel değişken vardır; Bağlam doğruysa, genel değişkenin değeri değil, özelliğin değeri görüntülenecektir.

    JavaScript Cümle sonlarında atladığımız noktalı virgül işaretlerini düzeltmeye çalışın. Bu, rahat bir yazı stili sağlar ancak dikkatli kullanılması gereken iki ucu keskin bir kılıçtır. Çoğu durumda, bunun birkaç satır kaplayan ifadelerde yarattığı istenmeyen etkilerden kaçınmak için parantez kullanabilir veya ifadenin önüne geçebilirsiniz. JavaScript kodu yorumlayacak; Bu nedenle örneğin 8. satırı şunları içerir: function arka bölgesindeki returnBaşka bir satır kullansaydım anlamı çok farklı olurdu. Bana göre en okunabilir çözüm aşağıdaki versiyondaki gibi bir ara (vazgeçilebilir) değişken kullanmaktır; Açıkçası, davranış anlaşıldıktan sonra karar programcıya karşılık gelir.

    Bir ifadeyi işlev olarak değerlendirmek, yani işlevin döndürdüğü değeri değil, işlevi döndürmekle aynı anlamda; son örneğin 21. satırında (önceki örneğin 19. satırındaydı) ile durur clearInterval ile çağrılan fonksiyon setInterval. 30 saniye süreyle etki edebilmesi için durdurma ertelenir. setTimeout, bu da ilk argüman olarak bir fonksiyona ihtiyaç duyar; yürütmeyi parametre olarak teslim etmek clearInterval periyodik çağrıyı içeren değişkenle (işlevle değil) clearInterval), son satırdaki anonim işlevin ne için yaratıldığıdır.

    İşlev tanımını entegre eden kodun daha kompakt şekilde yazılması (21. satırdaki gibi) veya bana göre daha okunabilir bir yardımcı değişken kullanılması (19. ve 20. satırdaki gibi) arasındaki seçim, performans açısından çok az farklılık gösterir ve daha fazla stile ve okunabilirliğe bağlıdır. Bakım.

    Kodu test etmek için, sunucuda veri bulundurmadan önce, istenilen aralıkta rastgele değerler üreteci kullanabilir veya istenen koşullar altında çalışmayı simüle eden kontrollü değerlere sahip tablolar hazırlayabilirsiniz. Aşağıdaki örnekte tüm aralıkta basit bir veri oluşturucu kullanılmaktadır, bu nedenle biraz abartılı görünmektedirler.

    Test etmek için şunları yapabilirsiniz: örneğin tam kodunu indirin yazılmış bir web sayfası tarafından oluşturulmuş HTML, stil CSS ve kod JavaScript. İkincisi en alakalı olanıdır, çünkü diğer bileşenler yalnızca minimum düzeyde destek sağlar, çok basitleştirilmiştir ve ilgili bölümlerdeki makalelerde çok daha fazla geliştirilmiştir.

    Yorum Ekle

    Kaçırmış Olabilirsiniz