internet pencereler Android

Pop-up olaylara giriş. JavaScript - Kabarcıklı Olaylar Çoğu Nasıl Çalışır?

Merhaba! Bu derste, köpürme ve olay durdurma gibi önemli bir kavramdan bahsetmek istiyorum. Kabarcıklanma, bir alt öğeye tıkladığınızda olayın üst öğeye yayıldığı bir olgudur.

Büyük iç içe listeleri veya tabloları işlerken, her öğeye bir olay işleyici atamamak için çok kullanışlıdır, üst öğe başına bir işleyici atayabilirsiniz ve olay zaten üst öğedeki tüm iç içe öğelere yayılır. Bir örnek alalım.

Bu işleyici için

ekli etikete tıklarsanız çalışacaktır veya :

EM'ye tıklayın, DIV işleyicisi tetiklenecek

Gördüğünüz gibi iç içe em öğesine tıkladığınızda div üzerindeki işleyici tetikleniyor. Neden oluyor? Öğrenmek için okumaya devam edin.

yüzey kaplama

Yani yüzey kaplamanın temel prensibi:

Herhangi bir olay meydana geldiğinde, farenin öğenin üzerine gelip gelmemesi önemli değildir, olay önce ana öğede tetiklenir ve ardından zincir boyunca tüm iç içe öğelere yayılır.

Örneğin, her biri bir olay işleyiciye sahip 3 adet iç içe FORM> DIV> P öğesi olduğunu varsayalım:

BİÇİM
BÖL

Kabarcıklanma, iç elemana bir tıklamanın yapılmasını sağlar

İlk önce tıklama işleyicisini (tabii ki varsa) arayacaktır.

Bu sürece köpürme denir, çünkü olaylar, tıpkı bir hava kabarcığının suda yüzdüğü gibi, iç elementten yukarıya doğru ebeveynleri aracılığıyla “yüzer” gibi görünür, bu nedenle köpürmenin tanımını da bulabilirsiniz, şey, bu sadece İngilizce köpürme kelimesindendir. .

Event.target hedef öğesine erişme

Şu veya bu olayı hangi element üzerinde yakaladığımızı bulmak için event.target metodu vardır. (olay nesnesi hakkında bilgi edinin).

  • etkinlik.hedef- bu aslında olayın gerçekleştiği orijinal öğedir.
  • Bugün nasılsın- bu her zaman yukarı kayan geçerli öğedir ve işleyici şu anda üzerinde yürütülüyor.

Örneğin, yalnızca bir form.onclick işleyicisi kuruluysa, form içindeki tüm tıklamaları "yakalar". Aynı zamanda, içeride bir tıklamanın olduğu her yerde, yine de öğeye açılır.

, işleyicinin tetikleneceği.

Burada:

  • Bugün nasılsın(= event.currentTarget), işleyici üzerinde tetiklendiğinden, her zaman formun kendisi olacaktır.
  • etkinlik.hedef form içindeki belirli bir öğeye, tıklamanın gerçekleştiği en yuvalanmış öğeye bir bağlantı içerecektir.

Prensipte, form tıklandığında ve formda başka öğe yoksa bu event.target ile aynı olabilir.

Yükselişi durdurmak

Tipik olarak, olay köpürmesi doğrudan kök pencere nesnesine gider.

Ancak bazı ara elementlerde yükselişi durdurmak mümkündür.

Köpürmeyi durdurmak için event.stopPropagation () yöntemini çağırın.

Bir örnek ele alalım, butona tıklandığında body.onclick işleyicisi çalışmayacaktır:

Bir öğenin aynı olay için birkaç işleyicisi varsa, köpürme dursa bile hepsi yürütülür.

Bu nedenle, stopPropagation olayın daha fazla yayılmasını engeller, ancak tüm işleyiciler öğe üzerinde çalışır, ancak sonraki öğe üzerinde daha fazla çalışmaz.

Geçerli öğe üzerinde işlemeyi durdurmak için tarayıcılar event.stopImmediatePropagation () yöntemini destekler. Bu yöntem yalnızca köpürmeyi önlemekle kalmaz, aynı zamanda geçerli öğe üzerinde olay işlemeyi de durdurur.

