{"id":35650,"date":"2025-12-02T07:31:05","date_gmt":"2025-12-02T04:31:05","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/dom-tiklama-olaylari-ve-web-apileri-ile-dinamik-web-sayfalari-olusturma\/"},"modified":"2025-12-02T07:31:05","modified_gmt":"2025-12-02T04:31:05","slug":"dom-tiklama-olaylari-ve-web-apileri-ile-dinamik-web-sayfalari-olusturma","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/dom-tiklama-olaylari-ve-web-apileri-ile-dinamik-web-sayfalari-olusturma\/","title":{"rendered":"DOM, T\u0131klama Olaylar\u0131 ve Web API&#8217;leri ile Dinamik Web Sayfalar\u0131 Olu\u015fturma"},"content":{"rendered":"<p><body><\/p>\n<p>Modern web uygulamalar\u0131, kullan\u0131c\u0131larla etkile\u015fim kurarak dinamik deneyimler sunar. Peki, bir web sayfas\u0131n\u0131 statik bir belgeden canl\u0131 bir aray\u00fcze d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in hangi temel ara\u00e7lar\u0131 kullan\u0131r\u0131z? Bu makalede, Document Object Model (DOM), t\u0131klama olaylar\u0131 ve g\u00fc\u00e7l\u00fc Web API&#8217;lerini kullanarak web sayfalar\u0131n\u0131za hayat vermenin s\u0131rlar\u0131n\u0131 ad\u0131m ad\u0131m ke\u015ffedecek, s\u0131f\u0131rdan ba\u015flayarak ileri d\u00fczey tekniklere kadar uzanan kapsaml\u0131 bir rehber sunaca\u011f\u0131z.<\/p>\n<p>G\u00fcn\u00fcm\u00fcz dijital d\u00fcnyas\u0131nda, kullan\u0131c\u0131lar sadece bilgi t\u00fcketen pasif izleyiciler olmaktan \u00e7\u0131kt\u0131. Art\u0131k beklentileri \u00e7ok daha y\u00fcksek: an\u0131nda geri bildirim, ki\u015fiselle\u015ftirilmi\u015f i\u00e7erik ve sorunsuz bir etkile\u015fim. Statik bir web sitesi, ziyaret\u00e7ilerini h\u0131zla kaybedebilirken, dinamik ve etkile\u015fimli bir site kullan\u0131c\u0131lar\u0131 kendine \u00e7eker, ilgilerini canl\u0131 tutar ve onlara unutulmaz deneyimler sunar. \u00d6rne\u011fin, bir e-ticaret sitesinde \u00fcr\u00fcnleri sepete eklerken an\u0131nda g\u00fcncelleme g\u00f6rmek, bir haber sitesinde yorum g\u00f6ndermek veya sosyal medyada g\u00f6nderilere tepki vermek, hep bu dinamik yap\u0131n\u0131n birer \u00fcr\u00fcn\u00fcd\u00fcr.<\/p>\n<p>Peki, bu etkile\u015fimi nas\u0131l sa\u011fl\u0131yoruz? \u0130\u015fte bu noktada JavaScript devreye giriyor. JavaScript, taray\u0131c\u0131da \u00e7al\u0131\u015fan bir programlama dili olarak, web sayfalar\u0131n\u0131n i\u00e7eri\u011fini, yap\u0131s\u0131n\u0131 ve stilini de\u011fi\u015ftirebilme yetene\u011fi sunar. Bu yetene\u011fin temelinde yatan en \u00f6nemli kavramlardan biri ise DOM, yani Document Object Model&#8217;dir. DOM, bir web sayfas\u0131n\u0131 programatik olarak eri\u015filebilir ve manip\u00fcle edilebilir bir nesne yap\u0131s\u0131na d\u00f6n\u00fc\u015ft\u00fcrerek, JavaScript&#8217;in sayfa \u00fczerindeki her bir \u00f6\u011feyi (metinler, resimler, butonlar vb.) kontrol etmesine olanak tan\u0131r. Kullan\u0131c\u0131lar\u0131n bir butona t\u0131klamas\u0131, bir formu g\u00f6ndermesi veya bir sayfada gezinmesi gibi eylemleri yakalamak i\u00e7in ise t\u0131klama olaylar\u0131 ve di\u011fer Event Listener&#8217;lar vazge\u00e7ilmezdir. T\u00fcm bunlar\u0131n \u00f6tesinde, taray\u0131c\u0131lar\u0131n sundu\u011fu Web API&#8217;leri, co\u011frafi konum bilgisi alma, kamera eri\u015fimi, depolama gibi geli\u015fmi\u015f \u00f6zelliklerle web uygulamalar\u0131n\u0131n s\u0131n\u0131rlar\u0131n\u0131 geni\u015fletir. Bu makalede, bu \u00fc\u00e7 temel bile\u015fenin nas\u0131l bir araya gelerek g\u00fc\u00e7l\u00fc ve modern web uygulamalar\u0131 olu\u015fturdu\u011fumuzu detayl\u0131ca inceleyece\u011fiz. Her bir kavram\u0131 ayr\u0131 ayr\u0131 ele alacak, basit \u00f6rneklerden karma\u015f\u0131k senaryolara do\u011fru ilerleyerek, siz de\u011ferli okuyucular\u0131n konuyu tam anlam\u0131yla kavramas\u0131n\u0131 sa\u011flayaca\u011f\u0131z. Unutmay\u0131n, etkile\u015fimli bir web deneyimi yaratmak, sadece estetik bir tercih de\u011fil, ayn\u0131 zamanda kullan\u0131c\u0131 memnuniyeti ve i\u015f ba\u015far\u0131s\u0131 i\u00e7in kritik bir gerekliliktir.<\/p>\n<div class=\"expert-tip\">Uzman \u0130pucu: \u0130yi bir kullan\u0131c\u0131 deneyimi (UX) sadece g\u00fczel g\u00f6r\u00fcnmekle ilgili de\u011fildir; ayn\u0131 zamanda web sitenizin veya uygulaman\u0131z\u0131n ne kadar h\u0131zl\u0131 ve sorunsuz \u00e7al\u0131\u015ft\u0131\u011f\u0131yla da do\u011frudan ba\u011flant\u0131l\u0131d\u0131r. DOM manip\u00fclasyonlar\u0131 ve olay dinleyicileri, performans\u0131 do\u011frudan etkileyebilir, bu y\u00fczden do\u011fru teknikleri \u00f6\u011frenmek kritik \u00f6neme sahiptir.<\/div>\n<h2>DOM Nedir ve Neden \u00d6nemlidir?<\/h2>\n<p>Document Object Model (DOM), bir HTML veya XML belgesinin yap\u0131sal g\u00f6sterimidir. Taray\u0131c\u0131, bir web sayfas\u0131n\u0131 y\u00fckledi\u011finde, sayfan\u0131n her bir \u00f6\u011fesini (ba\u015fl\u0131klar, paragraflar, resimler, ba\u011flant\u0131lar vb.) bir nesne olarak temsil eden bir &#8220;a\u011fa\u00e7&#8221; yap\u0131s\u0131 olu\u015fturur. Bu a\u011fa\u00e7 yap\u0131s\u0131na DOM a\u011fac\u0131 denir ve her bir \u00f6\u011fe, bu a\u011fa\u00e7taki bir d\u00fc\u011f\u00fcm\u00fc (node) temsil eder. DOM, JavaScript&#8217;in bu d\u00fc\u011f\u00fcmlere eri\u015fmesini, onlar\u0131 de\u011fi\u015ftirmesini, yenilerini olu\u015fturmas\u0131n\u0131 veya mevcut olanlar\u0131 silmesini sa\u011flayan bir aray\u00fczd\u00fcr. Ba\u015fka bir deyi\u015fle, JavaScript ile HTML ve CSS aras\u0131nda bir k\u00f6pr\u00fc g\u00f6revi g\u00f6r\u00fcr.<\/p>\n<p>DOM&#8217;un \u00f6nemini anlamak i\u00e7in, modern bir web sayfas\u0131n\u0131 d\u00fc\u015f\u00fcnelim. Bir butona t\u0131klad\u0131\u011f\u0131n\u0131zda a\u00e7\u0131lan bir men\u00fc, bir form dolduruldu\u011funda an\u0131nda beliren hata mesajlar\u0131, bir resim galerisinde foto\u011fraflar aras\u0131nda ge\u00e7i\u015f yapma veya bir sosyal medya g\u00f6nderisinin alt\u0131na yorum ekleme&#8230; T\u00fcm bu etkile\u015fimler, JavaScript&#8217;in DOM&#8217;u manip\u00fcle etmesi sayesinde ger\u00e7ekle\u015fir. DOM olmadan, web sayfalar\u0131 sadece statik metin ve g\u00f6rsellerden ibaret olurdu; kullan\u0131c\u0131lar ile hi\u00e7bir etkile\u015fim m\u00fcmk\u00fcn olmazd\u0131. Bu nedenle, web geli\u015ftiriciler i\u00e7in DOM&#8217;u anlamak, etkile\u015fimli ve dinamik uygulamalar olu\u015fturman\u0131n temelini olu\u015fturur. Taray\u0131c\u0131lar, HTML belgesini ayr\u0131\u015ft\u0131r\u0131rken (parse ederken) ad\u0131m ad\u0131m bu DOM a\u011fac\u0131n\u0131 in\u015fa eder. Her bir HTML etiketi bir element d\u00fc\u011f\u00fcm\u00fcne d\u00f6n\u00fc\u015f\u00fcr, metinler metin d\u00fc\u011f\u00fcmlerine d\u00f6n\u00fc\u015f\u00fcr ve nitelikler (attribute) nitelik d\u00fc\u011f\u00fcmlerine d\u00f6n\u00fc\u015f\u00fcr. Bu hiyerar\u015fik yap\u0131, JavaScript&#8217;in belirli bir \u00f6\u011feye (\u00f6rne\u011fin, bir <code><\/p>\n<div><\/code> veya bir <code><button><\/code>) do\u011frudan &#8220;i\u015faret etmesini&#8221; ve o \u00f6\u011fenin \u00f6zelliklerini (CSS stilini, i\u00e7eri\u011fini, niteliklerini) de\u011fi\u015ftirmesini sa\u011flar. Ayn\u0131 zamanda yeni \u00f6\u011feler olu\u015fturup bunlar\u0131 mevcut a\u011faca ekleyebilir, hatta var olan \u00f6\u011feleri tamamen kald\u0131rabiliriz. Bu sayede, sayfa yeniden y\u00fcklenmeden i\u00e7eri\u011fi dinamik olarak g\u00fcncelleyebiliriz, bu da Single Page Application (SPA) gibi modern web uygulama mimarilerinin temelini olu\u015fturur.<\/p>\n<p>DOM, sadece HTML elementlerini temsil etmekle kalmaz, ayn\u0131 zamanda bu elementlerin olaylar\u0131n\u0131 (event) da y\u00f6netir. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n bir butona t\u0131klamas\u0131, bir klavye tu\u015funa basmas\u0131 veya faresini bir elementin \u00fczerine getirmesi gibi eylemler, DOM taraf\u0131ndan alg\u0131lan\u0131r ve uygun JavaScript kodunun \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131na olanak tan\u0131r. Bu olay y\u00f6netimi mekanizmas\u0131, kullan\u0131c\u0131 deneyimini zenginle\u015ftiren interaktif \u00f6zelliklerin temelini olu\u015fturur. Bu derinlemesine anlay\u0131\u015f, sadece temel manip\u00fclasyonlar\u0131 de\u011fil, ayn\u0131 zamanda performans optimizasyonlar\u0131n\u0131 ve karma\u015f\u0131k etkile\u015fimleri de do\u011fru bir \u015fekilde uygulaman\u0131z\u0131 sa\u011flayacakt\u0131r. Dolay\u0131s\u0131yla, web geli\u015ftirme yolculu\u011funuzda DOM, en yak\u0131n dostlar\u0131n\u0131zdan biri olacakt\u0131r.<\/p>\n<h3>DOM&#8217;un Yap\u0131s\u0131: Belge A\u011fac\u0131n\u0131 Anlamak<\/h3>\n<p>DOM, bir web belgesini, k\u00f6k d\u00fc\u011f\u00fcmden (genellikle <code>document<\/code> nesnesi) ba\u015flayarak dallanan bir a\u011fa\u00e7 yap\u0131s\u0131 olarak temsil eder. Bu a\u011fa\u00e7taki her bir dal veya yaprak, bir &#8220;d\u00fc\u011f\u00fcm&#8221; (node) olarak adland\u0131r\u0131l\u0131r. En yayg\u0131n d\u00fc\u011f\u00fcm t\u00fcrleri \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>Belge D\u00fc\u011f\u00fcm\u00fc (Document Node):<\/strong> T\u00fcm DOM a\u011fac\u0131n\u0131n k\u00f6k\u00fcd\u00fcr. Sayfan\u0131n tamam\u0131n\u0131 temsil eder.<\/li>\n<li><strong>Element D\u00fc\u011f\u00fcm\u00fc (Element Node):<\/strong> HTML etiketlerini (<code>\n<div><\/code>, <code><\/p>\n<p><\/code>, <code><a><\/code> vb.) temsil eder. Bu d\u00fc\u011f\u00fcmlerin \u00e7ocuklar\u0131 olabilir.<\/li>\n<li><strong>Metin D\u00fc\u011f\u00fcm\u00fc (Text Node):<\/strong> HTML elementlerinin i\u00e7erisindeki metinleri temsil eder. \u00d6rne\u011fin, <code>\n<p>Merhaba D\u00fcnya<\/p>\n<p><\/code> i\u00e7indeki &#8220;Merhaba D\u00fcnya&#8221; bir metin d\u00fc\u011f\u00fcm\u00fcd\u00fcr.<\/li>\n<li><strong>Nitelik D\u00fc\u011f\u00fcm\u00fc (Attribute Node):<\/strong> HTML elementlerinin niteliklerini (<code>id<\/code>, <code>class<\/code>, <code>href<\/code> vb.) temsil eder.<\/li>\n<\/ul>\n<p>Bu hiyerar\u015fik yap\u0131 sayesinde, bir elementin ebeveynine, \u00e7ocuklar\u0131na veya karde\u015flerine kolayca eri\u015febiliriz. \u00d6rne\u011fin, bir <code><\/p>\n<div><\/code> elementinin t\u00fcm alt elementlerini se\u00e7ip \u00fczerlerinde i\u015flem yapabiliriz. Bu a\u011fa\u00e7 yap\u0131s\u0131, JavaScript&#8217;in sayfa \u00fczerindeki her bir bile\u015feni hedeflemesini ve manip\u00fcle etmesini sa\u011flayan g\u00fc\u00e7l\u00fc bir mekanizmad\u0131r. Geli\u015ftiriciler olarak, bu a\u011fa\u00e7 yap\u0131s\u0131n\u0131 zihnimizde canland\u0131rmak, hedefledi\u011fimiz elementlere do\u011fru yollarla ula\u015fmam\u0131z\u0131 ve bekledi\u011fimiz de\u011fi\u015fiklikleri yapmam\u0131z\u0131 sa\u011flar. Bir elementin <code>parentNode<\/code>, <code>children<\/code>, <code>nextElementSibling<\/code> gibi \u00f6zellikleri, bu a\u011fa\u00e7ta gezinmemizi sa\u011flayan temel ara\u00e7lard\u0131r. Her bir d\u00fc\u011f\u00fcm, kendi i\u00e7inde farkl\u0131 \u00f6zelliklere ve metotlara sahiptir, bu da bize geni\u015f bir manip\u00fclasyon yelpazesi sunar.<\/p>\n<h3>DOM Manip\u00fclasyonunun Temelleri: Elementlere Eri\u015fim ve De\u011fi\u015fiklik<\/h3>\n<p>JavaScript ile DOM \u00fczerinde i\u015flem yapabilmek i\u00e7in \u00f6ncelikle elementlere eri\u015fmemiz gerekir. Bunun i\u00e7in \u00e7e\u015fitli metotlar bulunur:<\/p>\n<ul>\n<li><strong><code>getElementById()<\/code>:<\/strong> Belirli bir <code>id<\/code> niteli\u011fine sahip elementi se\u00e7er. En h\u0131zl\u0131 ve en spesifik y\u00f6ntemdir.<\/li>\n<li><strong><code>getElementsByClassName()<\/code>:<\/strong> Belirli bir <code>class<\/code> niteli\u011fine sahip t\u00fcm elementleri bir HTML koleksiyonu olarak d\u00f6nd\u00fcr\u00fcr.<\/li>\n<li><strong><code>getElementsByTagName()<\/code>:<\/strong> Belirli bir etiket ad\u0131na sahip t\u00fcm elementleri d\u00f6nd\u00fcr\u00fcr.<\/li>\n<li><strong><code>querySelector()<\/code>:<\/strong> CSS se\u00e7ici kullanarak belirtilen kritere uyan ilk elementi d\u00f6nd\u00fcr\u00fcr.<\/li>\n<li><strong><code>querySelectorAll()<\/code>:<\/strong> CSS se\u00e7ici kullanarak belirtilen kritere uyan t\u00fcm elementleri bir NodeList olarak d\u00f6nd\u00fcr\u00fcr.<\/li>\n<\/ul>\n<p>Bir elemente eri\u015fim sa\u011flad\u0131ktan sonra, onu de\u011fi\u015ftirebiliriz. \u0130\u015fte baz\u0131 temel manip\u00fclasyon \u00f6rnekleri:<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ HTML'deki bir div elementine eri\u015fim\nconst myDiv = document.getElementById('myDiv');\n\n\/\/ \u0130\u00e7eri\u011fini de\u011fi\u015ftirme\nmyDiv.innerHTML = '<h3>Yeni Ba\u015fl\u0131k<\/h3><p>Bu i\u00e7erik JavaScript ile eklendi.<\/p>';\n\/\/ veya daha g\u00fcvenli bir \u015fekilde sadece metin i\u00e7eri\u011fi i\u00e7in:\n\/\/ myDiv.textContent = 'Sadece metin i\u00e7eri\u011fi.';\n\n\/\/ Stilini de\u011fi\u015ftirme\nmyDiv.style.backgroundColor = 'lightblue';\nmyDiv.style.color = 'darkblue';\n\n\/\/ Yeni bir element olu\u015fturma ve ekleme\nconst newParagraph = document.createElement('p');\nnewParagraph.textContent = 'Dynamik olarak olu\u015fturulan bir paragraf.';\nmyDiv.appendChild(newParagraph); \/\/ myDiv i\u00e7ine ekle\n\n\/\/ Bir class ekleme veya kald\u0131rma\nmyDiv.classList.add('active');\n\/\/ myDiv.classList.remove('active');\n\/\/ myDiv.classList.toggle('active'); \/\/ E\u011fer varsa kald\u0131r\u0131r, yoksa ekler.\n\n\/\/ Bir elementi kald\u0131rma\n\/\/ newParagraph.remove(); \/\/ ES6 sonras\u0131\n\/\/ myDiv.removeChild(newParagraph); \/\/ Daha eski y\u00f6ntem\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekler, JavaScript'in DOM \u00fczerindeki g\u00fcc\u00fcn\u00fc net bir \u015fekilde g\u00f6stermektedir. Bir web sayfas\u0131n\u0131n i\u00e7eri\u011fini, stilini ve yap\u0131s\u0131n\u0131 tamamen dinamik olarak kontrol edebiliriz. Bu da bize s\u0131n\u0131rs\u0131z tasar\u0131m ve etkile\u015fim olanaklar\u0131 sunar. Daha karma\u015f\u0131k senaryolarda, bu temel manip\u00fclasyonlar\u0131 bir araya getirerek \u00e7ok daha zengin kullan\u0131c\u0131 deneyimleri yaratmak m\u00fcmk\u00fcnd\u00fcr. \u00d6rne\u011fin, bir kullan\u0131c\u0131 bir butona t\u0131klad\u0131\u011f\u0131nda, yeni bir modal pencere a\u00e7abilir, i\u00e7indeki verileri dinamik olarak doldurabilir ve pencere kapat\u0131ld\u0131\u011f\u0131nda onu DOM'dan kald\u0131rabiliriz. Bu t\u00fcr i\u015flemler, modern web uygulamalar\u0131n\u0131n temelini olu\u015fturur ve geli\u015ftiricilerin, son kullan\u0131c\u0131ya ki\u015fiselle\u015ftirilmi\u015f ve ak\u0131c\u0131 bir deneyim sunmas\u0131na olanak tan\u0131r.<\/p>\n<h2>T\u0131klama Olaylar\u0131: Kullan\u0131c\u0131 Etkile\u015fimini Nas\u0131l Yakalar\u0131z?<\/h2>\n<p>Kullan\u0131c\u0131 etkile\u015fiminin en temel bi\u00e7imlerinden biri, bir elemente t\u0131klamakt\u0131r. T\u0131klama olaylar\u0131, web sayfalar\u0131n\u0131z\u0131n dinamik ve responsif olmas\u0131n\u0131 sa\u011flamak i\u00e7in vazge\u00e7ilmezdir. JavaScript, DOM elementleri \u00fczerindeki bu t\u00fcr olaylar\u0131 dinlemek ve bunlara yan\u0131t vermek i\u00e7in g\u00fc\u00e7l\u00fc bir mekanizma sunar.<\/p>\n<h3><code>addEventListener<\/code> ile Olay Dinleme: Basit Bir Uygulama<\/h3>\n<p>Bir elementin t\u0131klama olay\u0131n\u0131 yakalamak i\u00e7in en modern ve \u00f6nerilen y\u00f6ntem <code>addEventListener()<\/code> metodunu kullanmakt\u0131r. Bu metot, bir elemente belirli bir olay t\u00fcr\u00fc (\u00f6rne\u011fin, 'click') meydana geldi\u011finde \u00e7al\u0131\u015facak bir fonksiyon (olay i\u015fleyici - event handler) ataman\u0131z\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ HTML'de id'si 'myButton' olan bir buton oldu\u011funu varsayal\u0131m\nconst myButton = document.getElementById('myButton');\n\n\/\/ Butona t\u0131klama olay\u0131 dinleyicisi ekleyelim\nmyButton.addEventListener('click', function() {\n    alert('Butona t\u0131klad\u0131n\u0131z!');\n    \/\/ T\u0131klama sonras\u0131 ba\u015fka DOM manip\u00fclasyonlar\u0131 da yapabiliriz\n    const messageDiv = document.getElementById('messageArea');\n    if (messageDiv) {\n        messageDiv.textContent = 'Te\u015fekk\u00fcrler, i\u015fleminiz ba\u015far\u0131yla kaydedildi.';\n        messageDiv.style.color = 'green';\n    }\n});\n<\/pre>\n<p><\/code><\/p>\n<p><code>addEventListener()<\/code> metodunun avantajlar\u0131 \u015funlard\u0131r:<\/p>\n<ul>\n<li>Bir elemente birden fazla olay i\u015fleyici ekleyebilirsiniz (\u00f6rne\u011fin, hem t\u0131klama hem de mouse \u00fczerine gelme olaylar\u0131 i\u00e7in).<\/li>\n<li>Olaylar\u0131 \"yakalama\" (capturing) veya \"kabarc\u0131kland\u0131rma\" (bubbling) a\u015famalar\u0131nda dinleyebilirsiniz (\u00fc\u00e7\u00fcnc\u00fc parametre ile kontrol edilir, varsay\u0131lan olarak bubbling'dir).<\/li>\n<li>Olay i\u015fleyicilerini <code>removeEventListener()<\/code> ile kolayca kald\u0131rabilirsiniz.<\/li>\n<\/ul>\n<p>Bu esneklik, \u00f6zellikle karma\u015f\u0131k etkile\u015fimler ve performans optimizasyonu gerektiren durumlarda \u00e7ok \u00f6nemlidir. Ayr\u0131ca, tek bir olay i\u015fleyici i\u00e7inde birden fazla i\u015flemi tetikleyerek kodunuzu daha d\u00fczenli ve y\u00f6netilebilir hale getirebilirsiniz. Bir butona t\u0131kland\u0131\u011f\u0131nda sadece bir mesaj g\u00f6stermekle kalmay\u0131p, bir formun g\u00f6nderilmesini sa\u011flayabilir, bir animasyonu ba\u015flatabilir veya sunucuya bir veri iste\u011fi g\u00f6nderebilirsiniz. <code>addEventListener<\/code> sayesinde, bu t\u00fcr karma\u015f\u0131k i\u015f ak\u0131\u015flar\u0131n\u0131 sorunsuz bir \u015fekilde y\u00f6netmek m\u00fcmk\u00fcn hale gelir.<\/p>\n<h3>Olay Nesnesi (Event Object) ve Faydalar\u0131: Etkile\u015fimi Derinlemesine Anlamak<\/h3>\n<p>Bir olay meydana geldi\u011finde, olay i\u015fleyici fonksiyonuna otomatik olarak bir \"olay nesnesi\" (event object) parametre olarak iletilir. Bu nesne, olay hakk\u0131nda \u00e7ok de\u011ferli bilgiler i\u00e7erir ve bize olayla ilgili daha spesifik i\u015flemler yapma imkan\u0131 sunar.<\/p>\n<pre><code class=\"language-javascript\">\nconst myLink = document.getElementById('myLink');\n\nmyLink.addEventListener('click', function(event) {\n    \/\/ Varsay\u0131lan davran\u0131\u015f\u0131 engelle (\u00f6rne\u011fin, linkin yeni sayfaya gitmesini engelle)\n    event.preventDefault(); \n\n    console.log('T\u0131klanan element:', event.target); \/\/ T\u0131klanan HTML elementini verir\n    console.log('Olay t\u00fcr\u00fc:', event.type); \/\/ \"click\"\n    console.log('Fare X koordinat\u0131:', event.clientX);\n    console.log('Fare Y koordinat\u0131:', event.clientY);\n\n    \/\/ Ba\u015fka bir elementin i\u00e7eri\u011fini g\u00fcncelle\n    document.getElementById('status').textContent = <code>Linke t\u0131kland\u0131! Koordinatlar: (${event.clientX}, ${event.clientY})<\/code>;\n});\n<\/pre>\n<p><\/code><\/p>\n<p>Olay nesnesinin yayg\u0131n kullan\u0131lan \u00f6zellikleri ve metotlar\u0131:<\/p>\n<ul>\n<li><strong><code>event.target<\/code>:<\/strong> Olay\u0131 tetikleyen DOM elementini d\u00f6nd\u00fcr\u00fcr.<\/li>\n<li><strong><code>event.currentTarget<\/code>:<\/strong> Olay dinleyicisinin ba\u011fl\u0131 oldu\u011fu elementi d\u00f6nd\u00fcr\u00fcr. (Event bubbling'de fark yarat\u0131r)<\/li>\n<li><strong><code>event.type<\/code>:<\/strong> Olay\u0131n t\u00fcr\u00fcn\u00fc d\u00f6nd\u00fcr\u00fcr (\u00f6rne\u011fin, 'click', 'mouseover', 'submit').<\/li>\n<li><strong><code>event.preventDefault()<\/code>:<\/strong> Olay\u0131n varsay\u0131lan eylemini engeller. \u00d6rne\u011fin, bir formun g\u00f6nderilmesini veya bir ba\u011flant\u0131n\u0131n yeni bir sayfaya y\u00f6nlendirmesini engelleyebilir.<\/li>\n<li><strong><code>event.stopPropagation()<\/code>:<\/strong> Olay\u0131n DOM a\u011fac\u0131nda yukar\u0131 do\u011fru \"kabarc\u0131kland\u0131rmas\u0131n\u0131\" (bubbling) durdurur. Bu, i\u00e7 i\u00e7e elementlerde istenmeyen olay tetiklemelerini \u00f6nlemek i\u00e7in kullan\u0131\u015fl\u0131d\u0131r.<\/li>\n<\/ul>\n<p><code>event<\/code> nesnesi, kullan\u0131c\u0131 etkile\u015fimini anlamak ve ona daha ak\u0131ll\u0131ca yan\u0131t vermek i\u00e7in g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r. \u00d6zellikle form do\u011frulamalar\u0131, s\u00fcr\u00fckle-b\u0131rak i\u015flevleri veya karma\u015f\u0131k aray\u00fcz elementleri geli\u015ftirirken bu nesnenin sundu\u011fu bilgiler hayati \u00f6nem ta\u015f\u0131r. Bu nesneyi etkin bir \u015fekilde kullanmak, kullan\u0131c\u0131 etkile\u015fimlerini daha hassas bir \u015fekilde kontrol etmenizi ve daha zengin uygulamalar geli\u015ftirmenizi sa\u011flar.<\/p>\n<h2>Web API'leri ile G\u00fcc\u00fc Art\u0131rma: Taray\u0131c\u0131n\u0131n Gizli Yetenekleri Nelerdir?<\/h2>\n<p>Taray\u0131c\u0131lar, sadece HTML, CSS ve JavaScript \u00e7al\u0131\u015ft\u0131rmakla kalmaz; ayn\u0131 zamanda geli\u015ftiricilere \u00e7ok \u00e7e\u015fitli \"Web API'leri\" (Application Programming Interfaces) arac\u0131l\u0131\u011f\u0131yla zengin i\u015flevsellik sunar. Bu API'leri kullanarak konum bilgisi, kamera eri\u015fimi, depolama, bildirimler ve daha bir\u00e7ok taray\u0131c\u0131 \u00f6zelli\u011fine JavaScript arac\u0131l\u0131\u011f\u0131yla eri\u015febiliriz. Web API'leri, web uygulamalar\u0131n\u0131n yeteneklerini geleneksel masa\u00fcst\u00fc uygulamalar\u0131 seviyesine yakla\u015ft\u0131ran, modern web geli\u015ftirmenin temel ta\u015flar\u0131ndan biridir.<\/p>\n<h3>Fetch API ile Veri \u00c7ekme: Harici Kaynaklar\u0131 Uygulamaya Entegre Etme<\/h3>\n<p>Web uygulamalar\u0131n\u0131n \u00e7o\u011funda, dinamik i\u00e7erik sa\u011flamak i\u00e7in sunuculardan veri \u00e7ekmemiz gerekir. Eskiden AJAX (Asynchronous JavaScript and XML) ve <code>XMLHttpRequest<\/code> nesnesi bu i\u015f i\u00e7in kullan\u0131l\u0131rd\u0131. Ancak g\u00fcn\u00fcm\u00fczde, daha modern ve esnek bir y\u00f6ntem olan Fetch API tercih edilmektedir. Fetch API, a\u011f istekleri yapmak i\u00e7in Promise tabanl\u0131 bir aray\u00fcz sa\u011flar, bu da asenkron veri i\u015flemlerini \u00e7ok daha okunabilir ve y\u00f6netilebilir hale getirir.<\/p>\n<pre><code class=\"language-javascript\">\nconst dataContainer = document.getElementById('data-container');\nconst fetchButton = document.getElementById('fetch-data-button');\n\nfetchButton.addEventListener('click', () => {\n    \/\/ Bir JSON Placeholder API'den g\u00f6nderi verilerini \u00e7ekelim\n    fetch('https:\/\/jsonplaceholder.typicode.com\/posts\/1')\n        .then(response => {\n            \/\/ Yan\u0131t\u0131n ba\u015far\u0131l\u0131 olup olmad\u0131\u011f\u0131n\u0131 kontrol et\n            if (!response.ok) {\n                throw new Error(<code>HTTP hata! Durum: ${response.status}<\/code>);\n            }\n            return response.json(); \/\/ Yan\u0131t\u0131 JSON olarak ayr\u0131\u015ft\u0131r\n        })\n        .then(data => {\n            \/\/ Gelen veriyi DOM'a yans\u0131t\n            dataContainer.innerHTML = <code><h3>Ba\u015fl\u0131k: ${data.title}<\/h3>\n                <p>\u0130\u00e7erik: ${data.body}<\/p><\/code>;\n            dataContainer.style.backgroundColor = '#e6ffe6';\n            dataContainer.style.border = '1px solid green';\n            dataContainer.style.padding = '15px';\n            dataContainer.style.marginTop = '10px';\n        })\n        .catch(error => {\n            \/\/ Hata durumunda konsola yazd\u0131r veya kullan\u0131c\u0131ya g\u00f6ster\n            console.error('Veri \u00e7ekme hatas\u0131:', error);\n            dataContainer.innerHTML = <code><p style=\"color: red;\">Veri y\u00fcklenirken bir hata olu\u015ftu: ${error.message}<\/p><\/code>;\n        });\n});\n<\/pre>\n<p><\/code><\/p>\n<p>Fetch API ile sadece <code>GET<\/code> istekleri yapmakla kalmaz, ayn\u0131 zamanda <code>POST<\/code>, <code>PUT<\/code>, <code>DELETE<\/code> gibi di\u011fer HTTP metotlar\u0131yla sunucuya veri g\u00f6nderebilirsiniz. Bu, kullan\u0131c\u0131lar\u0131n veri girebildi\u011fi, g\u00fcncelleyebildi\u011fi veya silebildi\u011fi dinamik uygulamalar geli\u015ftirmek i\u00e7in kritik \u00f6neme sahiptir. Fetch API, modern web uygulamalar\u0131nda veri ak\u0131\u015f\u0131n\u0131 y\u00f6netmek i\u00e7in en \u00e7ok kullan\u0131lan ve en g\u00fc\u00e7l\u00fc Web API'lerinden biridir. Asenkron yap\u0131s\u0131 sayesinde, veri \u00e7ekme i\u015flemleri kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fc (UI) bloklamaz, b\u00f6ylece kullan\u0131c\u0131lar verilerin y\u00fcklenmesini beklerken bile sayfayla etkile\u015fime devam edebilirler. Bu da daha ak\u0131c\u0131 ve tepkisel bir kullan\u0131c\u0131 deneyimi sa\u011flar.<\/p>\n<h3>Geolocation API ile Konum Servisleri: Kullan\u0131c\u0131 Deneyimini Zenginle\u015ftirme<\/h3>\n<p>Web API'lerinin bir ba\u015fka harika \u00f6rne\u011fi de Geolocation API'dir. Bu API, kullan\u0131c\u0131n\u0131n izniyle taray\u0131c\u0131n\u0131n co\u011frafi konum bilgilerine (enlem, boylam) eri\u015fmemizi sa\u011flar. Bu \u00f6zellik, harita uygulamalar\u0131, yerel i\u015fletme bulucular veya hava durumu uygulamalar\u0131 gibi konuma dayal\u0131 servisler geli\u015ftirmek i\u00e7in paha bi\u00e7ilmezdir.<\/p>\n<pre><code class=\"language-javascript\">\nconst locationInfo = document.getElementById('location-info');\nconst getLocationButton = document.getElementById('get-location-button');\n\ngetLocationButton.addEventListener('click', () => {\n    if ('geolocation' in navigator) {\n        \/\/ Co\u011frafi konum API'si destekleniyor\n        locationInfo.textContent = 'Konum al\u0131n\u0131yor...';\n        navigator.geolocation.getCurrentPosition(\n            (position) => {\n                \/\/ Ba\u015far\u0131l\u0131 olursa\n                const latitude = position.coords.latitude;\n                const longitude = position.coords.longitude;\n                locationInfo.innerHTML = <code><p>Enlem: <strong>${latitude}<\/strong><\/p>\n                    <p>Boylam: <strong>${longitude}<\/strong><\/p>\n                    <p>Bu konum bilgileri, harita uygulamalar\u0131nda veya yerel hizmetleri bulmak i\u00e7in kullan\u0131labilir.<\/p><\/code>;\n                locationInfo.style.backgroundColor = '#e6f7ff';\n                locationInfo.style.border = '1px solid #3399ff';\n                locationInfo.style.padding = '15px';\n                locationInfo.style.marginTop = '10px';\n            },\n            (error) => {\n                \/\/ Hata olursa\n                let errorMessage;\n                switch (error.code) {\n                    case error.PERMISSION_DENIED:\n                        errorMessage = 'Kullan\u0131c\u0131 konum iznini reddetti.';\n                        break;\n                    case error.POSITION_UNAVAILABLE:\n                        errorMessage = 'Konum bilgisi mevcut de\u011fil.';\n                        break;\n                    case error.TIMEOUT:\n                        errorMessage = 'Konum iste\u011fi zaman a\u015f\u0131m\u0131na u\u011frad\u0131.';\n                        break;\n                    default:\n                        errorMessage = 'Bilinmeyen bir hata olu\u015ftu.';\n                        break;\n                }\n                locationInfo.innerHTML = <code><p style=\"color: red;\">Konum al\u0131namad\u0131: ${errorMessage}<\/p><\/code>;\n                console.error('Konum hatas\u0131:', error);\n            },\n            {\n                enableHighAccuracy: true, \/\/ Daha y\u00fcksek do\u011fruluk iste\n                timeout: 5000,           \/\/ 5 saniye i\u00e7inde yan\u0131t bekle\n                maximumAge: 0            \/\/ \u00d6nbelle\u011fe al\u0131nm\u0131\u015f konum kullanma\n            }\n        );\n    } else {\n        \/\/ Taray\u0131c\u0131 desteklemiyor\n        locationInfo.innerHTML = '<p style=\"color: red;\">Taray\u0131c\u0131n\u0131z co\u011frafi konum API\\'sini desteklemiyor.<\/p>';\n    }\n});\n<\/pre>\n<p><\/code><\/p>\n<p>Geolocation API, kullan\u0131c\u0131 gizlili\u011fi a\u00e7\u0131s\u0131ndan \u00f6nemlidir ve bu nedenle kullan\u0131c\u0131n\u0131n a\u00e7\u0131k r\u0131zas\u0131n\u0131 gerektirir. Kullan\u0131c\u0131 izin vermedi\u011fi s\u00fcrece konum bilgisine eri\u015filemez. Bu API'nin sundu\u011fu olanaklar, web uygulamalar\u0131n\u0131 masa\u00fcst\u00fc ve mobil uygulamalarla rekabet edebilir hale getiren \u00f6nemli bir fakt\u00f6rd\u00fcr. Haritalar \u00fczerinde i\u015faret\u00e7iler g\u00f6stermek, belirli bir konuma yak\u0131n etkinlikleri listelemek veya hatta art\u0131r\u0131lm\u0131\u015f ger\u00e7eklik (AR) deneyimleri i\u00e7in temel verileri sa\u011flamak gibi bir\u00e7ok senaryoda kullan\u0131labilir. Taray\u0131c\u0131lar\u0131n sundu\u011fu bu t\u00fcr API'ler, web geli\u015ftirmenin gelece\u011finde merkezi bir rol oynamaya devam edecektir.<\/p>\n<div class=\"expert-tip\">Uzman \u0130pucu: Web API'lerini kullan\u0131rken her zaman hata denetimi (error handling) yapmaya \u00f6zen g\u00f6sterin. Kullan\u0131c\u0131 izinleri, a\u011f ba\u011flant\u0131s\u0131 sorunlar\u0131 veya API'nin taray\u0131c\u0131 deste\u011fi gibi fakt\u00f6rler, uygulaman\u0131z\u0131n beklenmedik \u015fekillerde davranmas\u0131na neden olabilir. G\u00fc\u00e7l\u00fc <code>try...catch<\/code> bloklar\u0131 ve <code>if ('API_ad\u0131' in navigator)<\/code> gibi kontrollerle uygulaman\u0131z\u0131 daha sa\u011flam hale getirebilirsiniz.<\/div>\n<h2>Geli\u015fmi\u015f Teknikler ve Performans: Daha Verimli Etkile\u015fimler \u0130\u00e7in \u0130pu\u00e7lar\u0131<\/h2>\n<p>B\u00fcy\u00fck ve karma\u015f\u0131k web uygulamalar\u0131nda, temel DOM manip\u00fclasyonlar\u0131 ve olay dinleyicileri performans sorunlar\u0131na yol a\u00e7abilir. Bu nedenle, daha verimli ve optimize edilmi\u015f etkile\u015fimler sa\u011flamak i\u00e7in baz\u0131 ileri d\u00fczey teknikleri bilmek \u00f6nemlidir.<\/p>\n<h3>Event Delegation: Performans Optimizasyonu \u0130\u00e7in Kritik Bir Yakla\u015f\u0131m<\/h3>\n<p>Bir listedeki her bir \u00f6\u011feye ayr\u0131 ayr\u0131 t\u0131klama olay\u0131 dinleyicisi eklemek yerine, bu \u00f6\u011felerin ortak ebeveynine tek bir olay dinleyicisi ekleyerek performans\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabiliriz. Bu tekni\u011fe \"Event Delegation\" (Olay Delegasyonu) denir. Olaylar, DOM a\u011fac\u0131nda yukar\u0131 do\u011fru \"kabarc\u0131klan\u0131r\" (bubbling). Yani, bir alt elementte bir olay tetiklendi\u011finde, bu olay ebeveyn elementlerine do\u011fru yay\u0131l\u0131r. Event Delegation, bu kabarc\u0131klanma \u00f6zelli\u011finden yararlanarak, tek bir olay dinleyicisi ile bir\u00e7ok alt elementi y\u00f6netmemizi sa\u011flar.<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ HTML'de id'si 'myList' olan bir ul listesi oldu\u011funu varsayal\u0131m\nconst myList = document.getElementById('myList');\n\n\/\/ Her bir li elementine tek tek dinleyici eklemek yerine, ul elementine ekleyelim\nmyList.addEventListener('click', function(event) {\n    \/\/ T\u0131klanan elementin bir li elementi olup olmad\u0131\u011f\u0131n\u0131 kontrol et\n    if (event.target.tagName === 'LI') {\n        const clickedItem = event.target;\n        alert(<code>T\u0131klad\u0131\u011f\u0131n\u0131z liste \u00f6\u011fesi: ${clickedItem.textContent}<\/code>);\n        clickedItem.style.backgroundColor = '#f0f8ff'; \/\/ T\u0131klanan \u00f6\u011fenin rengini de\u011fi\u015ftir\n        clickedItem.style.fontWeight = 'bold';\n    }\n});\n<\/pre>\n<p><\/code><\/p>\n<p>Bu yakla\u015f\u0131m\u0131n faydalar\u0131:<\/p>\n<ul>\n<li><strong>Bellek Tasarrufu:<\/strong> Y\u00fczlerce veya binlerce \u00f6\u011feye ayr\u0131 ayr\u0131 olay dinleyicileri eklemek yerine, sadece bir tane ekleyerek bellek kullan\u0131m\u0131n\u0131 azalt\u0131r\u0131z.<\/li>\n<li><strong>Dinamik \u0130\u00e7erik Y\u00f6netimi:<\/strong> Listeye yeni \u00f6\u011feler eklendi\u011finde veya mevcutlar kald\u0131r\u0131ld\u0131\u011f\u0131nda, yeni olay dinleyicileri eklemeye veya mevcutlar\u0131 kald\u0131rmaya gerek kalmaz. Ebeveyn element \u00fczerindeki tek dinleyici, yeni \u00f6\u011feler i\u00e7in de \u00e7al\u0131\u015f\u0131r.<\/li>\n<li><strong>Performans Art\u0131\u015f\u0131:<\/strong> Daha az olay dinleyici, sayfa y\u00fckleme s\u00fcresini ve \u00e7al\u0131\u015fma zaman\u0131 performans\u0131n\u0131 iyile\u015ftirir.<\/li>\n<\/ul>\n<p>Event Delegation, \u00f6zellikle dinamik olarak de\u011fi\u015fen listeler, tablolar veya men\u00fcler gibi bile\u015fenlerde \u00e7ok g\u00fc\u00e7l\u00fc bir tekniktir. Bu y\u00f6ntem, uygulaman\u0131z\u0131n daha az kaynak t\u00fcketmesini ve daha ak\u0131c\u0131 \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flayarak genel kullan\u0131c\u0131 deneyimini art\u0131r\u0131r.<\/p>\n<h3>Mobil Uyumlu Tasar\u0131m ve Etkile\u015fim: Her Cihazda Kusursuz Deneyim<\/h3>\n<p>G\u00fcn\u00fcm\u00fczde kullan\u0131c\u0131lar\u0131n b\u00fcy\u00fck bir k\u0131sm\u0131 web sitelerine mobil cihazlardan eri\u015fiyor. Bu nedenle, web uygulamalar\u0131m\u0131z\u0131n mobil uyumlu (responsive) olmas\u0131 ve farkl\u0131 ekran boyutlar\u0131nda do\u011fru \u015fekilde \u00e7al\u0131\u015fmas\u0131 kritik \u00f6neme sahiptir. DOM, t\u0131klama olaylar\u0131 ve Web API'leri mobil cihazlarda da ayn\u0131 prensiplerle \u00e7al\u0131\u015f\u0131r, ancak baz\u0131 ek noktalar\u0131 g\u00f6z \u00f6n\u00fcnde bulundurmak gerekir:<\/p>\n<ol>\n<li><strong>Dokunmatik Olaylar:<\/strong> Mobil cihazlarda \"click\" olay\u0131n\u0131n yan\u0131 s\u0131ra \"touchstart\", \"touchmove\", \"touchend\" gibi dokunmatik olaylar\u0131 da kullanmak gerekebilir. Bu olaylar, daha hassas dokunmatik etkile\u015fimler sa\u011flamak i\u00e7in faydal\u0131d\u0131r.<\/li>\n<li><strong>Performans:<\/strong> Mobil cihazlar\u0131n i\u015flem g\u00fcc\u00fc ve a\u011f ba\u011flant\u0131s\u0131 masa\u00fcst\u00fc cihazlara g\u00f6re daha k\u0131s\u0131tl\u0131 olabilir. B\u00fcy\u00fck DOM manip\u00fclasyonlar\u0131ndan veya yo\u011fun API \u00e7a\u011fr\u0131lar\u0131ndan ka\u00e7\u0131nmak, mobil performans\u0131 art\u0131racakt\u0131r. Animasyonlar\u0131 ve ge\u00e7i\u015fleri CSS ile y\u00f6netmek genellikle JavaScript ile y\u00f6netmekten daha performansl\u0131d\u0131r.<\/li>\n<li><strong>Duyarl\u0131 Tasar\u0131m (Responsive Design):<\/strong> CSS media query'leri kullanarak farkl\u0131 ekran boyutlar\u0131na g\u00f6re stil ve hatta DOM yap\u0131s\u0131n\u0131 de\u011fi\u015ftirebiliriz. \u00d6rne\u011fin, k\u00fc\u00e7\u00fck ekranlarda men\u00fcleri gizleyip bir \"hamburger men\u00fc\" ikonu ile a\u00e7\u0131lmalar\u0131n\u0131 sa\u011flayabiliriz.<\/li>\n<\/ol>\n<pre><code class=\"language-css\">\n\/* CSS dosyas\u0131nda veya <style> etiketi i\u00e7inde *\/\n.mobile-menu {\n    display: none; \/* Varsay\u0131lan olarak men\u00fcy\u00fc gizle *\/\n}\n\n@media (max-width: 768px) {\n    \/* Ekran geni\u015fli\u011fi 768px'ten k\u00fc\u00e7\u00fckse *\/\n    .desktop-menu {\n        display: none; \/* Masa\u00fcst\u00fc men\u00fcs\u00fcn\u00fc gizle *\/\n    }\n    .mobile-menu {\n        display: block; \/* Mobil men\u00fcy\u00fc g\u00f6ster *\/\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<pre><code class=\"language-javascript\"><\/pre>\n<p><\/code><br \/>\n\/\/ JavaScript ile mobil men\u00fc a\u00e7ma\/kapama<br \/>\nconst mobileMenuButton = document.getElementById('mobile-menu-button');<br \/>\nconst mobileNav = document.getElementById('mobile-nav');<\/p>\n<p>if (mobileMenuButton && mobileNav) {<br \/>\n    mobileMenuButton.addEventListener('click', () => {<br \/>\n        mobileNav.classList.toggle('is-active'); \/\/ CSS ile men\u00fcy\u00fc a\u00e7\u0131p kapatan bir class ekle\/kald\u0131r<br \/>\n    });<br \/>\n}<br \/>\n<\/code><\/p>\n<p>Mobil uyumluluk, sadece sitenizin iyi g\u00f6r\u00fcnmesini sa\u011flamakla kalmaz, ayn\u0131 zamanda Google gibi arama motorlar\u0131 i\u00e7in de \u00f6nemli bir s\u0131ralama fakt\u00f6r\u00fcd\u00fcr. Kullan\u0131c\u0131lar\u0131n herhangi bir cihazda sorunsuz bir deneyim ya\u015famas\u0131n\u0131 sa\u011flamak, modern web geli\u015ftiricili\u011finin ayr\u0131lmaz bir par\u00e7as\u0131d\u0131r. Bu ba\u011flamda, DOM ve olay y\u00f6netimi yeteneklerini mobil \u00f6ncelikli bir yakla\u015f\u0131mla ele almak, daha ba\u015far\u0131l\u0131 uygulamalar geli\u015ftirmenize yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<h2>Vaka Analizi: E-ticaret Sitesinde Dinamik Sepet Uygulamas\u0131<\/h2>\n<p>\u015eimdiye kadar \u00f6\u011frendiklerimizi ger\u00e7ek bir d\u00fcnya senaryosunda uygulayal\u0131m: bir e-ticaret sitesinde dinamik bir al\u0131\u015fveri\u015f sepeti. Kullan\u0131c\u0131lar \u00fcr\u00fcnleri sepete ekleyebilir, miktar\u0131n\u0131 de\u011fi\u015ftirebilir ve sepeti g\u00fcncelleyebilir.<\/p>\n<p><strong>Senaryo:<\/strong> Bir \u00fcr\u00fcn listesi var. Her \u00fcr\u00fcn\u00fcn yan\u0131nda \"Sepete Ekle\" butonu bulunuyor. Butona t\u0131kland\u0131\u011f\u0131nda, \u00fcr\u00fcn sepete ekleniyor ve sayfa yenilenmeden sepet toplam\u0131 g\u00fcncelleniyor. Ayr\u0131ca, sepetteki \u00fcr\u00fcnlerin miktar\u0131n\u0131 de\u011fi\u015ftirebilen veya \u00fcr\u00fcn\u00fc kald\u0131rabilen bir aray\u00fcz olmal\u0131.<\/p>\n<h3>HTML Yap\u0131s\u0131 (Basit Bir \u00d6rnek)<\/h3>\n<pre><code class=\"language-html\">\n<div class=\"product-list\" id=\"productList\">\n    <div class=\"product-item\" data-id=\"1\" data-name=\"Kablosuz Kulakl\u0131k\" data-price=\"120\">\n        <h3>Kablosuz Kulakl\u0131k<\/h3<\n        <p>Fiyat: <span>120 TL<\/span><\/p>\n        <button class=\"add-to-cart\">Sepete Ekle<\/button>\n    <\/div>\n    <div class=\"product-item\" data-id=\"2\" data-name=\"Ak\u0131ll\u0131 Saat\" data-price=\"250\">\n        <h3>Ak\u0131ll\u0131 Saat<\/h3>\n        <p>Fiyat: <span>250 TL<\/span><\/p>\n        <button class=\"add-to-cart\">Sepete Ekle<\/button>\n    <\/div>\n<\/div>\n\n<div class=\"cart-section\">\n    <h2>Al\u0131\u015fveri\u015f Sepeti<\/h2>\n    <ul id=\"cartItems\">\n        <!-- Sepet \u00f6\u011feleri buraya eklenecek -->\n    <\/ul>\n    <p>Toplam: <strong id=\"cartTotal\">0 TL<\/strong><\/p>\n    <button id=\"checkoutButton\">\u00d6deme Yap<\/button>\n<\/div>\n<\/pre>\n<p><\/code><\/p>\n<h3>JavaScript Mant\u0131\u011f\u0131<\/h3>\n<pre><code class=\"language-javascript\">\nlet cart = []; \/\/ Sepet durumu i\u00e7in bo\u015f bir dizi\n\nconst productList = document.getElementById('productList');\nconst cartItemsContainer = document.getElementById('cartItems');\nconst cartTotalElement = document.getElementById('cartTotal');\nconst checkoutButton = document.getElementById('checkoutButton');\n\n\/\/ Sepet toplam\u0131n\u0131 ve g\u00f6r\u00fcn\u00fcm\u00fcn\u00fc g\u00fcncelleyen fonksiyon\nfunction updateCartDisplay() {\n    cartItemsContainer.innerHTML = ''; \/\/ Sepet listesini temizle\n    let total = 0;\n\n    if (cart.length === 0) {\n        cartItemsContainer.innerHTML = '<li>Sepetinizde \u00fcr\u00fcn bulunmamaktad\u0131r.<\/li>';\n    } else {\n        cart.forEach(item => {\n            const listItem = document.createElement('li');\n            listItem.innerHTML = <code>${item.name} - ${item.price} TL x \n                <input type=\"number\" value=\"${item.quantity}\" min=\"1\" data-id=\"${item.id}\" class=\"item-quantity\">\n                <button class=\"remove-item\" data-id=\"${item.id}\">Kald\u0131r<\/button><\/code>;\n            cartItemsContainer.appendChild(listItem);\n            total += item.price * item.quantity;\n        });\n    }\n\n    cartTotalElement.textContent = <code>${total} TL<\/code>;\n}\n\n\/\/ \u00dcr\u00fcnleri sepete ekleme olay\u0131 (Event Delegation kullanarak)\nproductList.addEventListener('click', function(event) {\n    if (event.target.classList.contains('add-to-cart')) {\n        const productItem = event.target.closest('.product-item');\n        const productId = productItem.dataset.id;\n        const productName = productItem.dataset.name;\n        const productPrice = parseFloat(productItem.dataset.price);\n\n        const existingItem = cart.find(item => item.id === productId);\n\n        if (existingItem) {\n            existingItem.quantity++;\n        } else {\n            cart.push({\n                id: productId,\n                name: productName,\n                price: productPrice,\n                quantity: 1\n            });\n        }\n        updateCartDisplay(); \/\/ Sepeti ve toplam\u0131 g\u00fcncelle\n        alert(<code>${productName} sepete eklendi!<\/code>);\n    }\n});\n\n\/\/ Sepetteki \u00fcr\u00fcn miktar\u0131n\u0131 de\u011fi\u015ftirme veya kald\u0131rma (Event Delegation kullanarak)\ncartItemsContainer.addEventListener('click', function(event) {\n    if (event.target.classList.contains('remove-item')) {\n        const itemIdToRemove = event.target.dataset.id;\n        cart = cart.filter(item => item.id !== itemIdToRemove);\n        updateCartDisplay();\n    }\n});\n\ncartItemsContainer.addEventListener('change', function(event) {\n    if (event.target.classList.contains('item-quantity')) {\n        const itemIdToUpdate = event.target.dataset.id;\n        const newQuantity = parseInt(event.target.value);\n\n        const itemToUpdate = cart.find(item => item.id === itemIdToUpdate);\n        if (itemToUpdate) {\n            itemToUpdate.quantity = newQuantity;\n            updateCartDisplay();\n        }\n    }\n});\n\n\/\/ \u00d6deme butonuna t\u0131klama olay\u0131\ncheckoutButton.addEventListener('click', function() {\n    if (cart.length > 0) {\n        alert(<code>Toplam ${cartTotalElement.textContent} tutar\u0131ndaki sipari\u015finiz al\u0131nm\u0131\u015ft\u0131r!<\/code>);\n        \/\/ Ger\u00e7ek bir uygulamada burada Fetch API ile sunucuya sipari\u015f bilgisi g\u00f6nderilirdi.\n        console.log('Sepet i\u00e7eri\u011fi g\u00f6nderiliyor:', cart);\n        cart = []; \/\/ Sepeti bo\u015falt\n        updateCartDisplay();\n    } else {\n        alert('Sepetiniz bo\u015f. L\u00fctfen \u00f6nce \u00fcr\u00fcn ekleyin.');\n    }\n});\n\n\/\/ Sayfa y\u00fcklendi\u011finde sepeti g\u00f6ster\ndocument.addEventListener('DOMContentLoaded', updateCartDisplay);\n<\/pre>\n<p><\/code><\/p>\n<p>Bu vaka analizinde:<\/p>\n<ul>\n<li>\u00dcr\u00fcn listesi ve sepet \u00f6\u011feleri i\u00e7in DOM manip\u00fclasyonlar\u0131 kulland\u0131k (<code>innerHTML<\/code>, <code>createElement<\/code>, <code>appendChild<\/code>).<\/li>\n<li>\"Sepete Ekle\" ve sepet i\u00e7indeki \"Kald\u0131r\" butonlar\u0131 i\u00e7in <strong>Event Delegation<\/strong> tekni\u011fini uygulad\u0131k, b\u00f6ylece dinamik olarak eklenen\/kald\u0131r\u0131lan \u00f6\u011feler i\u00e7in olay dinleyicisi sorunsuz \u00e7al\u0131\u015f\u0131yor.<\/li>\n<li><code>event.target<\/code> kullanarak hangi spesifik butona t\u0131kland\u0131\u011f\u0131n\u0131 tespit ettik.<\/li>\n<li>Sepet durumu bir JavaScript dizisi (<code>cart<\/code>) i\u00e7inde tutuldu ve bu diziye g\u00f6re DOM g\u00fcncellendi.<\/li>\n<li>Sepet toplam\u0131n\u0131 ve her bir \u00fcr\u00fcn\u00fcn miktar\u0131n\u0131 dinamik olarak de\u011fi\u015ftirdik.<\/li>\n<li><code>DOMContentLoaded<\/code> olay\u0131 ile sayfa y\u00fcklendi\u011finde sepetin ba\u015flang\u0131\u00e7 durumunu g\u00f6sterdik.<\/li>\n<\/ul>\n<p>Bu \u00f6rnek, DOM, t\u0131klama olaylar\u0131 ve temel veri y\u00f6netimi ile nas\u0131l g\u00fc\u00e7l\u00fc ve interaktif bir web uygulamas\u0131 olu\u015fturulabilece\u011fini net bir \u015fekilde g\u00f6stermektedir. Ger\u00e7ek bir e-ticaret uygulamas\u0131nda, \u00fcr\u00fcn verileri sunucudan Fetch API ile \u00e7ekilir, sepet durumu LocalStorage gibi Web API'leri kullan\u0131larak kaydedilir ve \u00f6deme i\u015flemleri yine API'ler arac\u0131l\u0131\u011f\u0131yla ger\u00e7ekle\u015ftirilirdi. Ancak temel mekanikler, burada g\u00f6sterilen DOM ve olay y\u00f6netimi prensiplerine dayan\u0131r.<\/p>\n<h2>Sonu\u00e7: Dinamik Web Geli\u015ftirmenin Gelece\u011fi<\/h2>\n<p>Bu makalede, modern web geli\u015ftirmenin temel ta\u015flar\u0131ndan olan DOM (Document Object Model), t\u0131klama olaylar\u0131 ve Web API'leri konular\u0131n\u0131 derinlemesine inceledik. G\u00f6rd\u00fck ki, JavaScript'in bu \u00fc\u00e7l\u00fcs\u00fc, statik HTML sayfalar\u0131n\u0131 canl\u0131, etkile\u015fimli ve kullan\u0131c\u0131 dostu uygulamalara d\u00f6n\u00fc\u015ft\u00fcrmenin anahtar\u0131d\u0131r. DOM, web sayfam\u0131z\u0131n yap\u0131sal bir haritas\u0131 olarak, JavaScript'in elementlere eri\u015fmesini ve onlar\u0131 manip\u00fcle etmesini sa\u011flarken, t\u0131klama olaylar\u0131 gibi olay dinleyicileri kullan\u0131c\u0131 etkile\u015fimini yakalayarak uygulamalar\u0131m\u0131z\u0131n tepki vermesini m\u00fcmk\u00fcn k\u0131lar. Web API'leri ise taray\u0131c\u0131lar\u0131n sundu\u011fu gizli g\u00fc\u00e7ler olup, konum bilgisi, veri \u00e7ekme gibi geli\u015fmi\u015f \u00f6zelliklerle uygulamalar\u0131m\u0131z\u0131n s\u0131n\u0131rlar\u0131n\u0131 geni\u015fletmemize olanak tan\u0131r.<\/p>\n<p>Event Delegation gibi performans optimizasyon teknikleri ve mobil uyumlu yakla\u015f\u0131mlar sayesinde, sadece i\u015flevsel de\u011fil, ayn\u0131 zamanda verimli ve eri\u015filebilir uygulamalar geli\u015ftirebiliriz. Bir e-ticaret sepeti \u00f6rne\u011fi \u00fczerinden, bu kavramlar\u0131n ger\u00e7ek bir senaryoda nas\u0131l bir araya geldi\u011fini ve kullan\u0131c\u0131 deneyimini nas\u0131l zenginle\u015ftirdi\u011fini de g\u00f6zlemledik. Dinamik web geli\u015ftirme, kullan\u0131c\u0131 beklentilerinin s\u00fcrekli artt\u0131\u011f\u0131 g\u00fcn\u00fcm\u00fczde vazge\u00e7ilmez bir beceridir. Bu ara\u00e7lar\u0131 ustaca kullanmak, sadece daha iyi uygulamalar yazman\u0131z\u0131 sa\u011flamakla kalmayacak, ayn\u0131 zamanda web geli\u015ftirme alan\u0131ndaki kariyerinizde size b\u00fcy\u00fck bir avantaj sa\u011flayacakt\u0131r. Web teknolojileri s\u00fcrekli geli\u015fti\u011fi i\u00e7in, bu temelleri sa\u011flam bir \u015fekilde \u00f6\u011frenmek ve yeni API'leri ke\u015ffetmeye a\u00e7\u0131k olmak, gelece\u011fin web projelerinde ba\u015far\u0131l\u0131 olman\u0131z i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<ol>\n<li>\n        <strong>DOM manip\u00fclasyonu performans\u0131 nas\u0131l etkiler?<\/strong><\/p>\n<p>DOM manip\u00fclasyonlar\u0131, \u00f6zellikle s\u0131k ve b\u00fcy\u00fck \u00f6l\u00e7ekli oldu\u011funda, taray\u0131c\u0131n\u0131n yeniden d\u00fczenleme (reflow) ve yeniden boyama (repaint) yapmas\u0131na neden olarak performans\u0131 d\u00fc\u015f\u00fcrebilir. Bu nedenle, m\u00fcmk\u00fcn oldu\u011funca az DOM manip\u00fclasyonu yapmak, Virtual DOM gibi k\u00fct\u00fcphaneler (React, Vue) kullanmak veya Event Delegation gibi tekniklerle dinleyici say\u0131s\u0131n\u0131 azaltmak performans\u0131 art\u0131rabilir.<\/p>\n<\/li>\n<li>\n        <strong><code><a><\/code> etiketinin t\u0131klama olay\u0131nda neden <code>event.preventDefault()<\/code> kullanmal\u0131y\u0131z?<\/strong><\/p>\n<p><code><a><\/code> etiketi varsay\u0131lan olarak t\u0131kland\u0131\u011f\u0131nda <code>href<\/code> niteli\u011finde belirtilen URL'ye y\u00f6nlendirme yapar. E\u011fer JavaScript ile bu ba\u011flant\u0131n\u0131n t\u0131klanmas\u0131na farkl\u0131 bir i\u015flevsellik kazand\u0131rmak ve varsay\u0131lan y\u00f6nlendirme davran\u0131\u015f\u0131n\u0131 engellemek istiyorsak, olay i\u015fleyicisi i\u00e7inde <code>event.preventDefault()<\/code> metodunu kullan\u0131r\u0131z. Bu, sayfan\u0131n yeniden y\u00fcklenmesini engelleyerek daha ak\u0131c\u0131 bir kullan\u0131c\u0131 deneyimi sunar.<\/p>\n<\/li>\n<li>\n        <strong>T\u00fcm taray\u0131c\u0131lar ayn\u0131 Web API'lerini destekler mi?<\/strong><\/p>\n<p>Hay\u0131r, t\u00fcm taray\u0131c\u0131lar ayn\u0131 Web API'lerini desteklemez. Baz\u0131 API'ler yeni olabilir ve eski taray\u0131c\u0131larda desteklenmeyebilir. Geli\u015ftirme yaparken <code>caniuse.com<\/code> gibi kaynaklar\u0131 kullanarak hedef kitlenizin kulland\u0131\u011f\u0131 taray\u0131c\u0131larda belirli bir API'nin desteklenip desteklenmedi\u011fini kontrol etmek \u00f6nemlidir. Ayr\u0131ca, bir API'yi kullanmadan \u00f6nce <code>if ('API_ad\u0131' in navigator)<\/code> gibi kontrollerle taray\u0131c\u0131 deste\u011fini do\u011frulamak, uygulaman\u0131z\u0131n daha sa\u011flam olmas\u0131n\u0131 sa\u011flar.<\/p>\n<\/li>\n<li>\n        <strong>Event Bubbling (Olay Kabarc\u0131klanmas\u0131) ve Event Capturing (Olay Yakalama) nedir?<\/strong><\/p>\n<p>Bir DOM elementi \u00fczerinde bir olay tetiklendi\u011finde, bu olay hem elementin kendisinde hem de ebeveyn elementlerinde ger\u00e7ekle\u015fir. Olay Kabarc\u0131klanmas\u0131 (Bubbling), olay\u0131n en i\u00e7teki elementten ba\u015flay\u0131p DOM a\u011fac\u0131nda yukar\u0131 do\u011fru ebeveynlere do\u011fru yay\u0131lmas\u0131d\u0131r. Olay Yakalama (Capturing) ise bunun tersidir; olay en d\u0131\u015ftaki ebeveyn elementten ba\u015flay\u0131p olay\u0131 tetikleyen hedefe do\u011fru iner. <code>addEventListener<\/code> metodunun \u00fc\u00e7\u00fcnc\u00fc parametresi ile hangi a\u015famada olay\u0131n dinlenece\u011fi belirlenebilir (<code>true<\/code> yakalama i\u00e7in, <code>false<\/code> veya varsay\u0131lan de\u011fer kabarc\u0131klanma i\u00e7in).<\/p>\n<\/li>\n<\/ol>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Modern web uygulamalar\u0131, kullan\u0131c\u0131larla etkile\u015fim kurarak dinamik deneyimler sunar. Peki, bir web sayfas\u0131n\u0131 statik bir belgeden canl\u0131 bir&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":[1],"tags":[],"class_list":{"0":"post-35650","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","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>DOM, T\u0131klama Olaylar\u0131 ve Web API&#039;leri ile Dinamik Web Sayfalar\u0131 Olu\u015fturma<\/title>\n<meta name=\"description\" content=\"Modern web uygulamalar\u0131, kullan\u0131c\u0131larla etkile\u015fim kurarak dinamik deneyimler sunar. Peki, bir web sayfas\u0131n\u0131 statik bir belgeden canl\u0131 bir aray\u00fcze d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in hangi temel ara\u00e7lar\u0131 kullan\u0131r\u0131z? Bu makalede, Document Object Model (DOM), t\u0131klama olaylar\u0131 ve g\u00fc\u00e7l\u00fc Web API&#039;lerini kullanarak web sayfalar\u0131n\u0131za hayat vermenin s\u0131rlar\u0131n\u0131 ad\u0131m ad\u0131m ke\u015ffedecek, s\u0131f\u0131rdan ba\u015flayarak ileri d\u00fczey tekniklere kadar uzanan kapsaml\u0131 bir rehber sunaca\u011f\u0131z.\" \/>\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\/dom-tiklama-olaylari-ve-web-apileri-ile-dinamik-web-sayfalari-olusturma\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"DOM, T\u0131klama Olaylar\u0131 ve Web API&#039;leri ile Dinamik Web Sayfalar\u0131 Olu\u015fturma\" \/>\n<meta property=\"og:description\" content=\"Modern web uygulamalar\u0131, kullan\u0131c\u0131larla etkile\u015fim kurarak dinamik deneyimler sunar. Peki, bir web sayfas\u0131n\u0131 statik bir belgeden canl\u0131 bir aray\u00fcze d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in hangi temel ara\u00e7lar\u0131 kullan\u0131r\u0131z? Bu makalede, Document Object Model (DOM), t\u0131klama olaylar\u0131 ve g\u00fc\u00e7l\u00fc Web API&#039;lerini kullanarak web sayfalar\u0131n\u0131za hayat vermenin s\u0131rlar\u0131n\u0131 ad\u0131m ad\u0131m ke\u015ffedecek, s\u0131f\u0131rdan ba\u015flayarak ileri d\u00fczey tekniklere kadar uzanan kapsaml\u0131 bir rehber sunaca\u011f\u0131z.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/dom-tiklama-olaylari-ve-web-apileri-ile-dinamik-web-sayfalari-olusturma\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-02T04:31:05+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=\"25 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dom-tiklama-olaylari-ve-web-apileri-ile-dinamik-web-sayfalari-olusturma\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dom-tiklama-olaylari-ve-web-apileri-ile-dinamik-web-sayfalari-olusturma\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"DOM, T\u0131klama Olaylar\u0131 ve Web API&#8217;leri ile Dinamik Web Sayfalar\u0131 Olu\u015fturma\",\"datePublished\":\"2025-12-02T04:31:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dom-tiklama-olaylari-ve-web-apileri-ile-dinamik-web-sayfalari-olusturma\/\"},\"wordCount\":4060,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/dom-tiklama-olaylari-ve-web-apileri-ile-dinamik-web-sayfalari-olusturma\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dom-tiklama-olaylari-ve-web-apileri-ile-dinamik-web-sayfalari-olusturma\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/dom-tiklama-olaylari-ve-web-apileri-ile-dinamik-web-sayfalari-olusturma\/\",\"name\":\"DOM, T\u0131klama Olaylar\u0131 ve Web API'leri ile Dinamik Web Sayfalar\u0131 Olu\u015fturma\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-02T04:31:05+00:00\",\"description\":\"Modern web uygulamalar\u0131, kullan\u0131c\u0131larla etkile\u015fim kurarak dinamik deneyimler sunar. Peki, bir web sayfas\u0131n\u0131 statik bir belgeden canl\u0131 bir aray\u00fcze d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in hangi temel ara\u00e7lar\u0131 kullan\u0131r\u0131z? Bu makalede, Document Object Model (DOM), t\u0131klama olaylar\u0131 ve g\u00fc\u00e7l\u00fc Web API'lerini kullanarak web sayfalar\u0131n\u0131za hayat vermenin s\u0131rlar\u0131n\u0131 ad\u0131m ad\u0131m ke\u015ffedecek, s\u0131f\u0131rdan ba\u015flayarak ileri d\u00fczey tekniklere kadar uzanan kapsaml\u0131 bir rehber sunaca\u011f\u0131z.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dom-tiklama-olaylari-ve-web-apileri-ile-dinamik-web-sayfalari-olusturma\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/dom-tiklama-olaylari-ve-web-apileri-ile-dinamik-web-sayfalari-olusturma\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dom-tiklama-olaylari-ve-web-apileri-ile-dinamik-web-sayfalari-olusturma\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"DOM, T\u0131klama Olaylar\u0131 ve Web API&#8217;leri ile Dinamik Web Sayfalar\u0131 Olu\u015fturma\"}]},{\"@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":"DOM, T\u0131klama Olaylar\u0131 ve Web API'leri ile Dinamik Web Sayfalar\u0131 Olu\u015fturma","description":"Modern web uygulamalar\u0131, kullan\u0131c\u0131larla etkile\u015fim kurarak dinamik deneyimler sunar. Peki, bir web sayfas\u0131n\u0131 statik bir belgeden canl\u0131 bir aray\u00fcze d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in hangi temel ara\u00e7lar\u0131 kullan\u0131r\u0131z? Bu makalede, Document Object Model (DOM), t\u0131klama olaylar\u0131 ve g\u00fc\u00e7l\u00fc Web API'lerini kullanarak web sayfalar\u0131n\u0131za hayat vermenin s\u0131rlar\u0131n\u0131 ad\u0131m ad\u0131m ke\u015ffedecek, s\u0131f\u0131rdan ba\u015flayarak ileri d\u00fczey tekniklere kadar uzanan kapsaml\u0131 bir rehber sunaca\u011f\u0131z.","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\/dom-tiklama-olaylari-ve-web-apileri-ile-dinamik-web-sayfalari-olusturma\/","og_locale":"tr_TR","og_type":"article","og_title":"DOM, T\u0131klama Olaylar\u0131 ve Web API'leri ile Dinamik Web Sayfalar\u0131 Olu\u015fturma","og_description":"Modern web uygulamalar\u0131, kullan\u0131c\u0131larla etkile\u015fim kurarak dinamik deneyimler sunar. Peki, bir web sayfas\u0131n\u0131 statik bir belgeden canl\u0131 bir aray\u00fcze d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in hangi temel ara\u00e7lar\u0131 kullan\u0131r\u0131z? Bu makalede, Document Object Model (DOM), t\u0131klama olaylar\u0131 ve g\u00fc\u00e7l\u00fc Web API'lerini kullanarak web sayfalar\u0131n\u0131za hayat vermenin s\u0131rlar\u0131n\u0131 ad\u0131m ad\u0131m ke\u015ffedecek, s\u0131f\u0131rdan ba\u015flayarak ileri d\u00fczey tekniklere kadar uzanan kapsaml\u0131 bir rehber sunaca\u011f\u0131z.","og_url":"https:\/\/fatihsoysal.com\/blog\/dom-tiklama-olaylari-ve-web-apileri-ile-dinamik-web-sayfalari-olusturma\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-02T04:31:05+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"25 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/dom-tiklama-olaylari-ve-web-apileri-ile-dinamik-web-sayfalari-olusturma\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/dom-tiklama-olaylari-ve-web-apileri-ile-dinamik-web-sayfalari-olusturma\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"DOM, T\u0131klama Olaylar\u0131 ve Web API&#8217;leri ile Dinamik Web Sayfalar\u0131 Olu\u015fturma","datePublished":"2025-12-02T04:31:05+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/dom-tiklama-olaylari-ve-web-apileri-ile-dinamik-web-sayfalari-olusturma\/"},"wordCount":4060,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/dom-tiklama-olaylari-ve-web-apileri-ile-dinamik-web-sayfalari-olusturma\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/dom-tiklama-olaylari-ve-web-apileri-ile-dinamik-web-sayfalari-olusturma\/","url":"https:\/\/fatihsoysal.com\/blog\/dom-tiklama-olaylari-ve-web-apileri-ile-dinamik-web-sayfalari-olusturma\/","name":"DOM, T\u0131klama Olaylar\u0131 ve Web API'leri ile Dinamik Web Sayfalar\u0131 Olu\u015fturma","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-02T04:31:05+00:00","description":"Modern web uygulamalar\u0131, kullan\u0131c\u0131larla etkile\u015fim kurarak dinamik deneyimler sunar. Peki, bir web sayfas\u0131n\u0131 statik bir belgeden canl\u0131 bir aray\u00fcze d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in hangi temel ara\u00e7lar\u0131 kullan\u0131r\u0131z? Bu makalede, Document Object Model (DOM), t\u0131klama olaylar\u0131 ve g\u00fc\u00e7l\u00fc Web API'lerini kullanarak web sayfalar\u0131n\u0131za hayat vermenin s\u0131rlar\u0131n\u0131 ad\u0131m ad\u0131m ke\u015ffedecek, s\u0131f\u0131rdan ba\u015flayarak ileri d\u00fczey tekniklere kadar uzanan kapsaml\u0131 bir rehber sunaca\u011f\u0131z.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/dom-tiklama-olaylari-ve-web-apileri-ile-dinamik-web-sayfalari-olusturma\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/dom-tiklama-olaylari-ve-web-apileri-ile-dinamik-web-sayfalari-olusturma\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/dom-tiklama-olaylari-ve-web-apileri-ile-dinamik-web-sayfalari-olusturma\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"DOM, T\u0131klama Olaylar\u0131 ve Web API&#8217;leri ile Dinamik Web Sayfalar\u0131 Olu\u015fturma"}]},{"@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\/35650","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=35650"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35650\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=35650"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=35650"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=35650"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}