Javascript tıklama eylemi. JavaScript onclick olayı ve olayları işlemenin üç yolu

  • 09.05.2019

onclick()'in nasıl çalıştığını anlamak isteyen herkese merhaba. Bugünün makalesi, bu olay işleyicisinin çalışma prensibini bir kez ve herkes için anlamanıza ve belirli bir onclick JavaScript örneğini veya daha doğrusu örnekleri ayrıştırmanıza yardımcı olacaktır.

Size bu araçla çalışmanın birkaç yolunu göstereceğim, avantaj ve dezavantajlarının neler olduğunu açıklayacağım ve jQuery'nin olaylarla nasıl çalıştığını anlatacağım. Şimdi malzemenin analizine geçelim!

Olay işleyicileri atama

Öncelikle, sorunun teorik kısmını analiz edelim. Sayfalarındaki hemen hemen herkes komut dosyalarını işler. Ve genellikle bunlar çeşitli olaylardır. Tüm bu programlanmış olayların tetiklenmesi için, onlar için bir işleyici kurulmalıdır.

Yazma kurallarına göre, tüm işleyiciler adlarında gözlemlenen "on + olay adı" içerir. tıklamada ()... Seçilen olaya bağlı olarak, farklı eylemler sonucunda işleme gerçekleşecektir. Bizim durumumuzda, kullanırken tıklamada () yalnızca sol fare tıklamasının neden olduğu olaylar yürütülür.

Olay işleyici atamanın farklı yolları

Bugün, bazı veya bazı olayların işleyicisini koda sokmak için birkaç seçenek var.

Basit olayları kullanma

Html belgesinin tam işaretlemesine onclick () enjekte etmek olan basit bir seçenekle başlayalım. Şuna benziyor:



Gördüğünüz gibi farenin sol tuşu ile butona bastığınızda "Tıkla-tıkla!" mesajı çıkıyor. Küçük ama önemli bir ayrıntıya dikkatinizi çekmek istiyorum. İçeri Alarm sadece tek tırnak ('') kullanılabilir.

Ayrıca bu durumda, anahtar kelimeyi kullanabilirsiniz. Bugün nasılsın... Geçerli öğeye atıfta bulunur ve bunun için mevcut tüm yöntemleri sağlar.

Bu kod satırı, "Beni tıkla" metnini içeren bir düğme oluşturur. Bastıktan sonra ekranda şu mesajı göreceksiniz: “Basın!” Düğmenin ilk adının yerini alacak.

Bu yöntem inkar edilemez derecede basittir. Ancak, yalnızca benzer görevler için uygundur, ör. mesajları görüntüleme veya basit komutları yürütme.

Döngüsel yapılar kullanmak, etiket kullanmak vb. gerekiyorsa, bu yöntem uygun değildir. Kodun okunabilirliğini azaltacak, aynı zamanda hantal ve dağınık hale getirecektir.

Bu durumda, işlevlere başvurmaya değer.

Fonksiyonlarla çalışma

İşlevler, gerekli kodu daha sonra olay işleyicisi aracılığıyla çağrılabilecek ayrı bir bloğa ayırmanıza izin verir.

Örnek olarak, 1'den başlayıp 5'e kadar çıkan sayıyı çeşitli derecelerde kullanıcıya göstermek için bir uygulama ekledim. Bunun için bir fonksiyon oluşturdum sayımPow () hangi parametrelere geçilebilir. Uygulamamda, kullanıcının fonksiyon değişkeni olarak bir rakam girmesi gerekiyor.

Böylece yukarıda adı geçen fonksiyonla ilişkilendirilen işleyici aracılığıyla hesaplamalar yapıldı ve görüntülendi.



Bu yöntem genellikle geliştirme sırasında kullanılır. Bununla birlikte, en popüler değildir, çünkü olayları bu şekilde bağlamak her zaman uygun değildir. Bazen, bazı sorunları çözmek için en iyi seçenek, özelliklerini kullanarak nesnelerin olaylara esnek bir şekilde bağlanmasını sağlamaktır.

DOM öğesi özellikleri

Bilmeyenler için DOM - "Belge Nesnesi Modeli"("Belge Nesnesi Modeli"). Çeşitli değişiklikler yapmak ve öğeleri manipüle etmek için ana araçtır.

DOM hiyerarşik bir ağaç olduğundan, belirli dallar üzerinden ilerleyerek sayfa nesnelerinin belirli özelliklerine ve yöntemlerine erişilebilir.

Örnek olarak, arka plan rengini varsayılandan maviye değiştirmeye karar verdim. Bunu yapmak için zincirden geçtim belge.body.style.backgroundRenk.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15



jQuery kitaplığını kullanma

Işığın serbest bırakılmasıyla birlikte, yazılı kodu büyük ölçüde basitleştiren ve kısaltan birçok ek komut, özellik ve yöntem vardı. Geliştiriciler çoğu zaman, tanımlayıcısı (document.getElementById (iden)), sınıfı (element.getElementsByClassName (className)), etiketi (elem.getElementsByTagName (tag)) veya adı (document.getElementsByName (ad) ile belirli bir öğeyi elde etmek için özellikleri kullanır. )) ...

Neyin tehlikede olduğunu anlamak için aşağıdaki örneği inceleyin.

jQuery ile çalışma

Dikkatlice! Düğmeye tıklarsanız, bu içerikte değişiklikler olacaktır.



Gördüğünüz gibi, her şey oldukça basit çalışıyor.

Makalemi beğendiyseniz, güncellemelere abone olduğunuzdan emin olun. Önümüzde hala birçok ilginç ve bilgilendirici şey var. Yayınlarımın repostları için minnettar olurum. Güle güle!