daldırma

Standartta, olayların "köpürmesine" ek olarak, "daldırma" da vardır.

Dalış, yüzeye çıkmanın aksine daha az talep görüyor, ancak yine de bunu bilmek faydalı olacaktır.

Yani olayın geçişinin 3 aşaması var:

  1. Olay yukarıdan aşağıya doğru gider. Bu aşamaya "müdahale aşaması" denir.
  2. Etkinlik belirli bir öğeye ulaştı. Bu "hedef aşaması".
  3. Sonuçta, olay ortaya çıkmaya başlar. Bu "yüzey aşaması" dır.

Standart bunu şu şekilde göstermektedir:

Böylece, TD'ye tıklandığında, olay, yol boyunca işleyicileri kullanarak, önce öğeye ("dalma") ve sonra yukarı ("açma"), üst öğe zinciri boyunca ilerleyecektir.

Yukarıda sadece çıkış hakkında yazdım çünkü aslında diğer aşamalar kullanılmaz ve bizim için fark edilmez.

İşleyiciler, durdurma aşaması hakkında hiçbir şey bilmiyorlar, ancak yükselişten itibaren çalışmaya başlıyorlar.

Ve durdurma aşamasında bir olayı yakalamak için şunları kullanmanız yeterlidir:

  • Argüman doğrudur, o zaman olay yolda durdurulur.
  • Argüman yanlışsa, olay köpürmeye yakalanır.

Örnekleri

üzerindeki örnekte ,

,

İşleyiciler öncekiyle aynı, ancak bu sefer - daldırma aşamasında. Pekala, müdahaleyi çalışırken görmek için içindeki öğeye tıklayın.

İşleyiciler "yukarıdan aşağıya" sırayla tetiklenir: FORM → DIV → P.

Buradaki JS kodu şöyle:

Var elements = document.querySelectorAll ("form, div, p"); // (var i = 0; i) için durdurma aşamasında her öğe için bir işleyiciyi kapat< elems.length; i++) { elems[i].addEventListener("click", highlightThis, true); }


Her iki aşama için de işleyici atamanız için kimse sizi rahatsız etmez, bunun gibi:

Var elements = document.querySelectorAll ("form, div, p"); for (var i = 0; i< elems.length; i++) { elems[i].addEventListener("click", highlightThis, true); elems[i].addEventListener("click", highlightThis, false); }

İç elemana tıklayın

Etkinlik sırasını görmek için:
FORM -> DIV -> P -> P -> DIV -> FORM olmalıdır. Unutulmamalıdır ki, eleman

Her iki aşamaya da katılacak.

sonuçlar

  • Bir olay meydana geldiğinde - olayın meydana geldiği öğe event.target olarak işaretlenir.
  • Olay ilk önce belge kökünden event.target'e doğru ilerler ve yol boyunca addEventListener (…., True) aracılığıyla sağlanan işleyicileri çağırır.
  • Olay, addEventListener (…., False) aracılığıyla sağlanan işleyicileri çağırma yolu boyunca event.target'ten belgenin başına kadar hareket eder.

Her işleyici, olayın özelliklerine erişebilir:

  • event.target, olayın gerçekten gerçekleştiği en derin öğedir.
  • event.currentTarget (= bu) - kendi kendine işleyicinin o anda tetiklediği öğe (olayın "ulaştığı").
  • event.eventPhase - olay işleyicinin hangi aşamada tetiklendiği (daldırma = 1, kabarcıklanma = 3).

Bubbling event.stopPropagation () yöntemi çağrılarak durdurulabilir, ancak olaya en beklenmedik amaçlar için ihtiyaç duyabileceğiniz için bunu yapmanız önerilmez.

Bir olaya müdahale

