Почему то есть, по-видимому, перекомпоновка DOM при обнаружении <fb: xxx> элементов fbml при правильном использовании fbml xmlns?
У меня есть страница, содержащая несколько кнопок "Мне нравится" на Facebook, встроенных с использованием встроенного метода fbml (в отличие от iframe). Достаточно просто. Страница отображается нормально, все работает как положено.
ТЕМ НЕ МЕНИЕ...
Как только я добавлю xmlns:fb="http://www.facebook.com/2008/fbml"
объявление пространства имен к документу Я заметил радикальное ухудшение начального времени отображения страницы в IE. Более тщательный анализ (с использованием инструментов разработчика ie8) показывает, что весь DOM, по-видимому, "обновляется" или "обновляется" снова и снова в течение короткого периода времени после первоначальной загрузки страницы. Некоторые дальнейшие оскорбления показывают, что количество повторений, по-видимому, пропорционально количеству <fb:xxx>
элементы в документе.
Удаление объявления xmlns устраняет проблему.
Кто-нибудь испытывал это раньше?
ОБНОВИТЬ:
Дальнейшее копание выявило еще некоторые особенности... Проблема действительно в том, что IE повторно отображает страницу, включая повторное выполнение любых встроенных сценариев и так далее. Причина, по-видимому, заключается не в включении самого xmlns, а в отображении самих кнопок в xfbml. Добавление xmlns просто вызвало рендеринг xfbml, без xmlns кнопки никогда не отображались в первую очередь. Следующая разметка иллюстрирует проблему.
<!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>
При запуске в ie, приведенный выше пример генерирует 3 оповещения, я ожидаю увидеть только одно.
1 ответ
Вы, похоже, испытываете ошибку Facebook 9777. Это было вокруг с начала нового all.js. Я думаю, что было несколько попыток исправить это, но это не сработало. Похоже, приоритет только что поднялся на ступеньку выше на прошлой неделе. Давайте посмотрим, будет ли это исправлено в ближайшее время.
В любом случае, проблема, которую вы видите, не вызвана изменением дерева DOM. На самом деле, запускаемый javascript отсутствует даже на вашей странице... на вашей "верхней" странице.
Сценарий находится в iframes, созданных сценарием Facebook вместо вашего fb:like
элементы.
Вместо "некоторых встроенных JS", если ваш alert
показывает следующее:
alert("This: " + window.location.href + "\nTop: " + window.top.location.href);
Вы увидите, откуда это исходит. В "Это" URL вы увидите fb_xd_fragment
вместе с целой кучей параметров, добавленных к вашему URL. По сути, скрипт facebook перенаправляет каждое окно iframe на URL-адреса, которые вы видите, что запускает ваши скрипты.
В http://developers.facebook.com/docs/reference/javascript/FB.init/ они обсуждают URL пользовательского канала (channelURL
) инициировать параметр как обходной путь, который, похоже, не работает для многих людей. И многие люди получают потоки запросов на пути, который они предоставляют как channelURL.
Просто мысль... Вы пытались загрузить кнопки "лайк", используя метод iframe? Это было быстрее?
В противном случае вы можете попробовать лениво загрузить скрипт all.js...
(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);
}());