• 12-06-2018, 02:33:18
    #1
    Merhaba,

    Bildiğimiz üzere HTML 5 ile birlikte PushState kullanarak tarayıcının URL si dahil bir çok (Başlık vs.) sayfa yenilemeden değiştirilebiliyor.

    Bu noktada sayfayı değiştirmeden bilgilerini değiştirebiliyorsak jquery load veya ajax kullanarak başka bir sayfanın verilerini çekip bilgilerini değiştirdiğimiz aynı sayfaya yükleyebiliriz.


    ÖZET
    Kısacası Youtube, Facebook, Chrome Eklentiler dahil bir çok sayfada olduğu gibi sayfayı yenilemeden içerikleri değiştirmek mümkün.

    PROBLEM
    Problem şu ki: Internet Explorer 10 ve aşağısı sürümlerde HTML5 desteklenmiyor ve dolayısıyla " PushState History " özelliği de desteklenmiyor.

    ÇÖZÜM
    Bu noktada Jquery Eklentileri devreye giriyor. Ki "Araştırmalarım sonucu bilindik en stabil plug'in History.js eklentisidir."
    Bu vb. eklentiler History özelliği olmayan tarayıcılarda URL lerin arasına "#" hash koyarak sorunu çözüyor. Tabi link yapınız değişmiyor SEO açısından bir sıkıntısının olduğunu düşünmüyorum, robotlar "#" olmadan sayfalara ulaşacaklardır. (Benzer örneklerini görmüşsünüzdür)

    En basiti: IE 9 ile Chrome Eklentiler sayfasına girin ve bir eklentiye tıklayın. URL yi takip ederseniz araya "#" koyup yeni sayfayı çağıracaktır.



    SORU 1
    Biraz araştırdım. Neredeyse hiç Türkçe kaynak yok internette. "PushState kullanımı, History.js kullanımı vs. vs." Türk developerler bu olaya neden hala ayak uyduramadı anlamadım. Acaba tercih mi edilmiyor? Bilmediğim bir sakıncaları mı var merak ettim.

    SORU 2
    History.js 'i indirip test ettim. Gayet güzel çalışıyor.

    Ancak şöyle bir sorun var.
    <a href="ornek.com/test.php">Test Sayfası</a>
    böyle bir bağlantıya tıkladığımızda jQuery Load ile "text.php" 'i çekip sayfanızda örneğin (body) tagının içine yüklemeniz gerekiyor. Ancak çektiği sayfanın zaten kendine ait html tagı, head tagı, title tagı vs. var. html içine html yüklemiş oluyoruz.

    Bizim text.php 'i load edip, sadece body tagının içinde kalanları içeri yüklememiz lazım.
    Ayrıca text.php den gelen title tagının içindekileri asıl sayfadaki title tagına basmamız gerekiyor.

    İşte bu noktada takıldım kaldım. Yardımlarınızı bekliyorum. (Ajax load ile gelen tüm bir sayfanın belirli bir tag içindeki verilerini nasıl çekeriz örneğin "head" veya "body")

    $("html").load(State.url + "#content", function() { bu şekilde ilgili sayfada ID verilen bir div i çekebiliyoruz ama bu doğu bir yöntem midir? ayrı bir soru! Tabi o sayfanın başlığını "title" mevcut sayfaya aktarmak hala büyük bir sıkıntı. Bahsettiğim siteler bunu nasıl çözüyorlar


    Bahsettiğim kod:

    $("html").load(State.url, function() {
        ......
    });
    State.url dediğini text.php gibi düşünün.


    Bu da History.js ile yapılmış tam bir örnek:

    $(function() { 
         
         // run after page is loaded 
         ajaxifyLinks(); 
     }); 
    
    
     function ajaxifyLinks() { 
    
         // whenever a hyperlink is clicked... 
         $("a").click(function() { 
         
             // create an object to pass as state data 
             var data = {}; 
             
             // do whatever you want to the data 
             data.putYour = "data here"; 
             
             // update the url, preserve title 
             History.pushState(data, document.title, $(this).attr('href')); 
             
             // cancel the normal action of the hyperlink 
             return false; 
         }); 
         
     } 
    
    
     History.Adapter.bind(window,'statechange',function() { 
    
         // store the State object 
         var State = History.getState(); 
         
         // all the data you passed is accessable here now 
         var data = State.data; 
         
         // at this point you do whatever needs to be done to update the page. 
         // in this case, it is loading the new URL into my #main div. 
         
         // load the new url into #main 
         $("html").load(State.url, function() { 
             
             // after new page is loaded, do stuff here 
             //alert("Page has been loaded!"); 
             
             // and re-ajaxify the links 
             ajaxifyLinks(); 
         }); 
         
     });
  • 12-06-2018, 02:51:16
    #2
    Üyeliği durduruldu
    Peki sayfayı yenilemeden içeriği değiştirince, önceki içerik nereye gidiyor?
  • 12-06-2018, 03:01:14
    #3
    Eline sağlık Onur.
  • 12-06-2018, 03:41:01
    #4
    Asgardia adlı üyeden alıntı: mesajı görüntüle
    Peki sayfayı yenilemeden içeriği değiştirince, önceki içerik nereye gidiyor?
    Önceki içeriğin üstüne yazıyor. Yani siliyor. Ama işte History özelliği sayesinde browser'e sanki linkler arasında gezinmişsin gibi history (geçmiş) niteliği tanımlıyor. Geriye tıkladığında eski içerik tekrar sayfa yenilenmeden otomatik geliyor. Bu şekilde "ileri - geri" yapmak mümkün oluyor. Örn: Facebook da olup biten de tam olarak bu.

    ysf adlı üyeden alıntı: mesajı görüntüle
    Eline sağlık Onur.
    Teşekkür ederim Yusuf, bakalım bir sonuca varabilecek miyiz.
  • 12-06-2018, 03:45:45
    #5
    Prototype adlı üyeden alıntı: mesajı görüntüle
    Önceki içeriğin üstüne yazıyor. Yani siliyor. Ama işte History özelliği sayesinde browser'e sanki linkler arasında gezinmişsin gibi history (geçmiş) niteliği tanımlıyor. Geriye tıkladığında eski içerik tekrar sayfa yenilenmeden otomatik geliyor. Bu şekilde "ileri - geri" yapmak mümkün oluyor. Örn: Facebook da olup biten de tam olarak bu.


    Teşekkür ederim Yusuf, bakalım bir sonuca varabilecek miyiz.
    Seni burada görmek güzel kardeşim, yardımcı olabilecek çıkacaktır.
  • 12-06-2018, 15:51:02
    #6
    Bahsettiğiniz spa(single page application) sanırım. Bunun için daha çok framework kullanılıyor diye biliyorum; angular, react, vue js. Mesela facebook react kullanıyor.

    Bir de yeni sayfa yüklenirken html olarak komple sayfa değilde değişen veri yükleniyordur bence.
  • 12-06-2018, 23:11:52
    #7
    Alıntı
    SORU 1
    Biraz araştırdım. Neredeyse hiç Türkçe kaynak yok internette. "PushState kullanımı, History.js kullanımı vs. vs." Türk developerler bu olaya neden hala ayak uyduramadı anlamadım. Acaba tercih mi edilmiyor? Bilmediğim bir sakıncaları mı var merak ettim.
    pushstate çok yeni bir kavram değil. bu uygulamayı yıllar önce bir sitede gerçekleştirdim. tarayıcı pushstate desteklemiyor ise hash ile yaptırdığımı hatırlıyorum. Tesadüfen konunuzu görünce yazmak istedim. Türkçe kaynak çoğu konuda az olabilir. Güvenilir kaynaklar size fazlasıyla yeticektir. Bireysel olarak da mozilla.org kaynak olarak kullanıyorum.

    https://developer.mozilla.org/en-US/...PI/History_API

    Alıntı
    SORU 2
    History.js 'i indirip test ettim. Gayet güzel çalışıyor.

    Ancak şöyle bir sorun var.
    Kod:

    <a href="ornek.com/test.php">Test Sayfası</a>

    böyle bir bağlantıya tıkladığımızda jQuery Load ile "text.php" 'i çekip sayfanızda örneğin (body) tagının içine yüklemeniz gerekiyor. Ancak çektiği sayfanın zaten kendine ait html tagı, head tagı, title tagı vs. var. html içine html yüklemiş oluyoruz.
    bunun iki farklı çözümü var. ilki php ile yapılacak yöntem. ikincisi javascript ile yapılacak işlemler.

    php ile yaptığınız kodlama yapısını bilmediğim için oraya hiç girmeyeceğim.

    https://developer.mozilla.org/en-US/...State()_method

    argümanlara bakarsanız state object,title,url
    head kısmını değiştirmeniz önemsizdir. sadece title değiştirmeniz yeterli. bu değişiklikler tarayıcının adres çubuğunda url adresini ve sekmede yazan yazıyı değiştirecektir.

    ornek.com/test.php adresine ajax ile istek yaptınız, cevap olarak html kodlarını aldınız. veri tipi olarak elinizde metin yani string var bunu document object model (dom) dönüştürmeniz lazım. jquery sitesinden aratırsanız https://api.jquery.com/jquery.parsehtml/ methodunu görebilirsin.

    title, body elementlerini araman için https://api.jquery.com/find/ fonksiyonu bulunuyor. geri kalan işlemleri yapabilirsin.

    kolay gelsin
  • 13-06-2018, 20:28:36
    #8
    CoreDeluxe adlı üyeden alıntı: mesajı görüntüle
    pushstate çok yeni bir kavram değil. bu uygulamayı yıllar önce bir sitede gerçekleştirdim. tarayıcı pushstate desteklemiyor ise hash ile yaptırdığımı hatırlıyorum. Tesadüfen konunuzu görünce yazmak istedim. Türkçe kaynak çoğu konuda az olabilir. Güvenilir kaynaklar size fazlasıyla yeticektir. Bireysel olarak da mozilla.org kaynak olarak kullanıyorum.

    https://developer.mozilla.org/en-US/...PI/History_API



    bunun iki farklı çözümü var. ilki php ile yapılacak yöntem. ikincisi javascript ile yapılacak işlemler.

    php ile yaptığınız kodlama yapısını bilmediğim için oraya hiç girmeyeceğim.

    https://developer.mozilla.org/en-US/...State()_method

    argümanlara bakarsanız state object,title,url
    head kısmını değiştirmeniz önemsizdir. sadece title değiştirmeniz yeterli. bu değişiklikler tarayıcının adres çubuğunda url adresini ve sekmede yazan yazıyı değiştirecektir.

    ornek.com/test.php adresine ajax ile istek yaptınız, cevap olarak html kodlarını aldınız. veri tipi olarak elinizde metin yani string var bunu document object model (dom) dönüştürmeniz lazım. jquery sitesinden aratırsanız https://api.jquery.com/jquery.parsehtml/ methodunu görebilirsin.

    title, body elementlerini araman için https://api.jquery.com/find/ fonksiyonu bulunuyor. geri kalan işlemleri yapabilirsin.

    kolay gelsin
    Teşekkür ederim. Ben de aynı gün hallettim fakat buraya yazmayı unutmuşum.

    Söyledikleriniz doğru lakin, head kısmını değiştirmek önemli çünkü "test.php" içinde spesifik bir style ve javascript dosyası bulunabilir. Onları çekmek gerekir.


    "#" Hash ile desteklenmeyen tarayıcılarda dahi nasıl yapıldığına örnek verecek olursak eski "Twitter" 'i hatırlayın. Linklerin arasında hep bir "#" olurdu O zmnlar history yoktu tabi
  • 14-06-2018, 01:11:30
    #9
    Prototype adlı üyeden alıntı: mesajı görüntüle
    Teşekkür ederim. Ben de aynı gün hallettim fakat buraya yazmayı unutmuşum.

    Söyledikleriniz doğru lakin, head kısmını değiştirmek önemli çünkü "test.php" içinde spesifik bir style ve javascript dosyası bulunabilir. Onları çekmek gerekir.


    "#" Hash ile desteklenmeyen tarayıcılarda dahi nasıl yapıldığına örnek verecek olursak eski "Twitter" 'i hatırlayın. Linklerin arasında hep bir "#" olurdu O zmnlar history yoktu tabi
    bu kavramı ilk kez gören ve mesajları okuyanlar için eklemek istedim. mesajınız bu kavramın doğru anlaşılmasını etkileyebilir. pushstate ile head arasında bir bağlantı yoktur. bu tamamen sizin yazılımınızla alakalı. sayfalar arasında dinamik javascript ve css eklemeleri olabilir, bunun için ek uygulamalar yazabilirsiniz ama bu durumun pushstate kavramı ile alakası yoktur.

    iyi çalışmalar