Dilin önemli özelliklerinden biri olay müdahalesidir. Örneğin, biri bir düğmeyi tıklarsa, o düğmeye karşılık gelen onClick olay işleyicisi çağrılır. Olay işleme yardımıyla, pencerenize, belgenize veya katmanınıza karşılık gelen nesnenin, olay işleyicisi bu amaç için belirtilen düğmenin nesnesi tarafından çağrılmadan önce bile olayı yakalayıp işlemesini sağlayabilirsiniz. Benzer şekilde, pencerenizdeki, belgenizdeki veya katmanınızdaki bir nesne, normal hedefine ulaşmadan önce bir olay sinyalini işleyebilir.
Bunun ne için yararlı olabileceğini görmek için aşağıdaki örneğe bakalım:






Bu bağlantıya tıklayın

Gördüğünüz gibi etikette olay işleyicileri belirtmiyoruz ... Onun yerine yazıyoruz

window.captureEvents (Event.CLICK);

olayı engellemek için Tıklamak pencere nesnesi. Genellikle pencere nesnesi olayla çalışmaz Tıklamak... Ancak, ele geçirdikten sonra onu pencere nesnesine yönlendiririz. Şuna dikkat edin: Etkinlik.TIKLAYIN parça TIKLAYIN büyük harflerle yazılmalıdır. Birkaç olayı engellemek istiyorsanız, onları | sembolleri ile birbirinden ayırmalısınız. Örneğin:

window.captureEvents (Event.CLICK | Event.MOVE);

Ayrıca fonksiyon içerisinde üstesinden gelmek () tarafımızdan olay işleyici rolüne atanmışsa, talimatı kullanırız true döndür;... Bunun gerçekten anlamı, işlev tamamlandıktan sonra tarayıcının bağlantıyı kendisi işlemesi gerektiğidir. üstesinden gelmek ()... onun yerine yazarsan yanlış döndür; o zaman her şey orada bitecek.

Eğer şimdi etiketteyse Olay işleyicisini tanımlayacaksınız tıklamada, bu olay gerçekleştiğinde bu programın çağrılmayacağını anlayacaksınız. Bu şaşırtıcı değildir, çünkü pencere nesnesi olay sinyalini bağlantı nesnesine ulaşmadan önce yakalar. Bir fonksiyon tanımlarsanız üstesinden gelmek () nasıl

fonksiyon tutamacı (e) (
alert ("Pencere nesnesi bu olayı yakaladı!");
window.routeEvent (e);
true döndür;
}

daha sonra bilgisayar, bu nesne için başka olay işleyicilerinin tanımlanıp tanımlanmadığını kontrol edecektir. e değişkeni, olay işleme işlevine argüman olarak iletilen Event nesnemizdir.

Ayrıca, bir nesneye doğrudan bir olay sinyali gönderebilirsiniz. Bunu yapmak için yöntemi kullanabilirsiniz. handleEvent ()... Şuna benziyor:



Bu bağlantıya tıklayın

onClick = "alert ("İkinci bağlantı için olay işleyicisi! ");"> İkinci bağlantı

Click olaylarıyla ilgili tüm sinyaller, ikinci bağlantı aracılığıyla işlenmek üzere gönderilir - hiçbir bağlantıya tıklamamış olsanız bile!

Aşağıdaki komut dosyası, komut dosyanızın tuş vuruşu sinyallerine nasıl yanıt verebileceğini gösterir. Bir tuşa tıklayın ve bu betiğin nasıl çalıştığını görün.


Bir HTML sayfası oluşturalım ve yukarıdaki HTML kodunu içine yapıştıralım. Kapanış body etiketinden önce JavaScript ile yazılmış scripti ekleyelim. Bundan sonra, yeni oluşturulan sayfayı bir web tarayıcısında açın, F12 tuşuna basın ve konsola gidin. Şimdi güçlü elemente ait alana sol tıklayıp olayın nasıl balonlaşacağını görelim.

Bir olayın köpürmesi nasıl durdurulur

Bir olayın (kabarcık) köpürmesi kesilebilir. Bu durumda, bu olay üst (ebeveyn) öğeler için tetiklenmeyecektir. Bubbling olayını (kabarcık) durdurmak için tasarlanan yönteme stopPropagation() adı verilir.

Örneğin, yukarıdaki örneğimizi olay gövdenin üzerinde kabarmayacak şekilde değiştirelim: