| <!DOCTYPE html SYSTEM "about:legacy-compat"> | |
| <html lang="tr"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"> | |
| <meta content="width=device-width, initial-scale=1" name="viewport"> | |
| <!-- | |
| XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | |
| This file is generated from xml source: DO NOT EDIT | |
| XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | |
| --> | |
| <title>Devingen Paylaşımlı Nesne Desteği - Apache HTTP Sunucusu Sürüm 2.5</title> | |
| <link href="./style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet"> | |
| <link href="./style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size"> | |
| <link href="./style/css/manual-print.css" rel="stylesheet" media="print" type="text/css"><link rel="stylesheet" type="text/css" href="./style/css/prettify.css"> | |
| <script src="./style/scripts/prettify.min.js"> | |
| </script> | |
| <link href="./images/favicon.png" rel="shortcut icon"></head> | |
| <body id="manual-page"><div id="page-header"> | |
| <p class="menu"><a href="./mod/">Modüller</a> | <a href="./mod/quickreference.html">Yönergeler</a> | <a href="https://cwiki.apache.org/confluence/display/httpd/FAQ">SSS</a> | <a href="./glossary.html">Terimler</a> | <a href="./sitemap.html">Site Haritası</a> | <a href="https://bz.apache.org/bugzilla/enter_bug.cgi?product=Apache%20httpd-2">Report a bug</a></p> | |
| <p class="apache">Apache HTTP Sunucusu Sürüm 2.5</p> | |
| <img alt="" src="./images/feather.png"></div> | |
| <div class="up"><a href="./"><img title="<-" alt="<-" src="./images/left.gif"></a></div> | |
| <div id="path"> | |
| <a href="https://www.apache.org/">Apache</a> > <a href="https://httpd.apache.org/">HTTP Sunucusu</a> > <a href="https://httpd.apache.org/docs/">Belgeleme</a> > <a href="./">Sürüm 2.5</a></div><div id="page-content"><div id="preamble"><h1>Devingen Paylaşımlı Nesne Desteği</h1> | |
| <button aria-label="Toggle language list" class="lang-toggle"><svg xmlns="http://www.w3.org/2000/svg" stroke-width="2" stroke="currentColor" fill="none" viewBox="0 0 24 24" height="16" width="16"><circle r="10" cy="12" cx="12"/><line y2="12" x2="22" y1="12" x1="2"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg></button> | |
| <div class="toplang"> | |
| <p><span>Mevcut Diller: </span><a href="./en/dso.html" hreflang="en" rel="alternate" title="English"> en </a> | | |
| <a href="./es/dso.html" hreflang="es" rel="alternate" title="Español"> es </a> | | |
| <a href="./fr/dso.html" hreflang="fr" rel="alternate" title="Français"> fr </a> | | |
| <a href="./ja/dso.html" hreflang="ja" rel="alternate" title="Japanese"> ja </a> | | |
| <a href="./ko/dso.html" hreflang="ko" rel="alternate" title="Korean"> ko </a> | | |
| <a href="./tr/dso.html" title="Türkçe"> tr </a></p> | |
| </div> | |
| <div class="outofdate">Bu çeviri güncel olmayabilir. Son değişiklikler için İngilizce sürüm geçerlidir.</div> | |
| <p>Apache HTTP Sunucusu modüler bir program olup, yönetici sadece bir | |
| grup modül seçerek sunucuya işlevsellik ekleyebilir. Modüller, Devingen | |
| Paylaşımlı Nesneler (DSO - Dynamic Shared Object) halinde | |
| <code class="program"><a href="./programs/httpd.html">httpd</a></code> programından ayrı olarak derlenir. DSO modülleri | |
| sunucunun derlenmesi sırasında derlenebileceği gibi ayrı olarak derlenip | |
| daha sonra Apache Eklenti Aracı (Apache Extension Tool) | |
| <code class="program"><a href="./programs/apxs.html">apxs</a></code> programı kullanılarak da sunucuya eklenebilir.</p> | |
| <p>Bu belgede DSO modüllerinin kullanımının yanında teorisine de | |
| değinilecektir.</p> | |
| </div> | |
| <div id="quickview"><ul id="toc"><li><img alt="" src="./images/down.gif"> <a href="#implementation">Gerçeklenim</a></li> | |
| <li><img alt="" src="./images/down.gif"> <a href="#usage">Kullanım Özeti</a></li> | |
| <li><img alt="" src="./images/down.gif"> <a href="#background">Artalan Bilgisi</a></li> | |
| <li><img alt="" src="./images/down.gif"> <a href="#advantages">Getiriler ve Götürüler</a></li> | |
| </ul></div> | |
| <div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif"></a></div> | |
| <div class="section"> | |
| <h2 id="implementation">Gerçeklenim <a title="Permanent link" href="#implementation" class="permalink">¶</a></h2> | |
| <table class="related"><tr><th>İlgili Modüller</th><th>İlgili Yönergeler</th></tr><tr><td><ul><li><code class="module"><a href="./mod/mod_so.html">mod_so</a></code></li></ul></td><td><ul><li><code class="directive"><a href="./mod/mod_so.html#loadmodule">LoadModule</a></code></li></ul></td></tr></table> | |
| <p>Apache httpd modüllerini yüklemek için DSO desteği, Apache httpd | |
| çekirdeğine durağan olarak ilintilenerek derlenmiş olan | |
| <code class="module"><a href="./mod/mod_so.html">mod_so</a></code> adında bir modül tarafından sağlanır. | |
| <code class="module"><a href="./mod/core.html">core</a></code> modülünden başka, bir DSO modülü olamayan tek modül | |
| <code class="module"><a href="./mod/mod_so.html">mod_so</a></code> modülüdür. Apache ile dağıtılan hemen hemen tüm | |
| diğer Apache modülleri bir DSO modülüne yerleştirilebilir. Derlenmiş | |
| modüller <code>mod_filanca.so</code> biçeminde birer DSO ismi alırlar ve | |
| her biri istenirse <code>httpd.conf</code> dosyasında | |
| <code class="module"><a href="./mod/mod_so.html">mod_so</a></code> modülünün <code class="directive"><a href="./mod/mod_so.html#loadmodule">LoadModule</a></code> yönergesiyle belirtilerek sunucu başlatılırken | |
| veya yeniden başlatılırken sunucuya yüklenebilir.</p> | |
| <p><a href="install.html">Kurulum belgesinde</a> açıklandığı gibi, her DSO | |
| modülü <code class="program"><a href="./programs/configure.html">configure</a></code> programının | |
| <code>--enable-mods-static</code> seçeneği ile devredışı bırakılabilir.</p> | |
| <p>Apache httpd modülleri için (özellikle üçüncü parti modüller için) DSO | |
| dosyası üretimini kolaylaştırmak amacıyla <code class="program"><a href="./programs/apxs.html">apxs</a></code> | |
| (<dfn>APache eXtenSion</dfn>) adında yeni bir destek programı | |
| kullanılmaktadır. Bu program Apache httpd modüllerini Apache httpd kaynak | |
| ağacından ayrı olarak derlemek için kullanılabilir. Fikir basittir: Apache | |
| HTTP Sunucusu derlenirken DSO dosyalarını derlemek için platforma bağımlı | |
| derleyici ve ilintileyici seçenekleri <code class="program"><a href="./programs/apxs.html">apxs</a></code> | |
| programının içine konur ve <code>make install</code> ile kurulum sırasında | |
| Apache httpd C başlık dosyaları da kurulur. Böylece | |
| kullanıcı Apache httpd dağıtımının kaynak ağacına ihtiyaç duymadan ve | |
| platforma bağımlı derleyici ve ilintileyici seçeneklerini bilmek zorunda | |
| kalmadan istediği Apache httpd modülünü <code class="program"><a href="./programs/apxs.html">apxs</a></code> | |
| programını kullanarak derleyebilir.</p> | |
| </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif"></a></div> | |
| <div class="section"> | |
| <h2 id="usage">Kullanım Özeti <a title="Permanent link" href="#usage" class="permalink">¶</a></h2> | |
| <p>Apache HTTP Sunucusu 2.x'in DSO özelliklerine bir giriş olarak burada | |
| kısaca bir bilgi vermekle yetinilecektir:</p> | |
| <ol> | |
| <li><p>Kaynak dosyası <code>mod_filanca.c</code> dosyasında dağıtılan bir | |
| <em>özgün</em> Apache htpd modülünü <code>mod_filanca.so</code> isminde | |
| bir DSO modülü olarak derlemek ve kurmak için şöyle yapılır:</p> | |
| <div class="example"><p><code> | |
| $ ./configure --prefix=/kurulum/yeri --enable-filanca<br> | |
| $ make install | |
| </code></p></div> | |
| </li> | |
| <li><p>Apache HTTP Sunucusunu tüm modüller etkin olarak | |
| derleyebilirsiniz. Fakat sunucunun başlatılması sırasında sadece temel | |
| modüller yüklenir. Daha sonra <code>httpd.conf</code> içindeki | |
| <code class="directive"><a href="./mod/mod_so.html#loadmodule">LoadModule</a></code> yönergelerini etkin | |
| veya etkisiz hale getirerek yüklenecek modülleri | |
| değiştirebilirsiniz.</p> | |
| <div class="example"><p><code> | |
| $ ./configure --enable-mods-shared=all<br> | |
| $ make install | |
| </code></p></div> | |
| </li> | |
| <li><p>Bazı modüller sadece geliştiriciler içindir ve bunlar tüm | |
| modüllerin derlenmesini (<em>all</em>) seçseniz bile derlenmeyecektir. | |
| Geliştirici modülleri dehil tüm modülleri derlemek isterseniz | |
| <em>reallyall</em> kullanınız. Ek olarak, derlenmiş modüller için | |
| kullanılan <code class="directive"><a href="./mod/mod_so.html#loadmodule">LoadModule</a></code> | |
| yönergelerinin tamamını <code>--enable-load-all-modules</code> derleme | |
| seçeneği ile etkin kılabilirsiniz.</p> | |
| <div class="example"><p><code> | |
| $ ./configure --enable-mods-shared=reallyall --enable-load-all-modules<br> | |
| $ make install | |
| </code></p></div> | |
| </li> | |
| <li><p>Kaynak dosyası <code>mod_filanca.c</code> dosyasında dağıtılan bir | |
| <em>üçüncü parti</em> Apache httpd modülü <code>mod_filanca.so</code> | |
| isminde bir DSO modülü olarak Apache httpd kaynak ağacının dışında | |
| <code class="program"><a href="./programs/apxs.html">apxs</a></code> kullanarak derlemek ve kurmak için şöyle | |
| yapılır:</p> | |
| <div class="example"><p><code> | |
| $ cd /bir/kurulum/yeri<br> | |
| $ apxs -c mod_filanca.c<br> | |
| $ apxs -aci filanca mod_filanca.la | |
| </code></p></div> | |
| </li> | |
| </ol> | |
| <p>Tüm durumlarda derlenen paylaşımlı modülü Apache httpd'nin etkin | |
| kılabilmesi için <code>httpd.conf</code> dosyasında o modül için bir | |
| <code class="directive"><a href="./mod/mod_so.html#loadmodule">LoadModule</a></code> yönergesi | |
| bulunmalıdır.</p> | |
| <p>Ayrıntılı bilgi için <a href="programs/apxs.html">apxs belgelerine</a> | |
| bakınız.</p> | |
| </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif"></a></div> | |
| <div class="section"> | |
| <h2 id="background">Artalan Bilgisi <a title="Permanent link" href="#background" class="permalink">¶</a></h2> | |
| <p>Günümüzün Unix türevlerinde var olan bir mekanizma sayesinde | |
| çalıştırılabilir bir programın adres uzayına çalışma anında yüklenmek | |
| veya ilintilenmek üzere <em>Devingen Paylaşımlı Nesneler</em> (DSO - | |
| Dynamic Shared Object) adı verilen, özel bir biçem kullanarak kodlanmış | |
| program parçaları oluşturulabilir.</p> | |
| <p>Bu yükleme normalde iki yolla yapılabilir: Ya çalıştırılabilir | |
| programın başlatılması sırasında yüklenen <code>ld.so</code> adlı bir | |
| sistem programınının devingen olarak yüklenmesi ile ya da | |
| çalıştırılabilir programın içinden Unix yükleyicisine programsal sistem | |
| arayüzü sağlayan <code>dlopen()/dlsym()</code> sistem çağrılarının elle | |
| yapılması suretiyle.</p> | |
| <p>İlk yöntemde kullanılan DSO'lara genelde <em>paylaşımlı | |
| kütüphaneler</em> veya <em>DSO kütüphaneleri</em> adı verilir ve | |
| bunların dosyaları <code>libfilanca.so</code> veya | |
| <code>libfilanca.so.1.2</code> biçiminde isimlendirilir. Belli bir | |
| sistem dizininde (normalde <code>/usr/lib</code>) bulunurlar ve derleme | |
| sırasında ilintileyici komutuna <code>-lfilanca</code> şeklinde | |
| belirtilerek çalıştırılabilir programla ilintilenirler. Doğrudan | |
| çalıştırılabilir koda eklenen bu kodlar Unix yükleyicisinin programın | |
| başlatılması sırasında kütüphaneyi <code>/usr/lib</code> altında | |
| <code>libfilanca.so</code> adıyla bulabilmesini sağlar. Kütüphanelerin | |
| aranacağı yerler ya <code>-R</code> gibi bir ilintileyici seçeneği ile | |
| koda eklenir ya da arama yolları <code>LD_LIBRARY_PATH</code> ortam | |
| değişkeni aracılığıyla yapılandırılır. Böylece çalıştırılabilir | |
| programda henüz çözümlenmemiş simgeler DSO içinde bulunarak | |
| çözümlenebilir.</p> | |
| <p>Çalıştırılabilir program içindeki simgelere normalde DSO içinden | |
| atıfta bulunulmaz (genel kod kütüphanesinin başka programlarca da | |
| kullanılması nedeniyle). Bu bakımdan DSO tarafında böyle bir çözümleme | |
| yapılmaz. Çalıştırılabilir program da DSO'daki simgeleri kendisi | |
| çözümlemeye uğraşmaz, bu işlemlerden tamamen Unix yükleyicisi | |
| (<code>ld.so</code>) sorumludur. (Aslında, <code>ld.so</code>'yu | |
| çağıracak kod, her çalıştırılabilir programın içine ilintilenmiş | |
| (durağan değil) başlatma kodunun bir parçasıdır.) Programlar tarafından | |
| ortaklaşa kullanılan kütüphanelerin devingen olarak yüklenmesinin sebebi | |
| basittir: Kütüphane kodu <code>libc.so</code> gibi bir sistem | |
| kütüphanesine bir kere kaydedilip disk alanından yer kazanılmış | |
| olur.</p> | |
| <p>İkinci yöntemde kullanılan DSO'lara yine <em>paylaşımlı | |
| kütüphaneler</em> veya <em>DSO kütüphaneleri</em> adı verilir fakat | |
| bunların dosyaları geçerli kabule göre <code>filanca.so</code> gibi | |
| isimlendirilse de genelde keyfi olarak seçilen bir dosya uzantısı | |
| kullanılarak isimlendirilirler. Bu dosyalar genellikle programa özel bir | |
| dizinde dururlar ve bu dosyaları kullanacak olan çalıştırılabilir | |
| programla aralarında özdevimli olarak bağ kurulmamıştır. Bunun yerine, | |
| çalıştırılabilir program DSO'yu çalışma anında <code>dlopen()</code> | |
| sayesinde kendi adres uzayına ekler. Çalıştırılabilir program için | |
| DSO'daki simgeler bu sırada çözümlenmez. Özdevimli olarak devreye | |
| giren Unix yükleyicisi, (varsa) artakalan simgeleri, çalıştırılabilir | |
| ihraç edilen simge kümelerini (ve özellikle her yerde hazır ve nazır | |
| <code>libc.so</code> içindeki tüm simgeleri) kullanarak çözümler. Bu | |
| yolla DSO, çalıştırılabilir programın simge kümesi bilgilerini sanki | |
| kendisine baştan durağan olarak ilintilenmiş gibi ulaşabilir.</p> | |
| <p>Son olarak, DSO'nun programlama arayüzünün getirilerinden yararlanmak | |
| amacıyla çalıştırılabilir program, daha sonra dağıtım tabloları vb. | |
| yerlerde kullanmak üzere <code>dlsym()</code> üzerinden DSO'daki belli | |
| simgeleri çözümlemek zorundadır. Başka bir deyişle: Çalıştırılabilir | |
| program ihtiyaç duyduğu her simgeyi kullanmak için kendisi çözümleme | |
| yapmak zorundadır. Böyle bir mekanizmanın getirisi, programın isteğe | |
| bağlı parçalarının gerekli olana kadar yüklenmemesidir (böylece daha az | |
| bellek alanı kullanılır). Gerektiği zaman programın işlevselliğini | |
| arttırmak amacıyla bu parçalar devingen olarak programa | |
| yüklenebilir.</p> | |
| <p>DSO mekanizmasının bu basit gibi görünen işleyişinde zorluk içeren bir | |
| adım şudur (başkaları da olabilir): Bir programın işlevselliğini | |
| genişletmek için DSO kullanılırken (ikinci yöntem) çalıştırılabilir | |
| programdan DSO için simgelerin çözümlenmesi. Zorluğun sebebi, | |
| "tersine çözümleme" yapılmasıdır; çalıştırılabilir programın simge | |
| kümesindeki DSO simgeleri kütüphane tasarımına aykırı bir şekilde | |
| çözümlenir ve bu uygulama tüm platformlarda hazır olarak | |
| desteklenmediği gibi standartlaşmış da değildir. Geçer uygulamada | |
| çalıştırılabilir programın evrensel simgeleri çoğunlukla yeniden dışa | |
| verilmez ve bu bakımdan bir DSO içinde kullanılmaları uygun değildir. | |
| Esas sorun, çalıştırılabilir bir programın işlevselliğini çalışma | |
| anında genişletmek için DSO kullanımı sırasında ilintileyicinin tüm | |
| evrensel simgeleri dışa vermesini zorlamanın bir yolunu bulmaktır.</p> | |
| <p>Paylaşımlı kütüphane yaklaşımı bu bakımdan türünün tek örneğidir, | |
| çünkü DSO mekanizması özellikle bunun için tasarlanmıştır, dolayısıyla | |
| işletim sisteminin sağladığı hemen hemen tüm kütüphaneler için | |
| kullanılabilir.</p> | |
| </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif"></a></div> | |
| <div class="section"> | |
| <h2 id="advantages">Getiriler ve Götürüler <a title="Permanent link" href="#advantages" class="permalink">¶</a></h2> | |
| <p>Yukarıda bahsedilen DSO'ya dayalı özelliklerin getirileri | |
| şunlardır:</p> | |
| <ul> | |
| <li>Sunucu paketi çalışma anında daha esnektir çünkü, sunucuyu | |
| oluşturan parçalar derleme sırasında <code class="program"><a href="./programs/configure.html">configure</a></code> | |
| seçenekleriyle birleştirilmek yerine <code>httpd.conf</code> içinde | |
| <code class="directive"><a href="./mod/mod_so.html#loadmodule">LoadModule</a></code> yönergeleri | |
| sayesinde çalışma anında birleştirilebilmektedir. Bu yolla, örneğin | |
| tek bir Apache kurulumuyla birbirinden farklı yapılandırmalara sahip | |
| çok sayıda sunucu çalıştırmak mümkündür. (standart veya SSL sürümü; | |
| basitleştirilmiş veya devingen sürümü [mod_perl, PHP3], vs.)</li> | |
| <li>Sunucu paketi kurulumdan sonra bile üçüncü parti modüllerle kolayca | |
| genişletilebilir. Bu özellikle, bir Apache temel paketinin yanında | |
| PHP, mod_perl, mod_security gibi ek paketler oluşturan paket | |
| dağıtıcılarına büyük yarar sağlar.</li> | |
| <li>Yeni Apache httpd modülleri için daha kolay prototip | |
| geliştirilebilir: Modül kaynak kodunu DSO/<code class="program"><a href="./programs/apxs.html">apxs</a></code> çifti | |
| sayesinde Apache httpd kaynak ağacının dışında derleyip modülün yeni | |
| bir sürümünü bir <code>apxs -i</code> komutunun ardından | |
| <code>apachectl restart</code> yaparak çalışan bir Apache HTTP | |
| Sunucusunda denemek daha kolay hale getirilmiştir.</li> | |
| </ul> | |
| <p>DSO kullanımının götürüleri ise şunlardır:</p> | |
| <ul> | |
| <li>İlk yüklemede %20 yavaşlama: Unix yükleyicisi simgeleri çözümlemek | |
| zorunda olduğundan sunucu ilk başlatılırken yaklaşık %20 daha yavaş | |
| faaliyete geçer.</li> | |
| <li>Çalışma sırasında % 5 yavaşlama: Konumdan bağımsız kodun (PIC - | |
| Position Independent Code) göreli adresleme için karmaşık oyunlara | |
| girmesi ve bunun mutlak adresleme kadar hızlı olmaması nedeniyle | |
| sunucu bazı platformlarda çalışma anında yaklaşık %5 daha yavaş | |
| çalışabilir.</li> | |
| <li>DSO'nun tüm modüller için uygun olmaması: DSO modülleri bazı | |
| platformlarda diğer DSO temelli kütüphanelerle ilintilenemediğinden | |
| (<code>ld -lfilanca</code>) DSO mekanizmasını tüm modül türleri için | |
| kullanamazsınız (örneğin a.out temelli platformlar bu işlevselliği | |
| ELF temelli platformlar kadar iyi sağlamaz). Başka bir deyişle, DSO | |
| dosyaları olarak derlenmiş modüllerin kullanabileceği simgeler ya | |
| Apache httpd temel kodunda vardır ya Apache httpd temel kodunun | |
| kullandığı C kütüphanesinde (<code>libc</code>) ve diğer durağan ve | |
| devingen kütüphanelerde vardır ya da konumdan bağımsız kodu içeren | |
| durağan kütüphane arşivlerinde (<code>libfilanca.a</code>) | |
| vardır. Diğer modülleri kullanmak için tek şansınız ya Apache httpd | |
| çekirdeğinin modüle bir atıf içermesini sağlamak ya da modül kodunu | |
| <code>dlopen()</code> vasıtasıyla yüklemektir.</li> | |
| </ul> | |
| </div></div> | |
| <div class="bottomlang"> | |
| <p><span>Mevcut Diller: </span><a href="./en/dso.html" hreflang="en" rel="alternate" title="English"> en </a> | | |
| <a href="./es/dso.html" hreflang="es" rel="alternate" title="Español"> es </a> | | |
| <a href="./fr/dso.html" hreflang="fr" rel="alternate" title="Français"> fr </a> | | |
| <a href="./ja/dso.html" hreflang="ja" rel="alternate" title="Japanese"> ja </a> | | |
| <a href="./ko/dso.html" hreflang="ko" rel="alternate" title="Korean"> ko </a> | | |
| <a href="./tr/dso.html" title="Türkçe"> tr </a></p> | |
| </div><div id="footer"> | |
| <p class="apache">Copyright 2026 The Apache Software Foundation.<br><a href="https://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a> adı altında lisanslıdır.</p> | |
| <p class="menu"><a href="./mod/">Modüller</a> | <a href="./mod/quickreference.html">Yönergeler</a> | <a href="https://cwiki.apache.org/confluence/display/httpd/FAQ">SSS</a> | <a href="./glossary.html">Terimler</a> | <a href="./sitemap.html">Site Haritası</a> | <a href="https://bz.apache.org/bugzilla/enter_bug.cgi?product=Apache%20httpd-2">Report a bug</a></p></div><script><!--//--><![CDATA[//><!-- | |
| if (typeof(prettyPrint) !== 'undefined') { | |
| prettyPrint(); | |
| } | |
| var langToggle = document.querySelector('.lang-toggle'); | |
| var topLang = document.querySelector('.toplang'); | |
| if (langToggle && topLang) { | |
| langToggle.addEventListener('click', function() { topLang.classList.toggle('open'); }); | |
| } | |
| var qv = document.getElementById('quickview'); | |
| if (qv) { | |
| document.body.appendChild(qv); | |
| var qvBtn = document.createElement('button'); | |
| qvBtn.className = 'qv-toggle'; | |
| qvBtn.setAttribute('aria-label', 'Toggle page navigation'); | |
| qvBtn.innerHTML = '☰'; | |
| document.body.appendChild(qvBtn); | |
| qvBtn.addEventListener('click', function() { | |
| var isOpen = qv.classList.toggle('open'); | |
| if (isOpen) { | |
| qv.style.top = window.scrollY + 10 + 'px'; | |
| } | |
| }); | |
| window.addEventListener('scroll', function() { qv.classList.remove('open'); }); | |
| } | |
| //--><!]]></script> | |
| </body></html> |