2011-05-04 7 views
11

Satır içi fbml tekniği (iframe'in tersi) kullanılarak gömülmüş bir dizi "Beğen" düğmesi içeren bir sayfam var. Yeterince basit. Sayfa iyi işliyor, her şey beklendiği gibi çalışıyor. ANCAK Neden doğru fbml xmlns kullanarak <fb:xxx> fbml öğeleri karşılaşılırken DOM yeniden başvuruyor?

...

kez ben IE render zamanlarını başlangıç ​​sayfasının radikal bozulmasını fark ediyorum belgeye xmlns:fb="http://www.facebook.com/2008/fbml" ad alanı beyanı ekleyin. Daha yakından inceleme (ie8 geliştirici araçlarını kullanarak), DOM'ın tamamının, sayfanın yüklenmesinden kısa bir süre sonra tekrar tekrar "yenilenmesi" veya "yeniden" göründüğünü ortaya çıkarır. Bazı başka mutasyonlar, yeniden akıtma sayısının, belgede bulunan <fb:xxx> elemanının sayısı ile orantılı olarak orantılı olduğunu ortaya çıkarmaktadır.

xmlns bildiriminin kaldırılması sorunu ortadan kaldırır.

Bunu daha önce hiç kimse yaşadı mı?

GÜNCELLEME:

Bazı başka kazma biraz daha özelliklerini ortaya çıkarmıştır ... konu IE benzeri herhangi satır içi kodları yeniden yürütme ve dahil sayfayı yeniden aktığını gerçekten de öyle. Nedeni, xmlns'in kendi başına eklenmesi, butonların kendilerinin xfbml render edilmesi gibi görünmemektedir. Xmlns eklenmesi xmlns olmadan xfbml görüntülemeyi tetiklemiştir, düğmeler hiç bir zaman ilk sırada yer almaz. Aşağıdaki işaretleme sorunu göstermektedir.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en" xmlns:fb="http://www.facebook.com/2008/fbml"> 
    <head> 
    <script type="text/javascript"> 
     alert('some inline js'); 
    </script> 
    </head> 
    <body> 
    <div id="fb-root"></div> 

    <div> 
     <fb:like href="http://example.local/1" layout="button_count" show_faces="false" width="80" action="like" font="arial" colorscheme="light"></fb:like> 
     <fb:like href="http://example.local/2" layout="button_count" show_faces="false" width="80" action="like" font="arial" colorscheme="light"></fb:like> 
     <fb:like href="http://example.local/3" layout="button_count" show_faces="false" width="80" action="like" font="arial" colorscheme="light"></fb:like> 
    </div> 

    <script src="http://connect.facebook.net/en_US/all.js#xfbml=1" type="text/javascript"></script> 

    </body> 
</html> 

Örneğin, yukarıdaki örnek 3 uyarı oluşturur, yalnızca bir tane görmeyi beklerdim.

+0

, bu gerçekleşiyor [burada] (http://jsfiddle.net/alexdickson/NStxL/) senin için de? – alex

+0

@alex Sadece IE9'da bir uyarı alıyorum, artık test etmek için IE8'e sahip değilim – Phil

cevap

5

Facebook'ta yaşıyormuşsunuz bug 9777. Yeni all.js.'ın başlangıcından beri oldu. Gerçekten işe yaramayacak bir kaç girişimde bulunduğunu düşünüyorum. Önceliği geçen hafta bir çentik yukarı itilmiş gibi görünüyor. Bakalım yakında tamir edilsin.

Gördüğünüz sorun, DOM ağacının değiştirilmesinden kaynaklanmaz. Aslında, tetiklenen javascript, sayfanızda bile değil, "üst" sayfanızdır.

Komut dosyası, facebook komut dosyası tarafından oluşturulan fb:like öğelerinizin yerine iframe'leri içeriyor. o nereden geldiğini göreceksiniz

alert("This: " + window.location.href + "\nTop: " + window.top.location.href); 

:

yerine

"Bazı satır içi js", senin alert, aşağıdaki gösterir. "Bu" URL'lerinde, URL'nize eklenen bir grup parametreyle birlikte fb_xd_fragment göreceksiniz. Temel olarak facebook komut dosyası, her bir iframe penceresini, gördüğünüz URL'lere yönlendirir, bu da komut dosyalarınızı tekmelemektedir.

http://developers.facebook.com/docs/reference/javascript/FB.init/ onlar birçok kişi için çalışmış görünmüyor Çözüm olarak Özel Kanal URL ( channelURL) init param tartışır. Ve birçok kişi, channelURL olarak sağladıkları yolda sel talep ediyor.Sadece bir düşünce

 

... iframe yöntemini kullanarak düğmeleri "gibi" yükleme denediniz mi? Bu daha hızlı mıydı? Aksi

Eğer all.js script yükleme tembel deneyebiliriz ... Kayıt için

(function() { 
    var e = document.createElement('script'); 
    e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js#xfbml=1'; 
    e.async = true; 
    document.getElementById('fb-root').appendChild(e); 
}()); 
İlgili konular