Saygılarımla, Roman Chueshov

Okumak: 629 kez

Javascript'te onclick kadar basit bir olay, çeşitli şekillerde tetiklenebilir ve bazı incelikleri gizler. Olay, farenin sol tuşu ile bir öğeye tıkladığınızda gerçekleşir. Tıkladığınızda, fare düğmesine basmak ve bırakmak gibi iki olayın daha gerçekleştiğini belirtmekte fayda var.

Tüm örnekler "a" etiketinde (bağlantı) dikkate alınacaktır. Kafanız karışmasın, diğer etiketlerle benzer şekilde çalışacaktır.

Bir onclick olayını kapatmanın en kolay yolu, onu doğrudan html etiketine yazmaktır:

örnek 1

Eylemdeki kod:

Örnekte, bağlantıya tıkladığınızda bir açılır mesaj kutusu görüntülenir. Eyleme ek olarak "return false;" ekledik. Bu, "onclick" olayı tetiklendikten sonra bağlantının takip edilmesini önlemek için gereklidir. Diğer öğelerde ( href özelliğinin olmadığı durumlarda), bu atlanabilir.

Olay küçük kod içeriyorsa, dikkate alınan seçenek kullanılabilir. Aksi takdirde diğer yöntemlere dikkat etmelisiniz.

onclick olay kodunu bir javascript işlevine taşıma

Bir sonraki iyi şey, javascript kodunu html etiketlerinden ayırmamızdır. Etikete fonksiyonun adını yazarız ve fonksiyonun kendisini ayrı bir bloğa koyarız:

Rengi değiştir

Eylemdeki kod:

Ama burada da her şey mükemmel değil. Ya etkinliğin sitenin tüm bağlantılarına asılması gerekiyorsa ve bunlardan yüzlercesi varsa? Zor görünüyor, ancak gerçekte on satırdan daha az kod var. Sorun seçiciler kullanılarak çözülür. Örnekte yine “a” etiketi ile işlemler yapacağız fakat link yerine “img” veya “div” kullanmamıza hiçbir engel yok.

Javascript kodundan bir öğeye tıklıyoruz

Bence en pratik ve güvenilir olan bir yol daha düşünelim. İyidir çünkü olay birçok unsura asılabilir. Bunu yapmak için, onclick olayını uygulamak istediğiniz öğeleri seçmek için javascript seçicileri kullanmanız gerekir.

Açık

Eylemdeki kod:

Elemanların seçiciler tarafından seçilmesine ayrı bir konu ayırabilirsiniz, sadece yeni HTML5 spesifikasyonuna göre javascript'te de seçimlerinin kolaylaştığını söyleyebilirim. jquery veya CSS'ye aşina iseniz, gerekli öğeleri seçmeniz zor olmayacaktır. Örneğin, "link" sınıfına sahip tüm öğeleri seçmek ve bunlara istenen eylemi eklemek çok kolaydır:

// gerekli elemanları seçin var a = document.querySelectorAll (". link"); // bulunan tüm öğeleri yineleyin ve olayları üzerlerine asın .forEach.call (a, function (el) (// olayları asın el.click = function (e) (// eylemleri gerçekleştir)));

jQuery'yi kullanma

Proje jQuery kitaplığını kullanıyorsa, kodu daha da basitleştirebilirsiniz. En yaygın iki yola bakalım:

$ (işlev () ($ (". bağlantı").tıklayın (işlev () (// eylemler));));

Ve öncekiyle aynı olan bir seçenek daha.

$ (işlev () ($ (". bağlantı"). on ("tıkla", işlev () (// eylemler));));

Çok sayıda yararlı işlevsellik taşıdığı için "on ()" işleyicisini ayrıca tanımak daha iyidir. Örneğin, eylemin uygulanacağı bir boşlukla ayrılmış birkaç olay belirtme, olayları alt öğelere devretme ve başlangıçta sayfada olmayan dinamik olarak eklenen öğelere bir olay asmanız gerektiğinde de yararlıdır. .

Bazı JavaScript olay programları, doğrudan kullanıcı girişiyle çalışır. Oluşma anı ve bu tür etkileşimlerin sırası önceden tahmin edilemez.

Etkinlik sahipleri

Bir tuşa basıldığında, tekrar bırakılmadan önce tuşa basıldığı anı yakalamak için durumunu sürekli okuyarak yanıt verebilirsiniz.

İlkel makinelerde veri girişi bu şekilde işlenirdi. Daha ilerici, bir tuş vuruşunun algılanması ve kuyruğa alınmasıdır. Program daha sonra yeni olaylar için kuyruğu düzenli olarak kontrol edebilir ve orada bulduklarına tepki verebilir. Bu durumda program kuyruğa bakmayı unutmamalı ve bunu sık sık yapmalıdır.

Bir tuşa basılmasından programın bu olayı algılamasına kadar geçen sürede, aslında isteklere yanıt vermez. Bu yaklaşıma anket denir.

Çoğu programcı mümkünse bundan kaçınmaya çalışır.

En iyi yol, kodunuzun olaylara olduğu gibi tepki vermesini sağlayan bir sistem uygulamaktır. Tarayıcılar, belirli JavaScript olayları için işleyici işlevlerini kaydetme olanağı sağlayarak bunu uygular:

İşleyiciyi etkinleştirmek için bu belgeye tıklayın.

addEventListener işlevi, birinci argüman tarafından açıklanan olay meydana geldiğinde ikinci argümanının çağrılması için kaydedilir.

Olaylar ve DOM Düğümleri

Her tarayıcı olay işleyicisi bir bağlamla kaydedilir. addEventListener işlevini çağırdığınızda, tarayıcıda global aralık pencere nesnesine eşdeğer olduğundan, tüm pencere için bir yöntem olarak çağrılır. Her DOM öğesinin, bu belirli öğedeki olayları izlemenizi sağlayan kendi addEventListener yöntemi vardır:

Burada bir işleyici yok.

Bu örnekte, işleyici düğme düğümüne bağlıdır. JavaScript'in fare olayları, işleyiciyi harekete geçirir, ancak belgenin geri kalanına tıklandığında olmaz.

Düğümde onclick niteliğini ayarlayarak aynı sonucu elde ederiz. Ancak bir düğümün yalnızca bir onclick özniteliği vardır, bu nedenle her düğüm için yalnızca bir işleyici kaydedebilirsiniz. addEventListener yöntemi, istediğiniz sayıda işleyici eklemenize olanak tanır. Bu nedenle, zaten kayıtlı olan bir işlemcinin yanlışlıkla değiştirilmesine karşı sigortalıyız.

removeEventListener yöntemi, addEventListener ile aynı bağımsız değişkenlerle çağrılır. İşleyiciyi kaldırır:

Bir işleyici işlevini iptal etmek için ona bir ad veririz (örneğin, bir Zamanlar). Hem addEventListener'a hem de removeEventListener'a bu şekilde iletiyoruz.

Olay Nesneleri

Yukarıdaki örneklerde bundan bahsetmemiş olsak da, JavaScript olay işleyici işlevine bir argüman iletilir: olay nesnesi. Etkinlik hakkında ek bilgi sağlar. Örneğin, hangi fare düğmesine basıldığını bilmek istiyorsak, hangi olay nesnesinin özelliğinin değerini almamız gerekir:

Nesnede saklanan bilgiler, olayın türüne göre farklılık gösterir. Nesnenin type özelliği her zaman olayı tanımlayan bir dize içerir (örneğin, “ Tıklayın" veya " fare aşağı«).

Yayma

Etkinlik sahipleri ( ör. JavaScript dokunma olayları) üst düğümler için kayıtlı olanlar, çocuklar üzerinde meydana gelen olayları da alır. Bir paragrafın içindeki bir düğmeye tıklandığında, paragraf olay işleyicileri de bir tıklama olayı alır.

Olay, meydana geldiği düğümden üst düğüme ve belgenin köküne yayılır. Belirli bir düğümde kayıtlı tüm işleyiciler sırayla etkinleştikten sonra, tüm pencere için kayıtlı işleyicilere olaya yanıt verme fırsatı verilir.

Herhangi bir zamanda, bir olay işleyici, olayın daha fazla yayılmasını önlemek için olay nesnesinde stopPropagation yöntemini çağırabilir. Bu, başka bir etkileşimli öğenin içinde bir düğmeniz olduğunda ve düğme tıklandığında dış öğelere tıklamak için ayarlanan davranışın etkinleştirilmesini istemiyorsanız yararlı olabilir.

Aşağıdaki örnekte, işleyicileri kaydediyoruz " FareAşağı»Hem buton hem de paragraf için. Sağ tıkladığınızda ( JavaScript fare olayları) işleyici, paragraf işleyicisinin başlamasını engelleyen stopPropagation yöntemini çağırır. Düğmeye başka bir fare düğmesiyle basıldığında, her iki işleyici de başlatılır:

Paragraf ve içinde .

Çoğu olay nesnesinin, içinde meydana geldikleri düğüme işaret eden bir hedef özelliği vardır. Bu özelliği, düğümden yukarı doğru yayılan bazı olayları yanlışlıkla işlemekten kaçınmak için kullanabilirsiniz.

Belirli bir türdeki bir olayın aralığını genişletmek için bir JavaScript olay hedefi de kullanabilirsiniz. Örneğin, uzun bir düğme listesi içeren bir düğümünüz varsa, tüm düğmeler için işleyici örneklerini kaydetmek yerine, harici düğüm için bir tıklama işleyicisi kaydetmek ve düğmenin tıklanıp tıklanmadığını izlemek için target özelliğini kullanmak daha uygundur:

Varsayılan eylemler

Birçok olayın kendileriyle ilişkili varsayılan eylemleri vardır. Bağlantıya tıklarsanız, bağlantının hedef öğesine yönlendirilirsiniz. Aşağı oku tıklarsanız, tarayıcı sayfayı aşağı kaydırır. Sağ tıklarsanız, bir bağlam menüsü açılır.

Çoğu olay türü için, varsayılan eylemler gerçekleştirilmeden önce JavaScript olay işleyicileri çağrılır. Varsayılan davranışın çalışmasını istemiyorsanız, olay nesnesi üzerinde önlemeVarsayılan yöntemini çağırmalısınız.

Özel klavye kısayollarını veya bağlam menülerini uygulamak için kullanın. Veya kullanıcıların beklediği davranışı geçersiz kılmak için. Aşağıda takip edilemeyen bir bağlantı var:

MDN

Bunu yapmak için zorlayıcı bir nedeniniz olmadıkça bunu yapmamaya çalışın.

Tarayıcıya bağlı olarak, bazı olaylara müdahale edilemeyebilir. Örneğin Google Chrome'da klavye kısayolu ( olay anahtar kodu JavaScript) geçerli sekmeyi kapatmak için ( Ctrl-W veya Komut-W) JavaScript tarafından işlenemez.

Önemli olaylar

Kullanıcı klavyede bir tuşa bastığında tarayıcı " tuşa basmak". Anahtarı bıraktığında, olay “ anahtarlama«:

V tuşuna bastığınızda bu sayfa mor renge döner.

Ayrıca, bu olay, kullanıcı bir tuşa basıp basılı tuttuğunda veya tuş basılı tutulduğunda tetiklenir. Örneğin oyundaki karakterin hızını bir ok tuşuna basarak artırmak ve tuşu bırakarak tekrar azaltmak istiyorsanız, tuşa her basıldığında hızı artırmamaya dikkat etmeniz gerekiyor.

Önceki örnek, olay nesnesinin JavaScript anahtar kodu özelliğini kullanmıştı. Hangi tuşa basıldığını veya bırakıldığını belirler. Sayısal anahtar kodunun gerçek anahtara nasıl dönüştürüleceği her zaman açık değildir.

Unicode karakter kodu, harf ve sayı tuşlarının değerlerini okumak için kullanılır. Harf ile ilişkilidir ( büyük harf) veya tuşta belirtilen numara. Dizeler için charCodeAt yöntemi, bu değeri elde etmenizi sağlar:

konsol.log ("Violet" .charCodeAt (0)); // → 86 console.log ("1" .charCodeAt (0)); // → 49

Diğer anahtarlar, kendileriyle ilişkili daha az tahmin edilebilir anahtar kodlarına sahiptir. Doğru kodu bulmanın en iyi yolu denemektir. Aldığı tuş kodlarını yakalayan bir tuşa basma olay işleyicisini kaydedin ve istediğiniz tuşa basın.

Shift, Ctrl, Alt gibi tuşlar, normal tuşlar gibi olayları yükseltir. Ancak tuş kombinasyonlarını izlerken, bu tuşlara klavye ve JavaScript fare olayları özellikleri tarafından basılıp basılmadığını da anlayabilirsiniz: shiftKey, ctrlKey, altKey ve metaKey:

Devam etmek için Ctrl-Space tuşlarına basın.

Gelişmeler " tuşa basmak" ve " anahtarlama»Gerçek tuş vuruşları hakkında bilgi sağlayın. Peki ya asıl metnin girilmesini istiyorsak? Anahtar kodlardan metin almak elverişsizdir. Bunun için bir olay var" tuşa basma"Hangisi hemen sonra tetiklenir" tuşa basmak". Tuşa basıldığında "keydown" ile tekrarlanır. Ancak yalnızca karakter girdiğiniz tuşlar için.

Olay nesnesindeki charCode özelliği, bir Unicode karakter kodu olarak yorumlanabilen kod içerir. Bu kodu tek karakterli bir dizgeye dönüştürmek için String.fromCharCode işlevini kullanabiliriz.

Odağı bu sayfaya ayarlayın ve bir şeyler yazın.

Olayın gerçekleştiği DOM düğümü, tuşa basıldığında odakta olan öğeye bağlıdır. Normal düğümlerin giriş odağı olamaz ( onlar için tabindex niteliğini ayarlamadığınız sürece), ancak bağlantılar, düğmeler ve form alanları gibi öğeler olabilir.

Belirli bir öğeye odaklanılmamışsa, o zaman document.body, önemli olaylar ve JavaScript dokunma olayları için hedef düğümdür.

Fare tıklamaları

Fare düğmesine basmak da bir dizi olayı tetikler. Gelişmeler " fare aşağı" ve " fare yukarı"Benzer" tuşa basmak" ve " anahtarlama". Fare düğmesine basıldığında ve bırakıldığında çalışırlar. Bu olaylar, olay başlatıldığında üzerine gelinen DOM düğümlerinde tetiklenir.

Olaydan sonra fare düğmesinin hem basılması hem de bırakılmasının ait olduğu ortak bir düğüm için " fare yukarı"Olay" Tıklayın". Örneğin, bir öğe üzerinde fare düğmesine basarsanız ve ardından imleci başka bir öğeye hareket ettirir ve düğmeyi bırakırsanız, olay “ Tıklayın"Bu öğelerin her ikisini de içeren bir öğede gerçekleşecek.

Birbirine yakın iki tıklama meydana gelirse, “ dblclick"(Çift tıklama). İkinci tıklamadan sonra görünür. Fare olayının gerçekleştiği konum hakkında doğru bilgi almak için, belgenin sol üst köşesine göre olayın koordinatlarını (piksel olarak) içeren pageX ve pageY özelliklerinin değerini almanız gerekir.

Aşağıda ilkel bir çizim programının uygulanması yer almaktadır. Belgede fareye her tıklandığında (imlecin altında), bir nokta eklenir:

clientX ve clientY özellikleri pageX ve pageY'ye benzer, ancak bunlar belgenin görünen kısmına atıfta bulunur. Farenin koordinatlarını getBoundingClientRect işlevi tarafından döndürülen koordinatlarla karşılaştırmak için kullanılabilirler.

fare hareketi

Fare imleci her hareket ettiğinde, olay " fare hareketi»JavaScript fare olay kümesinden. Farenin konumunu izlemek için kullanılabilir. Bu, fare ile sürükle ve bırak özelliğini uygularken kullanılır.

Aşağıdaki örnekte, program bir paneli görüntüler ve siz sürükledikçe panelin daralması veya genişlemesi için olay işleyicilerini ayarlar:

Genişliğini değiştirmek için panelin kenarını sürükleyin:

İşleyicinin " fare hareketi»Bütün pencere için kayıtlıdır. Yeniden boyutlandırma sırasında fare bölmenin dışına çıksa bile, fare düğmesi bırakıldığında bölme genişliğini günceller ve JavaScript dokunma olaylarını durdururuz.

Kullanıcı fare düğmesini bıraktığında paneli yeniden boyutlandırmayı durdurmamız gerekiyor. Ne yazık ki, tüm tarayıcılar " fare hareketi"Mülk olan. Benzer bilgiler sağlayan standart bir özellik düğmeleri vardır, ancak tüm tarayıcılarda da desteklenmez. Neyse ki, tüm büyük tarayıcılar bir şeyi destekler: düğmeler veya hangi. Yukarıdaki örnekteki buttonPressed işlevi ilk olarak button özelliğini kullanmayı dener, yoksa hangisine gider.

Fare imleci bir düğümün üzerine geldiğinde veya bir düğümden ayrıldığında, olaylar " fareyle üzerine gelmek" veya " fare çıkışı". Fareyle üzerine gelme efektleri oluşturmak, bazı imzaları görüntülemek veya bir öğenin stilini değiştirmek için kullanılabilirler.

Böyle bir etki yaratmak için sadece olay gerçekleştiğinde onu göstermeye başlamak yeterli değildir. fareyle üzerine gelmek"Ve olaydan sonra bitiyor" fare çıkışı". Fare bir düğümden çocuklarından birine geçtiğinde, " fare çıkışı". Fare işaretçisi düğümün yayılma aralığından ayrılmamış olsa da.

Daha da kötüsü, bu JavaScript olayları diğer olaylarla aynı şekilde yayılır. Fare, bir işleyicinin kayıtlı olduğu alt düğümlerden birinden ayrıldığında, olay “ fare çıkışı«.

Bu soruna geçici bir çözüm bulmak için olay nesnesinin RelatedTarget özelliğini kullanabilirsiniz. Bir olay durumunda " fareyle üzerine gelmek"Daha önce hangi öğenin üzerine gelindiğini gösterir. Ve meydana gelmesi durumunda " fare çıkışı"- işaretçinin hangi öğeye taşındığı. Fareyle üzerine gelme efektini yalnızca ilgiliTarget hedef düğümümüzün dışında olduğunda değiştireceğiz.

Bu durumda, fare imleci düğümün dışından düğümün üzerine geldiği için davranışı değiştiririz (veya tam tersi):

Farenizi bunun üzerine getirin paragraf.

isInside işlevi, belirli bir düğümün üst bağlantılarını veya belgenin en üstüne ulaşılana kadar (ne zaman düğüm sıfır). Veya ihtiyacımız olan ana öğe bulunmayacaktır.

Aşağıdaki örnekte gösterildiği gibi, vurgulu efekti CSS: hover sözde seçiciyi kullanarak oluşturmak çok daha kolaydır. Ancak fareyle üzerine gelme efekti, yalnızca hedef düğümün stilini değiştirmekten daha karmaşık bir şey önerdiğinde, " fareyle üzerine gelmek" ve " fare çıkışı» ( JavaScript fare olayları):

Kaydırma etkinlikleri

Bir öğe kaydırıldığında, üzerinde bir JavaScript kaydırma olayı başlatılır. Kullanıcının o anda ne görüntülediğini takip etmek için kullanılabilir; görünümün dışındaki animasyonu devre dışı bırakmak için.

Aşağıdaki örnekte, belgenin sağ üst köşesinde bir ilerleme göstergesi görüntülüyoruz ve sayfayı aşağı kaydırdıkça kademeli olarak farklı bir renkle dolacak şekilde güncelliyoruz:

Beni kaydır...

Eleman üzerinde pozisyonu veya sabit özelliği ayarlayarak, pozisyon: mutlak ayarıyla aynı sonucu elde ederiz. Ancak bu, öğenin belgenin geri kalanıyla birlikte kaydırılmasını da engeller. Sonuç olarak, ilerleme göstergesi üst köşede statik olarak sabitlenecektir. İçinde, mevcut ilerlemeye göre yeniden boyutlandırılan başka bir öğe var.

Genişliği ayarlarken, öğenin boyutunun ilerleme çubuğunun boyutuyla orantılı olarak yeniden boyutlandırılması için px değil, ölçüm birimi olarak % kullanırız.

Genel değişken innerHeight, belgenin mevcut kaydırılabilir toplam yüksekliğinden çıkarmamız gereken pencerenin yüksekliğini içerir. Belgenin en altına ulaştığınızda pencereyi aşağı kaydıramazsınız. InnerWidth, innerHeight ile de kullanılabilir. pageYOffset'i bölerek ( kaydırma kutusunun mevcut konumu) izin verilen maksimum kaydırma konumuyla ve 100 ile çarparak ilerleme çubuğu için yüzdeyi alırız.

JavaScript kaydırma olayında önlemeDefault'u çağırmak, kaydırmayı engellemez. Olay işleyicisi yalnızca kaydırma gerçekleştikten sonra çağrılır.

Odak olayları

Bir öğe giriş odağına sahip olduğunda, tarayıcı " odak". Giriş odağı kaldırıldığında, olay " bulanıklık«.

Bu iki olayın yayılımı yoktur. Çocuğun odağı olduğunda ebeveyn işleyicisi bilgilendirilmez.

Aşağıdaki örnek, o anda giriş odağına sahip olan metin alanı için bir araç ipucu görüntüler:

İsim:

Yaş:

pencere nesnesi olayları alır " odak" ve " bulanıklık“Kullanıcı bir sekmeye gittiğinde veya sekmeden ayrıldığında, belgenin görüntülendiği tarayıcı penceresi.

Olayı yükle

Sayfanın yüklenmesi tamamlandığında, belge gövdesi ve pencere nesneleri için JavaScript olayı "load" başlatılır. Tüm belgenin yüklenmesini gerektiren eylemlerin başlatılmasını programlamak için kullanılır. içerik olduğunu unutmayın

Bazen planladığımız bir özelliği iptal etmek gerekiyor. Bu, setTimeout işlevinin dönüş değerini depolayarak ve üzerinde clearTimeout'u çağırarak yapılır:

var bombTimer = setTimeout (işlev () (console.log ("BOOM!");), 500); if (Math.rastgele ()< 0.5) { // 50% chance console.log("Defused."); clearTimeout(bombTimer); }

CancellAnimationFrame işlevi, clearTimeout ile aynı şekilde çalışır. Çerçeveyi iptal etmek için requestAnimationFrame tarafından döndürülen değer tarafından çağrılır ( henüz çağrılmadıysa).

Benzer bir dizi işlev, setInterval ve clearInterval, her X milisaniyede bir eylemi tekrarlaması gereken bir zamanlayıcı ayarlamak için kullanılır:

var keneler = 0; var clock = setInterval (function () (console.log ("tick", ticks ++); if (tikler == 10) (clearInterval (clock); console.log ("stop.");)), 200) ;

Bölmek

Bazı olay türleri kısa bir süre içinde birçok kez tetiklenebilir ( örneğin "mousemove" ve javascript kaydırma olayı). Bu tür olayları işlerken, bunun çok uzun sürmemesine dikkat etmelisiniz, aksi takdirde işleyici eylemi o kadar uzun süre gerçekleştirecek ki, belge ile etkileşim yavaşlayacak ve spazmodik hale gelecektir.

Böyle bir işleyicide standart olmayan bir şey yapmanız gerekiyorsa, çok uzun sürmediğinden emin olmak için setTimeout'u kullanabilirsiniz. Bu genellikle olayı ezmek olarak adlandırılır. Kırma için birkaç farklı yaklaşım vardır.

İlk örnekte, kullanıcı yazarken bir şeyler yapmak istiyoruz. Ancak bunu her tuşa basma olayından sonra yapmak istemiyoruz. Kullanıcı hızlı yazarken, bir duraklama olana kadar beklemeniz gerekir. Olay işleyicisinde eylemi hemen yürütmek yerine bir gecikme belirledik. Ayrıca önceki gecikmeyi de gideririz ( varsa). Olaylar kısa aralıklarla meydana gelirse ( bizim tarafımızdan belirlenen gecikmeden daha az), daha sonra önceki olaydan gelen gecikme iptal edilir:

clearTimeout öğesine tanımsız bir değer iletmek veya halihazırda devam etmekte olan bir gecikme için onu çağırmak hiçbir etkiye sahip olmayacaktır. Artık ne zaman çağıracağımıza dikkat etmemize gerek yok, sadece her olay için yapıyoruz.

Yanıtları kısa bir süreye bölmeniz gerekiyorsa farklı bir senaryo kullanabilirsiniz. Ancak aynı zamanda bir dizi etkinlik sırasında başlatılırlar ve hemen ardından değil. Örneğin, olaylara yanıt olarak gönderebilirsiniz " fare hareketi» ( JavaScript fare olayları) farenin geçerli koordinatları, ancak yalnızca her 250 milisaniyede bir:

Çözüm

Olay işleyicileri, üzerinde doğrudan kontrolümüz olmayan olayları algılamamıza ve bunlara yanıt vermemize olanak tanır. addEventListener yöntemi, böyle bir işleyiciyi kaydetmek için kullanılır.

Her olay belirli bir türe aittir (" tuşa basmak«, « odak"Ve benzeri) onu tanımlar. Çoğu olay, belirli bir DOM öğesi için tetiklenir ve ardından öğenin üst düğümlerine yayılır. Bu, bu öğelerle ilişkili işleyicilerin bunları işlemesine olanak tanır.

Bir işleyici çağrıldığında, ona eylem hakkında ek bilgiler içeren bir olay nesnesi iletilir. Bu nesne ayrıca olayın daha fazla yayılmasını durdurmak için yöntemler içerir ( yayılımı durdur) veya varsayılan tarayıcının olayı işlemesini önleyin ( önlemekVarsayılan).

Tuşlara basmak olayları yükseltir " tuşa basmak«, « tuşa basma" ve " anahtarlama". Fareye tıklamak olayları yükseltir " fare aşağı«, « fare yukarı" ve " Tıklayın". Fareyi hareket ettirmek -" fare hareketi«, « fare" ve " fare çıkışı«.

JavaScript kaydırma olayı “ kullanılarak tanımlanabilir. taslak", Ve odak değişikliği" odak" ve " bulanıklık". Belgenin pencereye yüklenmesi tamamlandıktan sonra, “ yük«.

Bir JavaScript programının yalnızca bir bölümü aynı anda çalışabilir. Olay işleyicileri ve diğer zamanlanmış komut dosyaları, kuyruktaki diğer komut dosyalarının yürütülmesini tamamlamasını beklemelidir.

Sitenizde sevgili kediniz Murzik'in bir fotoğrafı varsa, ancak birisinin onu kopyalamasını veya sabit diske kaydetmesini istemiyorsanız, sitenin gövdesine böyle bir komut dosyası koyun.

Olay işleme

JavaScript istemci programları, program yürütmenin olaya dayalı olduğu bir programlama modelini temel alır. Bu programlama stiliyle, web tarayıcısı, belgeye veya bazı öğelerine bir şey olduğunda bir olay oluşturur. Örneğin, bir web tarayıcısı, kullanıcı bir köprünün üzerine geldiğinde veya klavyede bir tuşa bastığında bir belgeyi yüklemeyi bitirdiğinde bir olay oluşturur.

Bir JavaScript uygulaması, belirli bir belge öğesi için belirli bir olay türüyle ilgileniyorsa, bu olay gerçekleştiğinde çağrılacak bir veya daha fazla işlevi kaydedebilir. Bunun web programlamaya özgü olmadığını unutmayın: tüm GUI uygulamaları bu şekilde hareket eder - sürekli olarak bir şeyin olmasını beklerler (yani olayların olmasını beklerler) ve olanlara yanıt verirler.

Etkinlik tipi olayı tetikleyen eylemin türünü tanımlayan bir dizedir. Örneğin "mousemove" türü, kullanıcının fare işaretçisini hareket ettirdiği anlamına gelir. "Keydown" türü, klavyede bir tuşa basıldığı anlamına gelir. Ve "yükleme" türü, belgenin (veya başka bir kaynağın) ağdan yüklenmesinin bittiği anlamına gelir. Olay türü yalnızca bir dize olduğundan, bazen olay adı olarak anılır.

Etkinliğin amacı olayın meydana geldiği veya olayın ilişkilendirildiği nesnedir. İnsanlar bir olay hakkında konuştuklarında genellikle olayın türü ve amacından bahsederler. Örneğin, bir Window nesnesinin "load" olayı veya bir elemanın "click" olayı

addEventListener() yöntemini ilk bağımsız değişkende "click" dizesiyle çağırmanın, onclick özelliğinin değeri üzerinde hiçbir etkisi yoktur. Yukarıdaki snippet'te, düğmeye tıklandığında iki uyarı () iletişim kutusu görüntülenecektir. Ancak daha da önemlisi, addEventListener() yöntemi birden çok kez çağrılabilir ve aynı nesnede aynı olay türü için birden çok işleyici işlevini onunla kaydedebilir. Bir nesnede bir olay meydana geldiğinde, o olay türü için kayıtlı tüm işleyiciler, kayıtlı oldukları sırayla çağrılır.

Aynı nesne üzerinde aynı argümanlarla birden çok kez addEventListener () yönteminin çağrılmasının bir etkisi olmaz - işleyici işlevi yalnızca bir kez kaydedilir ve tekrarlanan çağrılar, işleyicilerin çağrılma sırasını etkilemez.

addEventListener () yöntemiyle eşleştirilen yöntemdir kaldırEventListener () aynı üç argümanı alır, ancak eklemez, ancak işleyici işlevini nesneden kaldırır. Bu, genellikle geçici bir olay işleyici kaydetmeniz ve ardından bir noktada kaldırmanız gerektiğinde kullanışlıdır.

IE9'dan önceki Internet Explorer, addEventListener () ve removeEventListener () yöntemlerini desteklemez. IE5 ve üzeri sürümlerde benzer yöntemler tanımlanmıştır, ataş Olay () ve ayırmakEvent ()... IE'deki olay modeli yakalama aşamasını desteklemediğinden, AttachEvent() ve detachEvent() yöntemleri yalnızca iki bağımsız değişken alır: olay türü ve işleyici işlevi, IE'deki yöntemlerin ilk argümanı işleyicinin adıdır. bu öneki olmayan tür olayları yerine "on" ön ekine sahip özellik.

Olay işleyicilerini çağırma

Bir olay işleyiciyi kaydettikten sonra, belirtilen nesnede belirtilen türde bir olay ortaya çıktığında web tarayıcısı bunu otomatik olarak arayacaktır. Bu bölüm, olay işleyicilerinin çağrıldığı sırayı, işleyicilerin bağımsız değişkenlerini, çağrı bağlamını (bu değer) ve işleyicinin dönüş değerinin amacını ayrıntılı olarak açıklar. Ne yazık ki, bu ayrıntılardan bazıları IE 8 ve altı ile diğer tarayıcılar arasında farklılık göstermektedir.

Olay işleyici argümanı

Bir olay işleyiciyi çağırdığınızda, genellikle (aşağıda tartışılan bir istisna dışında) olay nesnesine tek bir argüman olarak iletilir. Olay nesnesi özellikleri, olay hakkında ek bilgiler içerir. Örneğin type özelliği, meydana gelen olayın türünü belirler.

IE sürüm 8 ve altında, bir özellik ayarlanarak kaydedilen olay işleyicileri, çağrıldıklarında bir olay nesnesi iletilmez. Bunun yerine olay nesnesi, window.event global değişkeninde depolanır. Taşınabilirlik için, olay işleyicileri, bağımsız değişken olmadan çağrıldıklarında window.event değişkenini kullanmak için aşağıda gösterildiği gibi biçimlendirilebilir:

Olay nesnesi, AttachEvent () yöntemiyle kayıtlı olay işleyicilerine iletilir, ancak bunlar ayrıca window.event değişkenini de kullanabilirler.

HTML özniteliğine sahip bir olay işleyici kaydettiğinizde, tarayıcı JavaScript dizesini bir işleve dönüştürür. IE olmayan tarayıcılar, tek bir olay bağımsız değişkeniyle bir işlev oluşturur. IE, bağımsız değişken almayan bir işlev oluşturur. Bu tür işlevlerde olay tanımlayıcısını kullanırsanız, bu, window.event'e atıfta bulunacaktır. Her iki durumda da, HTML işaretlemesinde tanımlanan olay işleyicileri, olay tanımlayıcısını kullanarak olay nesnesine başvurabilir.

Olay işleyici bağlamı

Bir özellik ayarlanarak bir olay işleyici kaydedildiğinde, belge öğesi için yeni bir yöntem tanımlamaya benziyor:

E.onclick = işlev () (/ * işleyici uygulaması * /);

Bu nedenle, olay işleyicilerin (aşağıda açıklanan IE'ye özgü bir istisna dışında) tanımlandıkları nesnelerin yöntemleri olarak çağrılması şaşırtıcı olmamalıdır. Diğer bir deyişle, bir olay işleyicisinin gövdesinde, this anahtar sözcüğü olayın hedefini ifade eder.

İşleyicilerde, this anahtar sözcüğü, addEventListener() yöntemiyle kayıtlı olsalar bile hedefe başvurur. Ancak, ne yazık ki, ataşeEvent () yöntemi için durum böyle değildir: ataşeEvent () yöntemiyle kayıtlı işleyiciler işlevler olarak adlandırılır ve onlarda this anahtar sözcüğü global (Window) nesnesine başvurur. Bu sorun şu şekilde çözülebilir:

/ * Belirtilen işlevi, belirtilen nesne üzerinde belirtilen türde bir olay işleyicisi olarak kaydeder. İşleyicinin her zaman hedef nesnenin bir yöntemi olarak çağrılmasını sağlar. * / function addEvent (target, type, handler) (if (target.addEventListener) target.addEventListener (type, handler, false); else target.attachEvent ("on" + type, function (event)) (// İşleyiciyi çağırın hedefin yöntemi olarak, // ve ona bir olay nesnesi iletin return handler.call (hedef, olay);));)

AttachEvent() yöntemine geçirilen sarmalayıcı işlevine yapılan başvuru, detachEvent() yöntemine geçirilebilmesi için hiçbir yerde depolanmadığından, bu şekilde kaydedilen olay işleyicilerinin silinemeyeceğini unutmayın.

İşleyicilerin dönüş değerleri

Bir nesne özelliği ayarlanarak veya bir HTML niteliği kullanılarak kaydedilen bir olay işleyicisi tarafından döndürülen değer dikkate alınmalıdır. Genellikle false döndürmek, tarayıcıya bu olay için varsayılanı yapmamasını söyler.

Örneğin, bir form gönderme düğmesinin onclick işleyicisi, tarayıcının formu göndermesini önlemek için false döndürebilir. (Bu, kullanıcı girişi istemci tarafı doğrulamasında başarısız olursa faydalı olabilir.) Benzer şekilde, bir giriş alanının onkeypress olay işleyicisi, geçersiz karakterler girildiğinde false döndürerek klavye girişini filtreleyebilir.

Ayrıca, Window nesnesinin onbeforeunload işleyicisi tarafından döndürülen değer de önemlidir. Bu olay, tarayıcı başka bir sayfaya gittiğinde oluşturulur. Bu işleyici bir dize döndürürse, kullanıcıdan sayfadan ayrılma isteğini onaylamasını isteyen kalıcı bir iletişim kutusunda görüntülenecektir.

Olay işleyicileri tarafından döndürülen değerlerin, yalnızca işleyiciler özellikler ayarlanarak kaydedilirse dikkate alındığını anlamak önemlidir. addEventListener () veya AttachEvent () ile kayıtlı işleyiciler, bunun yerine önlemeVarsayılan () yöntemini çağırmalı veya olay nesnesinin returnValue özelliğini ayarlamalıdır.

Etkinlikleri iptal etme

Özellik olarak kaydedilen bir olay işleyicisi tarafından döndürülen değer, bu olay meydana geldiğinde varsayılan tarayıcı eylemini geçersiz kılmak için kullanılabilir. addEventListener () yöntemini destekleyen tarayıcılarda, varsayılan eylemleri aşağıdakileri çağırarak da iptal edebilirsiniz. önlemeVarsayılan () olay nesnesi. Ancak, IE sürüm 8 ve altında, özelliği ayarlayarak aynı etki elde edilir. geri dönüş değeri olay nesnesi false olur.

Aşağıdaki snippet, bir etkinliği iptal etmek için üç yöntemin tümünü kullanan (kullanıcının bir bağlantıyı takip etmesini engelleyen) bir köprüye tıklamak için bir olay işleyicisini gösterir:

Window.onload = function () (// Tüm bağlantıları bul var a_href = document.getElementsByTagName ("a"); // Bir tıklama olay işleyicisi ekleyin (IE için değil)

DOM Events 3 modülünün mevcut projesi, Event nesnesinde adında bir özellik tanımlar. varsayılanÖnlendi... Henüz tüm tarayıcılar tarafından desteklenmemektedir, ancak özü, normal koşullar altında yanlış olması ve yalnızca önlemeDefault () yöntemi çağrıldığında doğru olmasıdır.

Bir etkinlikle ilişkili varsayılan eylemleri geri almak, etkinlik iptalinin yalnızca bir türüdür. Olayın yayılmasını durdurmak da mümkündür. addEventListener() yöntemini destekleyen tarayıcılarda, olay nesnesinin bir yöntemi vardır. durdurmaYayılım ()çağrısı olayın daha fazla yayılmasını kesintiye uğratır. Bu olay için diğer işleyiciler aynı hedefte kayıtlıysa, kalan işleyiciler hala çağrılır, ancak stopPropagation () yöntemi çağrıldıktan sonra diğer nesnelerdeki başka olay işleyicileri çağrılmaz.

IE 8 ve altında stopPropagation () yöntemi desteklenmez. Bunun yerine, IE'deki olay nesnesi şu özelliğe sahiptir: iptalBubble... Bu özelliğin true olarak ayarlanması olayın yayılmasını engeller.

DOM Events 3 belirtiminin mevcut taslağı, Event nesnesinde başka bir yöntemi tanımlar - bir yöntem stopImmediatePropagation ()... stopPropagation () yöntemi gibi, olayın başka nesnelere yayılmasını engeller. Ancak bunun ötesinde, aynı nesneye kayıtlı diğer olay işleyicilerinin çağrılmasını da engeller.