{"id":32053,"date":"2025-10-17T05:31:25","date_gmt":"2025-10-17T02:31:25","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/javascriptte-olay-kabarciklanmasi-ve-yakalama-kapsamli-rehber\/"},"modified":"2025-10-17T05:31:25","modified_gmt":"2025-10-17T02:31:25","slug":"javascriptte-olay-kabarciklanmasi-ve-yakalama-kapsamli-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/javascriptte-olay-kabarciklanmasi-ve-yakalama-kapsamli-rehber\/","title":{"rendered":"JavaScript&#8217;te Olay Kabarc\u0131klanmas\u0131 ve Yakalama: Kapsaml\u0131 Rehber"},"content":{"rendered":"<p><body><\/p>\n<p>\nJavaScript&#8217;teki olay kabarc\u0131klanmas\u0131 (bubbling) ve yakalama (capturing) mekanizmalar\u0131, web geli\u015ftiricilerin DOM olaylar\u0131n\u0131 nas\u0131l y\u00f6netti\u011fini k\u00f6kten etkiler. Bu teknik makale, bu temel kavramlar\u0131 ba\u015ftan sona a\u00e7\u0131kl\u0131yor, ger\u00e7ek d\u00fcnya \u00f6rnekleri ve detayl\u0131 kodlarla \u00f6\u011frenmenizi sa\u011fl\u0131yor. Etkin olay y\u00f6netimi ve kullan\u0131c\u0131 deneyimi i\u00e7in kritik bilgiler burada! Modern web uygulamalar\u0131nda kar\u015f\u0131la\u015f\u0131lan performans sorunlar\u0131n\u0131 a\u015fmak ve etkile\u015fimli aray\u00fczler olu\u015fturmak i\u00e7in bu mekanizmalar\u0131n derinlemesine anla\u015f\u0131lmas\u0131 vazge\u00e7ilmezdir. Peki, bu kavramlar tam olarak ne anlama geliyor ve projelerinizde nas\u0131l etkin bir \u015fekilde kullanabilirsiniz?\n<\/p>\n<p>\nWeb sayfalar\u0131, kullan\u0131c\u0131 etkile\u015fimleriyle canlanan dinamik yap\u0131lar sunar. Bir d\u00fc\u011fmeye t\u0131klamak, bir metin alan\u0131na yaz\u0131 yazmak, bir fareyi bir elementin \u00fczerine getirmek veya bir sayfay\u0131 kayd\u0131rmak gibi her eylem, JavaScript&#8217;te bir &#8220;olay&#8221; (event) olarak ele al\u0131n\u0131r. Bu olaylar, taray\u0131c\u0131 taraf\u0131ndan alg\u0131lan\u0131r ve belirli bir s\u0131rayla i\u015flenir. Ancak karma\u015f\u0131k web aray\u00fczlerinde, i\u00e7 i\u00e7e ge\u00e7mi\u015f bir\u00e7ok HTML elementi bulunur ve kullan\u0131c\u0131 bir elemente t\u0131klad\u0131\u011f\u0131nda asl\u0131nda birden fazla elementin de bu olaya maruz kalma ihtimali vard\u0131r. \u0130\u015fte tam da bu noktada, JavaScript&#8217;in olay kabarc\u0131klanmas\u0131 ve yakalama mekanizmalar\u0131 devreye girer. Bu mekanizmalar, olay\u0131n hangi s\u0131rayla ve hangi elementler \u00fczerinde tetiklenece\u011fini belirleyerek olay y\u00f6netimini standardize eder.\n<\/p>\n<p>\nBu kavramlar, sadece taray\u0131c\u0131n\u0131n olaylar\u0131 nas\u0131l i\u015fledi\u011fini anlamakla kalmaz, ayn\u0131 zamanda daha performansl\u0131, esnek ve s\u00fcrd\u00fcr\u00fclebilir web uygulamalar\u0131 geli\u015ftirmenize de olanak tan\u0131r. \u00d6zellikle dinamik olarak y\u00fcklenen i\u00e7eriklerle \u00e7al\u0131\u015f\u0131rken veya \u00e7ok say\u0131da benzer etkile\u015fimli \u00f6\u011feye sahip bir liste olu\u015ftururken, bu mekanizmalar\u0131n do\u011fru kullan\u0131lmas\u0131 b\u00fcy\u00fck fark yaratabilir. \u00d6rne\u011fin, bir liste eleman\u0131n\u0131n i\u00e7ine yerle\u015ftirilmi\u015f bir d\u00fc\u011fmeye t\u0131kland\u0131\u011f\u0131nda, hem d\u00fc\u011fmenin hem de liste eleman\u0131n\u0131n bir olay\u0131 tetiklemesi beklenebilir. Bu durumda hangi olay\u0131n \u00f6nce tetiklenece\u011fi veya hangi olay\u0131n di\u011ferini etkileyece\u011fi gibi sorular, kabarc\u0131klanma ve yakalama ile yan\u0131t bulur.\n<\/p>\n<p>\nOlay d\u00f6ng\u00fcs\u00fc veya olay ak\u0131\u015f\u0131 (Event Flow), bir olay\u0131n DOM a\u011fac\u0131 boyunca yay\u0131lma s\u00fcrecini ifade eder. Bu s\u00fcre\u00e7 \u00fc\u00e7 a\u015famadan olu\u015fur:<\/p>\n<ol>\n<li><b>Yakalama A\u015famas\u0131 (Capturing Phase):<\/b> Olay, DOM a\u011fac\u0131n\u0131n en d\u0131\u015ftaki elementinden (genellikle <code>window<\/code> veya <code>document<\/code>) ba\u015flayarak, olay\u0131n ger\u00e7ekte ger\u00e7ekle\u015fti\u011fi hedef elemente do\u011fru a\u015fa\u011f\u0131ya do\u011fru yay\u0131l\u0131r. Bu a\u015famada, olay\u0131n hedef elemente ula\u015fmadan \u00f6nce \u00fcst elementlerde yakalanma f\u0131rsat\u0131 vard\u0131r.<\/li>\n<li><b>Hedef A\u015famas\u0131 (Target Phase):<\/b> Olay\u0131n ger\u00e7ekte ger\u00e7ekle\u015fti\u011fi elementtir. Bu element, olay\u0131 do\u011frudan al\u0131r.<\/li>\n<li><b>Kabarc\u0131klanma A\u015famas\u0131 (Bubbling Phase):<\/b> Olay, hedef elementten ba\u015flayarak DOM a\u011fac\u0131n\u0131n en d\u0131\u015ftaki elementine do\u011fru yukar\u0131ya do\u011fru yay\u0131l\u0131r. Bu a\u015famada, olay\u0131n hedef elementten sonra \u00fcst elementlerde yakalanma f\u0131rsat\u0131 vard\u0131r.<\/li>\n<\/ol>\n<p>\nBu \u00fc\u00e7 a\u015fama, bir olay\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc olu\u015fturur ve geli\u015ftiricilere olay\u0131n herhangi bir noktas\u0131nda m\u00fcdahale etme olana\u011f\u0131 tan\u0131r. Bu mekanizmalar\u0131 anlamak, hem taray\u0131c\u0131n\u0131n nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131na dair derinlemesine bir bak\u0131\u015f a\u00e7\u0131s\u0131 sa\u011flar hem de olay dinleyicilerini daha verimli bir \u015fekilde y\u00f6netme becerisi kazand\u0131r\u0131r. Bu sayede, gereksiz olay dinleyicilerinin olu\u015fturulmas\u0131n\u0131n \u00f6n\u00fcne ge\u00e7ilerek bellek s\u0131z\u0131nt\u0131lar\u0131 engellenebilir ve uygulaman\u0131n genel performans\u0131 art\u0131r\u0131labilir. K\u0131sacas\u0131, etkin olay y\u00f6netimi, modern web geli\u015ftirmenin temel ta\u015flar\u0131ndan biridir ve kabarc\u0131klanma ile yakalama kavramlar\u0131 bu yap\u0131n\u0131n ana unsurlar\u0131d\u0131r.\n<\/p>\n<h2>DOM Olay Ak\u0131\u015f\u0131: Kabarc\u0131klanma ve Yakalama Mekanizmalar\u0131n\u0131n Temelleri Nelerdir?<\/h2>\n<p>\nWeb sayfalar\u0131nda bir olay meydana geldi\u011finde, bu olay basit\u00e7e tek bir elementle s\u0131n\u0131rl\u0131 kalmaz. DOM (Document Object Model) hiyerar\u015fisi nedeniyle, i\u00e7 i\u00e7e ge\u00e7mi\u015f elementler aras\u0131nda bir etkile\u015fim zinciri olu\u015fur. Bu zincir, olay\u0131n DOM a\u011fac\u0131nda nas\u0131l yay\u0131ld\u0131\u011f\u0131n\u0131 belirleyen iki temel mekanizma olan olay yakalama (capturing) ve olay kabarc\u0131klanmas\u0131 (bubbling) ile a\u00e7\u0131klan\u0131r. Bu iki a\u015fama, olay ak\u0131\u015f\u0131n\u0131n ayr\u0131lmaz bir par\u00e7as\u0131d\u0131r ve bir olay\u0131n tetiklendi\u011fi andan itibaren taray\u0131c\u0131 taraf\u0131ndan ad\u0131m ad\u0131m i\u015flenir.\n<\/p>\n<h3>Olay Yakalama (Event Capturing) Nedir ve Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/h3>\n<p>\nOlay yakalama, bir olay\u0131n DOM a\u011fac\u0131n\u0131n en k\u00f6k elementinden (<code>document<\/code> veya <code>window<\/code>) ba\u015flayarak, olay\u0131n tetiklendi\u011fi hedef elemente do\u011fru a\u015fa\u011f\u0131ya do\u011fru yay\u0131lma s\u00fcrecidir. Bu a\u015fama, olay\u0131n hedef elemente ula\u015fmadan \u00f6nce ebeveyn elementler taraf\u0131ndan &#8220;yakalanmas\u0131na&#8221; olanak tan\u0131r. Yani, bir elemana t\u0131klama olay\u0131 meydana geldi\u011finde, taray\u0131c\u0131 ilk olarak <code>window<\/code>&#8216;dan ba\u015flar, ard\u0131ndan <code>document<\/code>, <code><html><\/code>, <code><body><\/code> ve di\u011fer ebeveyn elementler boyunca a\u015fa\u011f\u0131ya do\u011fru ilerler, ta ki as\u0131l hedef elemente ula\u015fana kadar.\n<\/p>\n<p>\nBu a\u015famada bir olay\u0131 dinlemek i\u00e7in <code>addEventListener()<\/code> metodunun \u00fc\u00e7\u00fcnc\u00fc parametresi olarak <code>true<\/code> de\u011ferini kullan\u0131r\u0131z. Varsay\u0131lan olarak bu de\u011fer <code>false<\/code>&#8216;tur ve kabarc\u0131klanma a\u015famas\u0131nda olaylar\u0131 dinler. Ancak <code>true<\/code> olarak ayarland\u0131\u011f\u0131nda, olay yakalama a\u015famas\u0131nda devreye girer. \u00d6rne\u011fin, bir <code>div<\/code> elementinin i\u00e7indeki bir <code>p<\/code> elementine t\u0131kland\u0131\u011f\u0131nda, yakalama a\u015famas\u0131nda ilk olarak <code>div<\/code> elementi olay\u0131 yakalayabilir. Bu mekanizma, \u00f6zellikle belirli bir alandaki t\u00fcm \u00e7ocuk elementlerdeki olaylar\u0131 y\u00f6netmek istedi\u011finiz durumlarda faydal\u0131d\u0131r, \u00f6rne\u011fin bir formdaki t\u00fcm input elementlerinin giri\u015fini izlemek gibi.\n<\/p>\n<pre><code>\n<div id=\"parent\" style=\"padding: 20px; border: 1px solid blue;\">\n    <p id=\"child\" style=\"padding: 10px; border: 1px solid red;\">\n        \u00c7ocuk Paragraf\n    <\/p>\n<\/div>\n\n<script>\n    const parent = document.getElementById('parent');\n    const child = document.getElementById('child');\n\n    parent.addEventListener('click', function() {\n        console.log('Parent div (Capturing phase)');\n    }, true); \/\/ Yakalama a\u015famas\u0131n\u0131 aktif et\n\n    child.addEventListener('click', function() {\n        console.log('Child p');\n    }); \/\/ Varsay\u0131lan olarak kabarc\u0131klanma a\u015famas\u0131\n\n    \/\/ E\u011fer child'a t\u0131kland\u0131\u011f\u0131nda, konsolda \"Parent div (Capturing phase)\" \u00f6nce g\u00f6r\u00fcn\u00fcr.\n<\/script>\n<\/pre>\n<p><\/code><\/p>\n<h3>Olay Kabarc\u0131klanmas\u0131 (Event Bubbling) Nedir ve Nas\u0131l \u0130\u015fler?<\/h3>\n<p>\nOlay kabarc\u0131klanmas\u0131, bir olay\u0131n hedef elementte tetiklendikten sonra, DOM a\u011fac\u0131nda yukar\u0131 do\u011fru ebeveyn elementlerine do\u011fru yay\u0131lma s\u00fcrecidir. Bu, varsay\u0131lan olay ak\u0131\u015f\u0131 davran\u0131\u015f\u0131d\u0131r ve JavaScript'te olay dinleyicilerinin \u00e7o\u011fu bu a\u015famada \u00e7al\u0131\u015f\u0131r. Yani, bir elemente t\u0131kland\u0131\u011f\u0131nda, \u00f6nce o elementin kendi olay dinleyicisi \u00e7al\u0131\u015f\u0131r, ard\u0131ndan olay\u0131n bir balon gibi yukar\u0131 do\u011fru \"kabarc\u0131klanarak\" ebeveyn elementlerine ula\u015fmas\u0131yla s\u0131ras\u0131yla ebeveyn elementlerin olay dinleyicileri \u00e7al\u0131\u015f\u0131r. Bu s\u00fcre\u00e7, <code>document<\/code> veya <code>window<\/code> objesine ula\u015fana kadar devam eder.\n<\/p>\n<p>\nBu mekanizma, \u00f6zellikle \"olay delegasyonu\" (event delegation) gibi performans optimizasyon teknikleri i\u00e7in temel olu\u015fturur. \u00d6rne\u011fin, \u00e7ok say\u0131da liste \u00f6\u011fesinden olu\u015fan bir listeniz varsa, her bir \u00f6\u011fe i\u00e7in ayr\u0131 bir olay dinleyicisi eklemek yerine, listenin t\u00fcm\u00fcn\u00fc saran \u00fcst elemente tek bir dinleyici ekleyebilir ve kabarc\u0131klanma sayesinde t\u00fcm alt \u00f6\u011felerdeki t\u0131klama olaylar\u0131n\u0131 bu \u00fcst element \u00fczerinden y\u00f6netebilirsiniz. Bu, bellek kullan\u0131m\u0131n\u0131 azalt\u0131r ve dinamik olarak eklenen \u00f6\u011feler i\u00e7in ek kod yazmaya gerek kalmadan olay y\u00f6netimini basitle\u015ftirir.\n<\/p>\n<pre><code>\n<div id=\"container\" style=\"padding: 20px; border: 1px solid green;\">\n    <button id=\"myButton\" style=\"padding: 10px; border: 1px solid black;\">\n        Bana T\u0131kla\n    <\/button>\n<\/div>\n\n<script>\n    const container = document.getElementById('container');\n    const button = document.getElementById('myButton');\n\n    container.addEventListener('click', function() {\n        console.log('Container div t\u0131kland\u0131 (Bubbling phase)');\n    });\n\n    button.addEventListener('click', function() {\n        console.log('Buton t\u0131kland\u0131');\n    });\n\n    \/\/ Butona t\u0131kland\u0131\u011f\u0131nda, konsolda \"Buton t\u0131kland\u0131\" ard\u0131ndan \"Container div t\u0131kland\u0131 (Bubbling phase)\" g\u00f6r\u00fcn\u00fcr.\n<\/script>\n<\/pre>\n<p><\/code><\/p>\n<p>\nG\u00f6r\u00fcld\u00fc\u011f\u00fc gibi, kabarc\u0131klanma ve yakalama, ayn\u0131 olay\u0131n farkl\u0131 a\u015famalarda farkl\u0131 elementler taraf\u0131ndan nas\u0131l alg\u0131land\u0131\u011f\u0131n\u0131 ve i\u015flendi\u011fini tan\u0131mlar. Yakalama a\u015famas\u0131 d\u0131\u015ftan i\u00e7e do\u011fru, kabarc\u0131klanma a\u015famas\u0131 ise i\u00e7ten d\u0131\u015fa do\u011fru ilerler. Bu iki mekanizman\u0131n birle\u015fimi, geli\u015ftiricilere olay ak\u0131\u015f\u0131 \u00fczerinde tam kontrol sa\u011flayarak, web uygulamalar\u0131nda daha ak\u0131ll\u0131 ve reaktif davran\u0131\u015flar olu\u015fturma imkan\u0131 tan\u0131r. Olay y\u00f6netimi stratejinizi belirlerken, hangi a\u015famada m\u00fcdahale etmeniz gerekti\u011fini bilmek, uygulaman\u0131z\u0131n performans\u0131n\u0131 ve kullan\u0131c\u0131 deneyimini do\u011frudan etkileyecektir.\n<\/p>\n<h2>Pratik Uygulamalar: Kabarc\u0131klanma ve Yakalamay\u0131 Kodda Nas\u0131l Kontrol Ederiz?<\/h2>\n<p>\nOlay kabarc\u0131klanmas\u0131 ve yakalama mekanizmalar\u0131n\u0131 teorik olarak anlamak kadar, bu bilgileri pratik JavaScript koduna d\u00f6n\u00fc\u015ft\u00fcrmek de b\u00fcy\u00fck \u00f6nem ta\u015f\u0131r. Bu b\u00f6l\u00fcmde, <code>addEventListener()<\/code> metodu arac\u0131l\u0131\u011f\u0131yla bu mekanizmalar\u0131 nas\u0131l etkinle\u015ftirece\u011fimizi, olay yay\u0131l\u0131m\u0131n\u0131 nas\u0131l durduraca\u011f\u0131m\u0131z\u0131 ve taray\u0131c\u0131n\u0131n varsay\u0131lan davran\u0131\u015flar\u0131n\u0131 nas\u0131l engelleyece\u011fimizi detayl\u0131 kod \u00f6rnekleriyle inceleyece\u011fiz. Bu bilgiler, web uygulamalar\u0131n\u0131zda daha hassas ve beklendi\u011fi gibi \u00e7al\u0131\u015fan olay y\u00f6netimi olu\u015fturman\u0131za yard\u0131mc\u0131 olacakt\u0131r.\n<\/p>\n<h3><code>addEventListener()<\/code> Kullan\u0131m\u0131 ve \u00dc\u00e7\u00fcnc\u00fc Parametre Anlam\u0131<\/h3>\n<p>\nJavaScript'te bir HTML elementine olay dinleyici eklemenin standart yolu <code>addEventListener()<\/code> metodudur. Bu metodun temel kullan\u0131m\u0131 \u015f\u00f6yledir: <code>element.addEventListener(olayTipi, fonksiyon, se\u00e7enekler)<\/code>. Burada <code>olayTipi<\/code> (\u00f6rne\u011fin 'click', 'mouseover'), <code>fonksiyon<\/code> ise olay tetiklendi\u011finde \u00e7al\u0131\u015facak geri arama fonksiyonudur. \u00dc\u00e7\u00fcnc\u00fc parametre olan <code>se\u00e7enekler<\/code> ise bir nesne veya do\u011frudan bir boolean de\u011fer olabilir ve olay ak\u0131\u015f\u0131n\u0131n hangi a\u015famas\u0131nda olay\u0131 dinleyece\u011fimizi belirler.\n<\/p>\n<ul>\n<li>E\u011fer \u00fc\u00e7\u00fcnc\u00fc parametre <b><code>true<\/code><\/b> olarak ayarlan\u0131rsa, olay dinleyici <b>yakalama a\u015famas\u0131nda (capturing phase)<\/b> \u00e7al\u0131\u015f\u0131r. Yani olay, DOM a\u011fac\u0131n\u0131n k\u00f6k\u00fcnden hedef elemente do\u011fru inerken yakalan\u0131r.<\/li>\n<li>E\u011fer \u00fc\u00e7\u00fcnc\u00fc parametre <b><code>false<\/code><\/b> olarak ayarlan\u0131rsa (ki bu varsay\u0131lan de\u011ferdir ve genellikle \u00e7o\u011fu olay i\u00e7in tercih edilir), olay dinleyici <b>kabarc\u0131klanma a\u015famas\u0131nda (bubbling phase)<\/b> \u00e7al\u0131\u015f\u0131r. Yani olay, hedef elementten k\u00f6ke do\u011fru y\u00fckselirken yakalan\u0131r.<\/li>\n<li>E\u011fer bu parametre atlan\u0131rsa, varsay\u0131lan olarak <code>false<\/code> kabul edilir ve kabarc\u0131klanma a\u015famas\u0131nda dinleme yap\u0131l\u0131r.<\/li>\n<\/ul>\n<p>\nA\u015fa\u011f\u0131daki \u00f6rnekte, i\u00e7 i\u00e7e ge\u00e7mi\u015f iki <code>div<\/code> elementi i\u00e7in hem yakalama hem de kabarc\u0131klanma a\u015famas\u0131nda olay dinleyicileri tan\u0131mlayarak fark\u0131 g\u00f6zlemleyebiliriz:\n<\/p>\n<pre><code>\n<div id=\"outer\" style=\"padding: 30px; border: 2px solid blue; background-color: lightblue;\">\n    D\u0131\u015f Div\n    <div id=\"inner\" style=\"padding: 20px; border: 2px solid red; background-color: lightcoral; margin-top: 10px;\">\n        \u0130\u00e7 Div\n    <\/div>\n<\/div<\n\n<script>\n    const outer = document.getElementById('outer');\n    const inner = document.getElementById('inner');\n\n    \/\/ D\u0131\u015f div i\u00e7in yakalama a\u015famas\u0131\n    outer.addEventListener('click', function() {\n        console.log('1. Outer Div - Capturing');\n    }, true);\n\n    \/\/ \u0130\u00e7 div i\u00e7in yakalama a\u015famas\u0131\n    inner.addEventListener('click', function() {\n        console.log('2. Inner Div - Capturing');\n    }, true);\n\n    \/\/ \u0130\u00e7 div i\u00e7in kabarc\u0131klanma a\u015famas\u0131\n    inner.addEventListener('click', function() {\n        console.log('3. Inner Div - Bubbling');\n    }, false); \/\/ Varsay\u0131lan de\u011fer\n\n    \/\/ D\u0131\u015f div i\u00e7in kabarc\u0131klanma a\u015famas\u0131\n    outer.addEventListener('click', function() {\n        console.log('4. Outer Div - Bubbling');\n    }, false); \/\/ Varsay\u0131lan de\u011fer\n\n    \/\/ \u0130\u00e7 dive t\u0131kland\u0131\u011f\u0131nda \u00e7\u0131kt\u0131 s\u0131ras\u0131:\n    \/\/ 1. Outer Div - Capturing\n    \/\/ 2. Inner Div - Capturing\n    \/\/ 3. Inner Div - Bubbling\n    \/\/ 4. Outer Div - Bubbling\n<\/script>\n<\/pre>\n<p><\/code><\/p>\n<p>\nBu \u00f6rnek, olay\u0131n yakalama a\u015famas\u0131nda d\u0131\u015ftan i\u00e7e do\u011fru (1, 2) ve kabarc\u0131klanma a\u015famas\u0131nda i\u00e7ten d\u0131\u015fa do\u011fru (3, 4) nas\u0131l ilerledi\u011fini a\u00e7\u0131k\u00e7a g\u00f6stermektedir.\n<\/p>\n<h3>Olay Yay\u0131l\u0131m\u0131n\u0131 Durdurma: <code>event.stopPropagation()<\/code> Ne \u0130\u015fe Yarar?<\/h3>\n<p>\nBazen, bir olay\u0131n belirli bir elementte i\u015flendikten sonra daha fazla yay\u0131lmas\u0131n\u0131 (hem yakalama hem de kabarc\u0131klanma a\u015famalar\u0131nda) istemeyebilirsiniz. \u0130\u015fte bu noktada <code>event.stopPropagation()<\/code> metodu devreye girer. Bu metod, olay\u0131n DOM a\u011fac\u0131 boyunca daha fazla yay\u0131lmas\u0131n\u0131 engeller. Bu, \u00f6zellikle i\u00e7 i\u00e7e elementlerin farkl\u0131 i\u015flevleri oldu\u011funda ve bir alt element \u00fczerindeki etkile\u015fimin \u00fcst elementleri etkilemesini istemedi\u011finizde kullan\u0131\u015fl\u0131d\u0131r.\n<\/p>\n<div class=\"uzman-ipucu\" style=\"background-color: #e0f2f7; border-left: 5px solid #2196f3; padding: 15px; margin: 15px 0;\">\n  <b>Uzman \u0130pucu:<\/b> <code>stopPropagation()<\/code> kullan\u0131rken dikkatli olun. A\u015f\u0131r\u0131 kullan\u0131m\u0131, beklenmedik yan etkilere yol a\u00e7abilir ve olay delegasyonu gibi teknikleri bozabilir. Sadece kesinlikle gerekli oldu\u011funda ve yan etkilerini tam olarak anlad\u0131\u011f\u0131n\u0131zda kullan\u0131n.\n<\/div>\n<pre><code>\n<div id=\"container\" style=\"padding: 30px; border: 2px solid purple; background-color: lavender;\">\n    Kapsay\u0131c\u0131 Div\n    <button id=\"myButton2\" style=\"padding: 10px; border: 2px solid darkgreen; background-color: lightgreen; margin-top: 10px;\">\n        T\u0131kla ve Durdur\n    <\/button>\n<\/div>\n\n<script>\n    const container = document.getElementById('container');\n    const button = document.getElementById('myButton2');\n\n    container.addEventListener('click', function() {\n        console.log('Kapsay\u0131c\u0131 Div T\u0131kland\u0131!');\n    });\n\n    button.addEventListener('click', function(event) {\n        event.stopPropagation(); \/\/ Olay\u0131n daha fazla yay\u0131lmas\u0131n\u0131 durdur\n        console.log('Buton T\u0131kland\u0131! Olay yay\u0131l\u0131m\u0131 durduruldu.');\n    });\n\n    \/\/ Butona t\u0131kland\u0131\u011f\u0131nda sadece \"Buton T\u0131kland\u0131! Olay yay\u0131l\u0131m\u0131 durduruldu.\" \u00e7\u0131kt\u0131s\u0131 g\u00f6r\u00fcn\u00fcr.\n    \/\/ \"Kapsay\u0131c\u0131 Div T\u0131kland\u0131!\" mesaj\u0131 g\u00f6r\u00fcnmez \u00e7\u00fcnk\u00fc olay yay\u0131l\u0131m\u0131 butonda durduruldu.\n<\/script>\n<\/pre>\n<p><\/code><\/p>\n<p>\nBu \u00f6rnekte, butona t\u0131kland\u0131\u011f\u0131nda <code>stopPropagation()<\/code> \u00e7a\u011fr\u0131ld\u0131\u011f\u0131 i\u00e7in, <code>container<\/code> elementi \u00fczerindeki <code>click<\/code> olay dinleyicisi tetiklenmez. Bu, \u00f6zellikle bir a\u00e7\u0131l\u0131r men\u00fc veya modal i\u00e7inde bir d\u00fc\u011fmeye t\u0131kland\u0131\u011f\u0131nda, men\u00fcn\u00fcn kendisinin de kapanmas\u0131n\u0131 engellemek istedi\u011finiz durumlarda \u00e7ok kullan\u0131\u015fl\u0131d\u0131r.\n<\/p>\n<h3>Varsay\u0131lan Davran\u0131\u015f\u0131 Engelleme: <code>event.preventDefault()<\/code> Kullan\u0131m\u0131<\/h3>\n<p>\nBaz\u0131 HTML elementlerinin, belirli olaylara kar\u015f\u0131 taray\u0131c\u0131 taraf\u0131ndan tan\u0131mlanm\u0131\u015f varsay\u0131lan davran\u0131\u015flar\u0131 vard\u0131r. \u00d6rne\u011fin, bir <code><a><\/code> etiketine t\u0131kland\u0131\u011f\u0131nda varsay\u0131lan olarak ba\u011fl\u0131 oldu\u011fu URL'ye gider, bir <code>submit<\/code> tipi d\u00fc\u011fmeye t\u0131kland\u0131\u011f\u0131nda bir form g\u00f6nderilir veya bir sa\u011f t\u0131klama men\u00fcs\u00fc a\u00e7ar. <code>event.preventDefault()<\/code> metodu, bu varsay\u0131lan davran\u0131\u015flar\u0131 engellemek i\u00e7in kullan\u0131l\u0131r.\n<\/p>\n<p>\nBu metodun <code>stopPropagation()<\/code> ile kar\u0131\u015ft\u0131r\u0131lmamas\u0131 \u00f6nemlidir. <code>preventDefault()<\/code> sadece olay\u0131n varsay\u0131lan davran\u0131\u015f\u0131n\u0131 engellerken, olay yay\u0131l\u0131m\u0131n\u0131 durdurmaz. Yani olay, DOM a\u011fac\u0131 boyunca yay\u0131lmaya devam eder ancak taray\u0131c\u0131n\u0131n o olaya \u00f6zel tan\u0131mlanm\u0131\u015f davran\u0131\u015f\u0131 ger\u00e7ekle\u015fmez.\n<\/p>\n<pre><code>\n<a href=\"https:\/\/www.google.com\" id=\"myLink\">Google'a Git<\/a>\n<form id=\"myForm\">\n    <input type=\"text\" placeholder=\"Ad\u0131n\u0131z\">\n    <button type=\"submit\">G\u00f6nder<\/button>\n<\/form>\n\n<script>\n    const myLink = document.getElementById('myLink');\n    const myForm = document.getElementById('myForm');\n\n    myLink.addEventListener('click', function(event) {\n        event.preventDefault(); \/\/ Ba\u011flant\u0131n\u0131n varsay\u0131lan davran\u0131\u015f\u0131n\u0131 engelle\n        console.log('Linke t\u0131kland\u0131, ancak Google\\'a gidilmedi.');\n        \/\/ Belki burada \u00f6zel bir AJAX iste\u011fi yapars\u0131n\u0131z\n    });\n\n    myForm.addEventListener('submit', function(event) {\n        event.preventDefault(); \/\/ Formun varsay\u0131lan g\u00f6nderme davran\u0131\u015f\u0131n\u0131 engelle\n        console.log('Form g\u00f6nderildi, ancak sayfa yenilenmedi.');\n        \/\/ Belki burada form verilerini AJAX ile i\u015flersiniz\n    });\n<\/script>\n<\/pre>\n<p><\/code><\/p>\n<p>\nYukar\u0131daki \u00f6rnekte, linke t\u0131kland\u0131\u011f\u0131nda Google'a gidilmez ve form g\u00f6nderildi\u011finde sayfa yenilenmez. Bu, \u00f6zellikle tek sayfal\u0131k uygulamalar (SPA) geli\u015ftirirken veya form verilerini dinamik olarak i\u015flemek istedi\u011finizde vazge\u00e7ilmez bir ara\u00e7t\u0131r. <code>preventDefault()<\/code> ve <code>stopPropagation()<\/code>'\u0131n do\u011fru kombinasyonunu kullanarak, kullan\u0131c\u0131 etkile\u015fimlerini tamamen kontrol alt\u0131na alabilir ve uygulaman\u0131z\u0131n istedi\u011finiz gibi davranmas\u0131n\u0131 sa\u011flayabilirsiniz.\n<\/p>\n<h2>Ger\u00e7ek D\u00fcnya Senaryolar\u0131: Olay Delegasyonu ile Performans Nas\u0131l Art\u0131r\u0131l\u0131r?<\/h2>\n<p>\nB\u00fcy\u00fck ve dinamik web uygulamalar\u0131nda, y\u00fczlerce hatta binlerce elementin her birine ayr\u0131 ayr\u0131 olay dinleyici eklemek hem performans sorunlar\u0131na yol a\u00e7abilir hem de bellek t\u00fcketimini art\u0131rabilir. Ayr\u0131ca, AJAX ile sayfa i\u00e7eri\u011fi dinamik olarak g\u00fcncellendi\u011finde, yeni eklenen elementlere olay dinleyicileri tekrar eklemek gibi zahmetli bir s\u00fcre\u00e7 gerektirebilir. \u0130\u015fte bu noktada, olay delegasyonu (Event Delegation) tekni\u011fi kurtar\u0131c\u0131 bir rol oynar. Bu teknik, modern web geli\u015ftirmenin vazge\u00e7ilmez bir par\u00e7as\u0131d\u0131r ve olay kabarc\u0131klanmas\u0131 prensibini temel alarak \u00e7al\u0131\u015f\u0131r.\n<\/p>\n<h3>Olay Delegasyonu (Event Delegation) Nedir ve Avantajlar\u0131 Nelerdir?<\/h3>\n<p>\nOlay delegasyonu, bir\u00e7ok alt elementin olaylar\u0131n\u0131, onlar\u0131n ortak bir \u00fcst elementine tek bir olay dinleyici ekleyerek y\u00f6netme tekni\u011fidir. Bu, olay kabarc\u0131klanmas\u0131 sayesinde m\u00fcmk\u00fcn olur: bir alt elementte tetiklenen olay, DOM a\u011fac\u0131nda yukar\u0131 do\u011fru kabarc\u0131klan\u0131r ve \u00fcst elementteki olay dinleyici taraf\u0131ndan yakalanabilir. \u00dcst elementteki dinleyici, <code>event.target<\/code> \u00f6zelli\u011fini kullanarak olay\u0131n as\u0131l hangi alt elementte meydana geldi\u011fini tespit eder ve buna g\u00f6re i\u015flem yapar.\n<\/p>\n<p>\nOlay delegasyonunun sa\u011flad\u0131\u011f\u0131 ba\u015fl\u0131ca avantajlar \u015funlard\u0131r:<\/p>\n<ul>\n<li><b>Performans \u0130yile\u015ftirmesi:<\/b> \u00c7ok say\u0131da element i\u00e7in ayr\u0131 ayr\u0131 olay dinleyici eklemek yerine sadece bir veya birka\u00e7 dinleyici tan\u0131mlan\u0131r. Bu, daha az bellek t\u00fcketimi ve daha h\u0131zl\u0131 sayfa y\u00fckleme anlam\u0131na gelir.<\/li>\n<li><b>Dinamik \u0130\u00e7erik Y\u00f6netimi:<\/b> Sayfaya dinamik olarak yeni elementler eklendi\u011finde, bu elementler i\u00e7in ek kod yazmaya gerek kalmadan olay dinleyicileri otomatik olarak \u00e7al\u0131\u015f\u0131r. \u00dcst element \u00fczerindeki dinleyici, yeni eklenen alt elementlerdeki olaylar\u0131 da alg\u0131layabilir.<\/li>\n<li><b>Kod Sadel\u0130\u011fi:<\/b> Daha az olay dinleyici kodu yaz\u0131l\u0131r, bu da kodun daha temiz ve y\u00f6netilebilir olmas\u0131n\u0131 sa\u011flar.<\/li>\n<li><b>Bellek S\u0131z\u0131nt\u0131lar\u0131n\u0131 \u00d6nleme:<\/b> Elementler DOM'dan kald\u0131r\u0131ld\u0131\u011f\u0131nda, onlara ba\u011fl\u0131 olay dinleyicilerini manuel olarak kald\u0131rma ihtiyac\u0131 azal\u0131r, bu da potansiyel bellek s\u0131z\u0131nt\u0131lar\u0131n\u0131n \u00f6n\u00fcne ge\u00e7er.<\/li>\n<\/ul>\n<h3>Liste Elemanlar\u0131nda Olay Delegasyonu Uygulamas\u0131<\/h3>\n<p>\nBir web uygulamas\u0131nda s\u0131k\u00e7a kar\u015f\u0131la\u015f\u0131lan senaryolardan biri, dinamik olarak b\u00fcy\u00fcyen bir liste (\u00f6rne\u011fin, bir yap\u0131lacaklar listesi veya \u00fcr\u00fcn katalo\u011fu) i\u00e7indeki her bir \u00f6\u011feye t\u0131klama olay\u0131n\u0131 y\u00f6netmektir. Her <code>li<\/code> \u00f6\u011fesine ayr\u0131 bir olay dinleyici eklemek yerine, <code>ul<\/code> veya <code>ol<\/code> gibi \u00fcst elemana tek bir dinleyici ekleyerek bu olay\u0131 delege edebiliriz.\n<\/p>\n<pre><code>\n<ul id=\"taskList\" style=\"list-style: none; padding: 0; border: 1px solid #ccc;\">\n    <li style=\"padding: 10px; margin: 5px; background-color: #f9f9f9; cursor: pointer;\">G\u00f6revi 1 Tamamla<\/li>\n    <li style=\"padding: 10px; margin: 5px; background-color: #f9f9f9; cursor: pointer;\">Raporu Haz\u0131rla<\/li>\n    <li style=\"padding: 10px; margin: 5px; background-color: #f9f9f9; cursor: pointer;\">Toplant\u0131ya Kat\u0131l<\/li>\n<\/ul>\n<button id=\"addMore\" style=\"margin-top: 10px; padding: 8px 15px;\">Yeni G\u00f6rev Ekle<\/button>\n\n<script>\n    const taskList = document.getElementById('taskList');\n    const addMoreButton = document.getElementById('addMore');\n    let taskCount = 3;\n\n    \/\/ Sadece \u00fcst elemente tek bir dinleyici ekliyoruz\n    taskList.addEventListener('click', function(event) {\n        \/\/ event.target, olay\u0131n as\u0131l tetiklendi\u011fi elementtir (\u00f6rn. bir li eleman\u0131)\n        if (event.target.tagName === 'LI') { \/\/ Sadece LI elementleri i\u00e7in i\u015flem yap\n            event.target.style.textDecoration = 'line-through';\n            event.target.style.color = '#888';\n            console.log(<code>${event.target.textContent} g\u00f6revi tamamland\u0131!<\/code>);\n        }\n    });\n\n    addMoreButton.addEventListener('click', function() {\n        taskCount++;\n        const newListItem = document.createElement('li');\n        newListItem.style = \"padding: 10px; margin: 5px; background-color: #f9f9f9; cursor: pointer;\";\n        newListItem.textContent = <code>Yeni G\u00f6rev ${taskCount}<\/code>;\n        taskList.appendChild(newListItem);\n        console.log(<code>Yeni g\u00f6rev eklendi: ${newListItem.textContent}<\/code>);\n        \/\/ Yeni eklenen li elementi i\u00e7in ayr\u0131 bir olay dinleyici eklemeye gerek yok!\n    });\n<\/script>\n<\/pre>\n<p><\/code><\/p>\n<p>\nBu \u00f6rnekte, <code>taskList<\/code> \u00fczerine eklenen tek bir dinleyici, hem ba\u015flang\u0131\u00e7taki <code>li<\/code> elemanlar\u0131n\u0131n hem de sonradan <code>addMoreButton<\/code> ile dinamik olarak eklenen <code>li<\/code> elemanlar\u0131n\u0131n t\u0131klama olaylar\u0131n\u0131 ba\u015far\u0131yla y\u00f6netir. <code>event.target<\/code> \u00f6zelli\u011fini kullanarak, t\u0131klaman\u0131n tam olarak hangi <code>li<\/code> elementinde ger\u00e7ekle\u015fti\u011fini tespit edebiliriz.\n<\/p>\n<h3>Modal Pencere Kapatma Mekanizmas\u0131nda Olay Delegasyonu<\/h3>\n<p>\nModal pencereler, kullan\u0131c\u0131 aray\u00fczlerinde s\u0131k\u00e7a kullan\u0131lan bile\u015fenlerdir. Genellikle modal\u0131n d\u0131\u015f\u0131na t\u0131klan\u0131ld\u0131\u011f\u0131nda kapanmas\u0131 beklenir. Bu senaryo da olay delegasyonu i\u00e7in m\u00fckemmel bir \u00f6rnektir. T\u00fcm belgeye bir t\u0131klama dinleyici ekleyerek ve <code>event.target<\/code>'\u0131 kontrol ederek modal\u0131 kapatabiliriz.\n<\/p>\n<pre><code>\n<style>\n    .modal-backdrop {\n        position: fixed;\n        top: 0; left: 0; right: 0; bottom: 0;\n        background: rgba(0,0,0,0.5);\n        display: flex;\n        justify-content: center;\n        align-items: center;\n        z-index: 1000;\n        visibility: hidden; \/* Varsay\u0131lan olarak gizli *\/\n        opacity: 0;\n        transition: visibility 0s, opacity 0.3s ease;\n    }\n    .modal-backdrop.active {\n        visibility: visible;\n        opacity: 1;\n    }\n    .modal-content {\n        background: white;\n        padding: 30px;\n        border-radius: 8px;\n        box-shadow: 0 4px 8px rgba(0,0,0,0.2);\n        max-width: 500px;\n        width: 90%;\n        text-align: center;\n    }\n<\/style>\n\n<button id=\"openModalBtn\">Modali A\u00e7<\/button>\n\n<div id=\"myModal\" class=\"modal-backdrop\">\n    <div class=\"modal-content\">\n        <h3>Merhaba Modaldan!<\/h3>\n        <p>Bu bir modal penceresidir. D\u0131\u015far\u0131ya t\u0131klayarak kapatabilirsiniz.<\/p>\n        <button id=\"closeModalBtn\">Kapat<\/button>\n    <\/div>\n<\/div>\n\n<script>\n    const openModalBtn = document.getElementById('openModalBtn');\n    const myModal = document.getElementById('myModal');\n    const closeModalBtn = document.getElementById('closeModalBtn');\n\n    openModalBtn.addEventListener('click', function() {\n        myModal.classList.add('active');\n    });\n\n    closeModalBtn.addEventListener('click', function() {\n        myModal.classList.remove('active');\n    });\n\n    \/\/ Modal\u0131 d\u0131\u015far\u0131ya t\u0131klay\u0131nca kapatma\n    myModal.addEventListener('click', function(event) {\n        \/\/ event.target, t\u0131klanan elementtir.\n        \/\/ event.currentTarget, olay dinleyicisinin ba\u011fl\u0131 oldu\u011fu elementtir (yani myModal).\n        if (event.target === event.currentTarget) {\n            myModal.classList.remove('active');\n            console.log('Modal d\u0131\u015f\u0131na t\u0131kland\u0131 ve modal kapat\u0131ld\u0131.');\n        }\n    });\n<\/script>\n<\/pre>\n<p><\/code><\/p>\n<p>\nBu \u00f6rnekte, <code>myModal<\/code> (<code>modal-backdrop<\/code>) \u00fczerine eklenen tek bir t\u0131klama dinleyici ile, modal\u0131n d\u0131\u015f alan\u0131na yap\u0131lan t\u0131klamalar yakalan\u0131r. <code>event.target === event.currentTarget<\/code> kontrol\u00fc sayesinde, sadece modal\u0131n arka plan\u0131na (yani i\u00e7eri\u011fine de\u011fil) t\u0131kland\u0131\u011f\u0131nda modal\u0131n kapanmas\u0131 sa\u011flan\u0131r. Bu, <code>event.target<\/code>'\u0131n g\u00fcc\u00fcn\u00fc ve olay delegasyonunun esnekli\u011fini g\u00f6steren harika bir \u00f6rnektir. Olay delegasyonu sayesinde, hem kod tekrar\u0131ndan ka\u00e7\u0131nm\u0131\u015f oluruz hem de performans a\u00e7\u0131s\u0131ndan daha verimli bir yap\u0131 kurar\u0131z.\n<\/p>\n<h2>\u0130leri Seviye Optimizasyonlar ve S\u0131k Kar\u015f\u0131la\u015f\u0131lan Sorunlar<\/h2>\n<p>\nJavaScript olay y\u00f6netimini sadece temel d\u00fczeyde anlamak, etkile\u015fimli web uygulamalar\u0131 olu\u015fturmak i\u00e7in yeterli olsa da, y\u00fcksek performansl\u0131, duyarl\u0131 ve bellek dostu uygulamalar geli\u015ftirmek i\u00e7in baz\u0131 ileri d\u00fczey tekniklere ve s\u0131k kar\u015f\u0131la\u015f\u0131lan sorunlara hakim olmak gerekir. Bu b\u00f6l\u00fcmde, uygulaman\u0131z\u0131n performans\u0131n\u0131 art\u0131racak, bellek s\u0131z\u0131nt\u0131lar\u0131n\u0131 \u00f6nleyecek ve mobil cihaz uyumlulu\u011funu sa\u011flayacak \u00f6nemli ipu\u00e7lar\u0131n\u0131 ve \u00e7\u00f6z\u00fcmleri ele alaca\u011f\u0131z.\n<\/p>\n<h3>Performans \u0130\u00e7in <code>passive<\/code> Se\u00e7ene\u011fi: Kayd\u0131rma Olaylar\u0131nda Neden \u00d6nemli?<\/h3>\n<p>\nTaray\u0131c\u0131lar, kullan\u0131c\u0131 deneyimini p\u00fcr\u00fczs\u00fcz hale getirmek i\u00e7in s\u00fcrekli optimizasyonlar yapar. \u00d6zellikle kayd\u0131rma (scroll) ve dokunmatik (touch) olaylar\u0131, sayfa yan\u0131t h\u0131z\u0131n\u0131 do\u011frudan etkileyen olaylard\u0131r. Varsay\u0131lan olarak, bir kayd\u0131rma olay\u0131 dinleyicisi eklendi\u011finde, taray\u0131c\u0131 bu dinleyicinin <code>event.preventDefault()<\/code> \u00e7a\u011f\u0131r\u0131p \u00e7a\u011f\u0131rmayaca\u011f\u0131n\u0131 bilmez. Bu nedenle, olay\u0131n varsay\u0131lan kayd\u0131rma davran\u0131\u015f\u0131n\u0131 engelleme ihtimaline kar\u015f\u0131 bir an i\u00e7in bekler. Bu k\u00fc\u00e7\u00fck bekleme s\u00fcresi, \"jank\" (tak\u0131lma) olarak bilinen, kullan\u0131c\u0131n\u0131n kayd\u0131rmay\u0131 gecikmeli veya tak\u0131larak alg\u0131lamas\u0131na neden olabilir.\n<\/p>\n<p>\n\u0130\u015fte burada <code>addEventListener<\/code>'\u0131n <code>options<\/code> parametresindeki <code>passive<\/code> se\u00e7ene\u011fi devreye girer. <code>passive: true<\/code> olarak ayarland\u0131\u011f\u0131nda, taray\u0131c\u0131ya \"bu olay dinleyici <code>preventDefault()<\/code> \u00e7a\u011f\u0131rmayacak, dolay\u0131s\u0131yla varsay\u0131lan kayd\u0131rma davran\u0131\u015f\u0131n\u0131 engellememe gerek yok, kayd\u0131rmay\u0131 olabildi\u011fince \u00e7abuk ba\u015flatabilirsin\" mesaj\u0131n\u0131 vermi\u015f olursunuz. Bu, taray\u0131c\u0131n\u0131n optimizasyon yapmas\u0131na olanak tan\u0131yarak kayd\u0131rma performans\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r.\n<\/p>\n<pre><code>\n<div id=\"scrollContainer\" style=\"height: 200px; overflow-y: scroll; border: 1px solid #000; margin-top: 20px;\">\n    <p>Buras\u0131 uzun bir i\u00e7eriktir...<\/p>\n    <p>Kayd\u0131rarak performans fark\u0131n\u0131 hissedin.<\/p>\n    <p>...<\/p>\n    <p>...<\/p>\n    <p>...<\/p>\n    <p>...<\/p>\n    <p>...<\/p>\n    <p>...<\/p>\n    <p>...<\/p>\n    <p>...<\/p>\n    <p>...<\/p>\n    <p>...<\/p>\n    <p>...<\/p>\n    <p>...<\/p>\n    <p>...<\/p>\n    <p>...<\/p>\n    <p>...<\/p>\n<\/div>\n\n<script>\n    const scrollContainer = document.getElementById('scrollContainer');\n\n    \/\/ Passive olmayan \u00f6rnek (potansiyel jank)\n    \/\/ scrollContainer.addEventListener('scroll', function() {\n    \/\/     console.log('Kayd\u0131rma Oluyor (passive de\u011fil)');\n    \/\/ }, false); \/\/ Veya varsay\u0131lan\n\n    \/\/ Passive olan \u00f6rnek (\u00f6nerilen)\n    scrollContainer.addEventListener('scroll', function(event) {\n        \/\/ event.preventDefault(); \/\/ Burada \u00e7a\u011fr\u0131l\u0131rsa konsolda uyar\u0131 al\u0131rs\u0131n\u0131z\n        console.log('Kayd\u0131rma Oluyor (passive)');\n    }, { passive: true });\n<\/script>\n<\/pre>\n<p><\/code><\/p>\n<p>\nE\u011fer <code>passive: true<\/code> olarak ayarlanm\u0131\u015f bir olay dinleyici i\u00e7inde <code>event.preventDefault()<\/code> \u00e7a\u011f\u0131r\u0131rsan\u0131z, taray\u0131c\u0131 konsolunda bir uyar\u0131 al\u0131rs\u0131n\u0131z \u00e7\u00fcnk\u00fc bu, taray\u0131c\u0131ya verdi\u011finiz s\u00f6zle \u00e7eli\u015fir. Bu nedenle, <code>passive: true<\/code> se\u00e7ene\u011fini yaln\u0131zca varsay\u0131lan davran\u0131\u015f\u0131 engellemeyi planlamad\u0131\u011f\u0131n\u0131z olay dinleyicilerinde kullanmal\u0131s\u0131n\u0131z. \u00d6zellikle <code>scroll<\/code>, <code>wheel<\/code>, <code>touchstart<\/code>, <code>touchmove<\/code> gibi performans kritik olaylar i\u00e7in bu se\u00e7enek olduk\u00e7a \u00f6nemlidir.\n<\/p>\n<h3><code>removeEventListener()<\/code> ile Bellek S\u0131z\u0131nt\u0131lar\u0131n\u0131 \u00d6nleme<\/h3>\n<p>\nBir elemente <code>addEventListener()<\/code> ile bir olay dinleyici eklendi\u011finde, bu dinleyici element DOM'dan kald\u0131r\u0131lsa bile bellekte kalabilir ve bu da bellek s\u0131z\u0131nt\u0131lar\u0131na yol a\u00e7abilir. \u00d6zellikle tek sayfal\u0131k uygulamalar (SPA) veya dinamik olarak olu\u015fturulup kald\u0131r\u0131lan bile\u015fenlerle \u00e7al\u0131\u015f\u0131rken, olay dinleyicilerini d\u00fczg\u00fcn bir \u015fekilde kald\u0131rmak kritik \u00f6neme sahiptir. <code>removeEventListener()<\/code> metodu, eklenen bir olay dinleyiciyi kald\u0131rmak i\u00e7in kullan\u0131l\u0131r.\n<\/p>\n<p>\n<code>removeEventListener()<\/code> metodunun <code>addEventListener()<\/code> ile tam olarak ayn\u0131 parametreleri almas\u0131 gerekir: olay tipi, olay fonksiyonu ve <code>options<\/code> (yakalama a\u015famas\u0131 i\u00e7in <code>true\/false<\/code>). Bu, anonim fonksiyonlarla (<code>function() {}<\/code>) veya ok fonksiyonlar\u0131yla (<code>() => {}<\/code>) olay dinleyici ekleyip sonra kald\u0131rman\u0131n zor oldu\u011fu anlam\u0131na gelir, \u00e7\u00fcnk\u00fc kald\u0131rmak i\u00e7in ayn\u0131 fonksiyon referans\u0131na sahip olman\u0131z gerekir. Bu nedenle, olay dinleyicisi olarak genellikle adland\u0131r\u0131lm\u0131\u015f fonksiyonlar kullanmak daha g\u00fcvenlidir.\n<\/p>\n<pre><code>\n<button id=\"attachBtn\">Dinleyici Ekle<\/button>\n<button id=\"detachBtn\">Dinleyiciyi Kald\u0131r<\/button>\n<div id=\"myBox\" style=\"width: 100px; height: 100px; background-color: lightgray; margin-top: 10px;\"><\/div>\n\n<script>\n    const attachBtn = document.getElementById('attachBtn');\n    const detachBtn = document.getElementById('detachBtn');\n    const myBox = document.getElementById('myBox');\n\n    \/\/ Adland\u0131r\u0131lm\u0131\u015f fonksiyon referans\u0131\n    function handleClick() {\n        console.log('Kutu t\u0131kland\u0131!');\n        myBox.style.backgroundColor = 'lightblue';\n    }\n\n    attachBtn.addEventListener('click', function() {\n        myBox.addEventListener('click', handleClick); \/\/ Adland\u0131r\u0131lm\u0131\u015f fonksiyonu ekliyoruz\n        console.log('Olay dinleyici eklendi.');\n    });\n\n    detachBtn.addEventListener('click', function() {\n        myBox.removeEventListener('click', handleClick); \/\/ Ayn\u0131 fonksiyon referans\u0131n\u0131 kald\u0131r\u0131yoruz\n        console.log('Olay dinleyici kald\u0131r\u0131ld\u0131.');\n        myBox.style.backgroundColor = 'lightgray'; \/\/ Rengi s\u0131f\u0131rla\n    });\n<\/script>\n<\/pre>\n<p><\/code><\/p>\n<p>\nBu \u00f6rnekte, <code>handleClick<\/code> ad\u0131nda bir fonksiyon tan\u0131mlayarak hem ekleme hem de kald\u0131rma i\u015flemlerinde ayn\u0131 referans\u0131 kullanabiliyoruz. Bu, bellek s\u0131z\u0131nt\u0131lar\u0131n\u0131 \u00f6nlemenin ve uygulaman\u0131z\u0131n uzun vadede stabil kalmas\u0131n\u0131 sa\u011flaman\u0131n anahtar\u0131d\u0131r. \u00d6zellikle bir bile\u015fen DOM'dan tamamen kald\u0131r\u0131ld\u0131\u011f\u0131nda, ona ba\u011fl\u0131 t\u00fcm olay dinleyicilerini <code>removeEventListener()<\/code> ile temizledi\u011finizden emin olun.\n<\/p>\n<h3>Mobil Cihazlarda Olay Y\u00f6netimi: Dokunmatik Olaylar ve Medya Sorgular\u0131<\/h3>\n<p>\nG\u00fcn\u00fcm\u00fcz web uygulamalar\u0131 sadece masa\u00fcst\u00fc bilgisayarlarda de\u011fil, ak\u0131ll\u0131 telefonlar ve tabletler gibi mobil cihazlarda da sorunsuz \u00e7al\u0131\u015fmal\u0131d\u0131r. Mobil cihazlarda fare olaylar\u0131 yerine dokunmatik olaylar (touch events) \u00f6ne \u00e7\u0131kar ve bu olaylar\u0131n y\u00f6netimi, kabarc\u0131klanma ve yakalama prensiplerini de i\u00e7erir. Ba\u015fl\u0131ca dokunmatik olaylar \u015funlard\u0131r:<\/p>\n<ul>\n<li><b><code>touchstart<\/code>:<\/b> Kullan\u0131c\u0131n\u0131n ekrana dokundu\u011fu an tetiklenir.<\/li>\n<li><b><code>touchmove<\/code>:<\/b> Kullan\u0131c\u0131n\u0131n parma\u011f\u0131n\u0131 ekranda hareket ettirdi\u011fi s\u00fcrece tekrar tekrar tetiklenir.<\/li>\n<li><b><code>touchend<\/code>:<\/b> Kullan\u0131c\u0131n\u0131n parma\u011f\u0131n\u0131 ekrandan kald\u0131rd\u0131\u011f\u0131 an tetiklenir.<\/li>\n<li><b><code>touchcancel<\/code>:<\/b> Bir dokunma etkile\u015fimi, taray\u0131c\u0131n\u0131n kendi kayd\u0131rma veya yak\u0131nla\u015ft\u0131rma davran\u0131\u015f\u0131 gibi nedenlerle iptal edildi\u011finde tetiklenir.<\/li>\n<\/ul>\n<p>\nDokunmatik olaylarda da <code>event.preventDefault()<\/code> kullanmak, taray\u0131c\u0131n\u0131n varsay\u0131lan kayd\u0131rma veya yak\u0131nla\u015ft\u0131rma gibi davran\u0131\u015flar\u0131n\u0131 engellemek i\u00e7in \u00f6nemlidir, ancak yukar\u0131da bahsedildi\u011fi gibi <code>passive: true<\/code> se\u00e7ene\u011fiyle birlikte dikkatli kullan\u0131lmal\u0131d\u0131r. \u00d6rne\u011fin, bir <code>swipe<\/code> hareketi uygulamak istedi\u011finizde <code>touchmove<\/code> olay\u0131nda <code>preventDefault()<\/code> \u00e7a\u011f\u0131rarak sayfan\u0131n kaymas\u0131n\u0131 engelleyebilirsiniz.\n<\/p>\n<p>\nAyr\u0131ca, mobil cihazlarda farkl\u0131 ekran boyutlar\u0131 ve y\u00f6nlendirmeleri i\u00e7in olay davran\u0131\u015flar\u0131n\u0131 veya stilleri adapte etmek i\u00e7in CSS medya sorgular\u0131ndan (<code>@media<\/code>) faydalanabiliriz. JavaScript'te de <code>window.matchMedia()<\/code> metodunu kullanarak medya sorgular\u0131n\u0131 dinamik olarak kontrol edebilir ve cihaz \u00f6zelliklerine g\u00f6re farkl\u0131 olay dinleyicileri ekleyebilir veya kald\u0131rabiliriz.\n<\/p>\n<pre><code>\n<style>\n    #touchArea {\n        width: 100%;\n        height: 150px;\n        background-color: #eee;\n        border: 2px dashed #999;\n        display: flex;\n        justify-content: center;\n        align-items: center;\n        margin-top: 20px;\n        font-size: 1.2em;\n        text-align: center;\n        user-select: none; \/* Metin se\u00e7imi engellensin *\/\n        -webkit-user-select: none;\n    }\n\n    @media (max-width: 600px) {\n        #touchArea {\n            background-color: #f0f8ff; \/* Mobil cihazlarda farkl\u0131 arka plan *\/\n            border-color: #007bff;\n        }\n    }\n<\/style>\n\n<div id=\"touchArea\">\n    Dokunmatik Alan\n<\/div>\n\n<script>\n    const touchArea = document.getElementById('touchArea');\n\n    touchArea.addEventListener('touchstart', function(event) {\n        console.log('Dokunma Ba\u015flad\u0131:', event.touches.length, 'parmak');\n        \/\/ event.preventDefault(); \/\/ Varsay\u0131lan davran\u0131\u015f\u0131 engellemek isteyebilirsiniz\n    }, { passive: true }); \/\/ Dokunmatik olaylarda passive genellikle \u00f6nerilir\n\n    touchArea.addEventListener('touchmove', function(event) {\n        \/\/ console.log('Dokunma Hareket Ediyor...'); \/\/ \u00c7ok s\u0131k tetiklenebilir\n        \/\/ event.preventDefault(); \/\/ Kayd\u0131rmay\u0131 engellemek i\u00e7in kullan\u0131labilir\n    }, { passive: true });\n\n    touchArea.addEventListener('touchend', function(event) {\n        console.log('Dokunma Bitti.');\n    }, { passive: true });\n\n    \/\/ JavaScript ile medya sorgusu dinleme\n    const mediaQuery = window.matchMedia('(max-width: 600px)');\n\n    function handleMediaQueryChange(e) {\n        if (e.matches) {\n            console.log('Mobil cihaz boyutunda: \u00d6zel mobil olay dinleyicileri eklenebilir.');\n            \/\/ Mobil i\u00e7in \u00f6zel olay dinleyicileri ekleyebilirsiniz\n        } else {\n            console.log('Masa\u00fcst\u00fc boyutunda: Mobil olay dinleyicileri kald\u0131r\u0131labilir.');\n            \/\/ Masa\u00fcst\u00fc i\u00e7in \u00f6zel olay dinleyicileri ekleyebilirsiniz\n        }\n    }\n\n    \/\/ \u0130lk y\u00fcklemede kontrol et\n    handleMediaQueryChange(mediaQuery);\n    \/\/ Medya sorgusu de\u011fi\u015fti\u011finde fonksiyonu \u00e7a\u011f\u0131r\n    mediaQuery.addListener(handleMediaQueryChange); \/\/ Eski taray\u0131c\u0131lar i\u00e7in addListener\n    \/\/ mediaQuery.addEventListener('change', handleMediaQueryChange); \/\/ Yeni taray\u0131c\u0131lar i\u00e7in\n<\/script>\n<\/pre>\n<p><\/code><\/p>\n<p>\nMobil cihazlarda olay y\u00f6netimi, dokunmatik olaylar\u0131n hassasiyetini ve performans\u0131n\u0131 g\u00f6z \u00f6n\u00fcnde bulundurmay\u0131 gerektirir. <code>passive<\/code> se\u00e7ene\u011fi ve <code>event.preventDefault()<\/code> kullan\u0131m\u0131 bu ba\u011flamda kritik rol oynar. Ayr\u0131ca, CSS medya sorgular\u0131yla g\u00f6rsel adaptasyon sa\u011flaman\u0131n yan\u0131 s\u0131ra, JavaScript ile <code>window.matchMedia()<\/code> kullanarak olay davran\u0131\u015flar\u0131n\u0131 da cihaz boyutuna g\u00f6re dinamik olarak ayarlayabiliriz. Bu ileri d\u00fczey optimizasyonlar ve mobil uyumluluk yakla\u015f\u0131mlar\u0131, modern ve y\u00fcksek kaliteli web deneyimleri sunman\u0131n temelini olu\u015fturur.\n<\/p>\n<h2>S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<h3>S1: <code>event.stopPropagation()<\/code> ve <code>event.preventDefault()<\/code> aras\u0131ndaki temel fark nedir?<\/h3>\n<p>\n<b>Cevap:<\/b> \u0130ki metod da olay y\u00f6netiminde kritik roller oynar ancak farkl\u0131 ama\u00e7lara hizmet eder. <code>event.stopPropagation()<\/code> olay\u0131n DOM a\u011fac\u0131 boyunca daha fazla yay\u0131lmas\u0131n\u0131 (hem yakalama hem de kabarc\u0131klanma a\u015famas\u0131nda) durdurur. Yani, olay \u00fcst veya alt elementlere ge\u00e7mez. <code>event.preventDefault()<\/code> ise olay\u0131n taray\u0131c\u0131 taraf\u0131ndan belirlenen varsay\u0131lan davran\u0131\u015f\u0131n\u0131 (\u00f6rne\u011fin, bir ba\u011flant\u0131ya t\u0131kland\u0131\u011f\u0131nda URL'ye gitmek, bir formu g\u00f6ndermek) engeller. Olay yay\u0131l\u0131m\u0131n\u0131 durdurmaz; olay DOM a\u011fac\u0131 boyunca yay\u0131lmaya devam eder, ancak varsay\u0131lan davran\u0131\u015f ger\u00e7ekle\u015fmez. K\u0131sacas\u0131, birincisi yay\u0131l\u0131m\u0131, ikincisi davran\u0131\u015f\u0131 etkiler.\n<\/p>\n<h3>S2: Olay delegasyonu her zaman en iyi \u00e7\u00f6z\u00fcm m\u00fcd\u00fcr?<\/h3>\n<p>\n<b>Cevap:<\/b> Olay delegasyonu, \u00f6zellikle dinamik olarak eklenen elementlerle veya \u00e7ok say\u0131da benzer elementle \u00e7al\u0131\u015f\u0131rken performans ve kod y\u00f6netimi a\u00e7\u0131s\u0131ndan harika bir \u00e7\u00f6z\u00fcmd\u00fcr. Ancak her zaman \"en iyi\" \u00e7\u00f6z\u00fcm olmayabilir. \u00c7ok az say\u0131da elementiniz varsa ve dinamik i\u00e7erik beklemiyorsan\u0131z, do\u011frudan elementlere olay dinleyici eklemek kodun okunabilirli\u011fini art\u0131rabilir. Ayr\u0131ca, delegasyon yaparken <code>event.target<\/code> \u00fczerinden do\u011fru elementi tespit etmek i\u00e7in karma\u015f\u0131k ko\u015fullar yazman\u0131z gerekebilir ki bu da performans\u0131 ve kod karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 art\u0131rabilir. Duruma g\u00f6re de\u011ferlendirmek \u00f6nemlidir.\n<\/p>\n<h3>S3: Capturing a\u015famas\u0131 pratikte ne kadar kullan\u0131l\u0131r?<\/h3>\n<p>\n<b>Cevap:<\/b> Olay yakalama (capturing) a\u015famas\u0131, kabarc\u0131klanma (bubbling) a\u015famas\u0131na g\u00f6re pratikte daha az kullan\u0131l\u0131r. \u00c7o\u011fu olay y\u00f6netimi senaryosu kabarc\u0131klanma ile \u00e7\u00f6z\u00fcl\u00fcr (\u00f6zellikle olay delegasyonu). Ancak yakalama a\u015famas\u0131, olay\u0131n hedef elemente ula\u015fmadan \u00f6nce, \u00fcst elementler taraf\u0131ndan yakalanmas\u0131 gereken \u00f6zel durumlarda faydal\u0131d\u0131r. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n sayfa i\u00e7indeki t\u00fcm t\u0131klamalar\u0131n\u0131 izlemek veya belirli bir alan i\u00e7indeki t\u00fcm olaylar\u0131, alt elementlerdeki olay dinleyicilerinden \u00f6nce yakalamak istedi\u011finizde kullan\u0131\u015fl\u0131 olabilir.\n<\/p>\n<h3>S4: <code>this<\/code> anahtar kelimesi olay dinleyicilerinde neye i\u015faret eder?<\/h3>\n<p>\n<b>Cevap:<\/b> <code>addEventListener<\/code> ile eklenen bir olay dinleyicisindeki <code>this<\/code> anahtar kelimesi, varsay\u0131lan olarak olay\u0131n dinleyicisinin ba\u011fl\u0131 oldu\u011fu elemente (yani <code>currentTarget<\/code>'a) i\u015faret eder. \u00d6rne\u011fin, bir <code>div<\/code> elementine olay dinleyici eklerseniz ve bu dinleyici bir fonksiyon ise, <code>this<\/code> o <code>div<\/code> elementini temsil eder. Ancak, ok fonksiyonlar\u0131 (<code>() => {}<\/code>) kullan\u0131ld\u0131\u011f\u0131nda <code>this<\/code> farkl\u0131 davran\u0131r; ok fonksiyonlar\u0131 kendi <code>this<\/code> ba\u011flam\u0131na sahip de\u011fildir ve \u00e7evreleyen (lexical) ba\u011flamdaki <code>this<\/code> de\u011ferini miras al\u0131r. Bu nedenle, ok fonksiyonlar\u0131nda <code>this<\/code> genellikle <code>window<\/code> objesine (veya kat\u0131 modda <code>undefined<\/code>) i\u015faret eder veya fonksiyonun tan\u0131mland\u0131\u011f\u0131 kapsay\u0131c\u0131 fonksiyonun <code>this<\/code>'ini al\u0131r. Bu davran\u0131\u015f\u0131 kar\u0131\u015ft\u0131rmamak ve dikkatli kullanmak \u00f6nemlidir. <code>event.currentTarget<\/code> ve <code>event.target<\/code> \u00f6zellikleri <code>this<\/code> anahtar kelimesine g\u00f6re daha g\u00fcvenilir ve a\u00e7\u0131k bir alternatif sunar.\n<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"JavaScript&#8217;teki olay kabarc\u0131klanmas\u0131 (bubbling) ve yakalama (capturing) mekanizmalar\u0131, web geli\u015ftiricilerin DOM olaylar\u0131n\u0131 nas\u0131l y\u00f6netti\u011fini k\u00f6kten etkiler. Bu teknik&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[129],"tags":[],"class_list":{"0":"post-32053","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-javascript","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>JavaScript&#039;te Olay Kabarc\u0131klanmas\u0131 ve Yakalama: Kapsaml\u0131 Rehber<\/title>\n<meta name=\"description\" content=\"JavaScript&#039;teki olay kabarc\u0131klanmas\u0131 (bubbling) ve yakalama (capturing) mekanizmalar\u0131, web geli\u015ftiricilerin DOM olaylar\u0131n\u0131 nas\u0131l y\u00f6netti\u011fini k\u00f6kten etkiler. Bu teknik makale, bu temel kavramlar\u0131 ba\u015ftan sona a\u00e7\u0131kl\u0131yor, ger\u00e7ek d\u00fcnya \u00f6rnekleri ve detayl\u0131 kodlarla \u00f6\u011frenmenizi sa\u011fl\u0131yor. Etkin olay y\u00f6netimi ve kullan\u0131c\u0131 deneyimi i\u00e7in kritik bilgiler burada! Modern web uygulamalar\u0131nda kar\u015f\u0131la\u015f\u0131lan performans sorunlar\u0131n\u0131 a\u015fmak ve etkile\u015fimli aray\u00fczler olu\u015fturmak i\u00e7in bu mekanizmalar\u0131n derinlemesine anla\u015f\u0131lmas\u0131 vazge\u00e7ilmezdir. Peki, bu kavramlar tam olarak ne anlama geliyor ve projelerinizde nas\u0131l etkin bir \u015fekilde kullanabilirsiniz?\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/javascriptte-olay-kabarciklanmasi-ve-yakalama-kapsamli-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"JavaScript&#039;te Olay Kabarc\u0131klanmas\u0131 ve Yakalama: Kapsaml\u0131 Rehber\" \/>\n<meta property=\"og:description\" content=\"JavaScript&#039;teki olay kabarc\u0131klanmas\u0131 (bubbling) ve yakalama (capturing) mekanizmalar\u0131, web geli\u015ftiricilerin DOM olaylar\u0131n\u0131 nas\u0131l y\u00f6netti\u011fini k\u00f6kten etkiler. Bu teknik makale, bu temel kavramlar\u0131 ba\u015ftan sona a\u00e7\u0131kl\u0131yor, ger\u00e7ek d\u00fcnya \u00f6rnekleri ve detayl\u0131 kodlarla \u00f6\u011frenmenizi sa\u011fl\u0131yor. Etkin olay y\u00f6netimi ve kullan\u0131c\u0131 deneyimi i\u00e7in kritik bilgiler burada! Modern web uygulamalar\u0131nda kar\u015f\u0131la\u015f\u0131lan performans sorunlar\u0131n\u0131 a\u015fmak ve etkile\u015fimli aray\u00fczler olu\u015fturmak i\u00e7in bu mekanizmalar\u0131n derinlemesine anla\u015f\u0131lmas\u0131 vazge\u00e7ilmezdir. Peki, bu kavramlar tam olarak ne anlama geliyor ve projelerinizde nas\u0131l etkin bir \u015fekilde kullanabilirsiniz?\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/javascriptte-olay-kabarciklanmasi-ve-yakalama-kapsamli-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-17T02:31:25+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascriptte-olay-kabarciklanmasi-ve-yakalama-kapsamli-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascriptte-olay-kabarciklanmasi-ve-yakalama-kapsamli-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"JavaScript&#8217;te Olay Kabarc\u0131klanmas\u0131 ve Yakalama: Kapsaml\u0131 Rehber\",\"datePublished\":\"2025-10-17T02:31:25+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascriptte-olay-kabarciklanmasi-ve-yakalama-kapsamli-rehber\/\"},\"wordCount\":3857,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Javascript\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/javascriptte-olay-kabarciklanmasi-ve-yakalama-kapsamli-rehber\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascriptte-olay-kabarciklanmasi-ve-yakalama-kapsamli-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/javascriptte-olay-kabarciklanmasi-ve-yakalama-kapsamli-rehber\/\",\"name\":\"JavaScript'te Olay Kabarc\u0131klanmas\u0131 ve Yakalama: Kapsaml\u0131 Rehber\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-17T02:31:25+00:00\",\"description\":\"JavaScript'teki olay kabarc\u0131klanmas\u0131 (bubbling) ve yakalama (capturing) mekanizmalar\u0131, web geli\u015ftiricilerin DOM olaylar\u0131n\u0131 nas\u0131l y\u00f6netti\u011fini k\u00f6kten etkiler. Bu teknik makale, bu temel kavramlar\u0131 ba\u015ftan sona a\u00e7\u0131kl\u0131yor, ger\u00e7ek d\u00fcnya \u00f6rnekleri ve detayl\u0131 kodlarla \u00f6\u011frenmenizi sa\u011fl\u0131yor. Etkin olay y\u00f6netimi ve kullan\u0131c\u0131 deneyimi i\u00e7in kritik bilgiler burada! Modern web uygulamalar\u0131nda kar\u015f\u0131la\u015f\u0131lan performans sorunlar\u0131n\u0131 a\u015fmak ve etkile\u015fimli aray\u00fczler olu\u015fturmak i\u00e7in bu mekanizmalar\u0131n derinlemesine anla\u015f\u0131lmas\u0131 vazge\u00e7ilmezdir. Peki, bu kavramlar tam olarak ne anlama geliyor ve projelerinizde nas\u0131l etkin bir \u015fekilde kullanabilirsiniz?\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascriptte-olay-kabarciklanmasi-ve-yakalama-kapsamli-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/javascriptte-olay-kabarciklanmasi-ve-yakalama-kapsamli-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascriptte-olay-kabarciklanmasi-ve-yakalama-kapsamli-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"JavaScript&#8217;te Olay Kabarc\u0131klanmas\u0131 ve Yakalama: Kapsaml\u0131 Rehber\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"JavaScript'te Olay Kabarc\u0131klanmas\u0131 ve Yakalama: Kapsaml\u0131 Rehber","description":"JavaScript'teki olay kabarc\u0131klanmas\u0131 (bubbling) ve yakalama (capturing) mekanizmalar\u0131, web geli\u015ftiricilerin DOM olaylar\u0131n\u0131 nas\u0131l y\u00f6netti\u011fini k\u00f6kten etkiler. Bu teknik makale, bu temel kavramlar\u0131 ba\u015ftan sona a\u00e7\u0131kl\u0131yor, ger\u00e7ek d\u00fcnya \u00f6rnekleri ve detayl\u0131 kodlarla \u00f6\u011frenmenizi sa\u011fl\u0131yor. Etkin olay y\u00f6netimi ve kullan\u0131c\u0131 deneyimi i\u00e7in kritik bilgiler burada! Modern web uygulamalar\u0131nda kar\u015f\u0131la\u015f\u0131lan performans sorunlar\u0131n\u0131 a\u015fmak ve etkile\u015fimli aray\u00fczler olu\u015fturmak i\u00e7in bu mekanizmalar\u0131n derinlemesine anla\u015f\u0131lmas\u0131 vazge\u00e7ilmezdir. Peki, bu kavramlar tam olarak ne anlama geliyor ve projelerinizde nas\u0131l etkin bir \u015fekilde kullanabilirsiniz?","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/javascriptte-olay-kabarciklanmasi-ve-yakalama-kapsamli-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"JavaScript'te Olay Kabarc\u0131klanmas\u0131 ve Yakalama: Kapsaml\u0131 Rehber","og_description":"JavaScript'teki olay kabarc\u0131klanmas\u0131 (bubbling) ve yakalama (capturing) mekanizmalar\u0131, web geli\u015ftiricilerin DOM olaylar\u0131n\u0131 nas\u0131l y\u00f6netti\u011fini k\u00f6kten etkiler. Bu teknik makale, bu temel kavramlar\u0131 ba\u015ftan sona a\u00e7\u0131kl\u0131yor, ger\u00e7ek d\u00fcnya \u00f6rnekleri ve detayl\u0131 kodlarla \u00f6\u011frenmenizi sa\u011fl\u0131yor. Etkin olay y\u00f6netimi ve kullan\u0131c\u0131 deneyimi i\u00e7in kritik bilgiler burada! Modern web uygulamalar\u0131nda kar\u015f\u0131la\u015f\u0131lan performans sorunlar\u0131n\u0131 a\u015fmak ve etkile\u015fimli aray\u00fczler olu\u015fturmak i\u00e7in bu mekanizmalar\u0131n derinlemesine anla\u015f\u0131lmas\u0131 vazge\u00e7ilmezdir. Peki, bu kavramlar tam olarak ne anlama geliyor ve projelerinizde nas\u0131l etkin bir \u015fekilde kullanabilirsiniz?","og_url":"https:\/\/fatihsoysal.com\/blog\/javascriptte-olay-kabarciklanmasi-ve-yakalama-kapsamli-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-17T02:31:25+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"8 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/javascriptte-olay-kabarciklanmasi-ve-yakalama-kapsamli-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/javascriptte-olay-kabarciklanmasi-ve-yakalama-kapsamli-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"JavaScript&#8217;te Olay Kabarc\u0131klanmas\u0131 ve Yakalama: Kapsaml\u0131 Rehber","datePublished":"2025-10-17T02:31:25+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/javascriptte-olay-kabarciklanmasi-ve-yakalama-kapsamli-rehber\/"},"wordCount":3857,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Javascript"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/javascriptte-olay-kabarciklanmasi-ve-yakalama-kapsamli-rehber\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/javascriptte-olay-kabarciklanmasi-ve-yakalama-kapsamli-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/javascriptte-olay-kabarciklanmasi-ve-yakalama-kapsamli-rehber\/","name":"JavaScript'te Olay Kabarc\u0131klanmas\u0131 ve Yakalama: Kapsaml\u0131 Rehber","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-17T02:31:25+00:00","description":"JavaScript'teki olay kabarc\u0131klanmas\u0131 (bubbling) ve yakalama (capturing) mekanizmalar\u0131, web geli\u015ftiricilerin DOM olaylar\u0131n\u0131 nas\u0131l y\u00f6netti\u011fini k\u00f6kten etkiler. Bu teknik makale, bu temel kavramlar\u0131 ba\u015ftan sona a\u00e7\u0131kl\u0131yor, ger\u00e7ek d\u00fcnya \u00f6rnekleri ve detayl\u0131 kodlarla \u00f6\u011frenmenizi sa\u011fl\u0131yor. Etkin olay y\u00f6netimi ve kullan\u0131c\u0131 deneyimi i\u00e7in kritik bilgiler burada! Modern web uygulamalar\u0131nda kar\u015f\u0131la\u015f\u0131lan performans sorunlar\u0131n\u0131 a\u015fmak ve etkile\u015fimli aray\u00fczler olu\u015fturmak i\u00e7in bu mekanizmalar\u0131n derinlemesine anla\u015f\u0131lmas\u0131 vazge\u00e7ilmezdir. Peki, bu kavramlar tam olarak ne anlama geliyor ve projelerinizde nas\u0131l etkin bir \u015fekilde kullanabilirsiniz?","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/javascriptte-olay-kabarciklanmasi-ve-yakalama-kapsamli-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/javascriptte-olay-kabarciklanmasi-ve-yakalama-kapsamli-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/javascriptte-olay-kabarciklanmasi-ve-yakalama-kapsamli-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"JavaScript&#8217;te Olay Kabarc\u0131klanmas\u0131 ve Yakalama: Kapsaml\u0131 Rehber"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32053","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=32053"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32053\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=32053"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=32053"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=32053"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}