Internet explorer 为什么ie在遇到<;fb:xxx>;正确使用fbml xmlns时的fbml元素?

Internet explorer 为什么ie在遇到<;fb:xxx>;正确使用fbml xmlns时的fbml元素?,internet-explorer,xml-namespaces,repaint,fbml,reflow,Internet Explorer,Xml Namespaces,Repaint,Fbml,Reflow,我有一个页面,其中包含许多facebook“Like”按钮,使用内嵌fbml技术嵌入其中(与iframe相反)。很简单。页面呈现良好,一切正常 然而 一旦我添加了xmlns:fb=”http://www.facebook.com/2008/fbml“文档的名称空间声明我注意到IE中初始页面呈现时间急剧下降。仔细检查(使用ie8开发工具)发现整个DOM似乎一次又一次地“刷新”或“回流”,在页面初始加载后的短时间内。进一步的研究表明,回流的数量显然与文档中元素的数量成正比 删除xmlns声明可以消除

我有一个页面,其中包含许多facebook“Like”按钮,使用内嵌fbml技术嵌入其中(与iframe相反)。很简单。页面呈现良好,一切正常

然而

一旦我添加了
xmlns:fb=”http://www.facebook.com/2008/fbml“
文档的名称空间声明我注意到IE中初始页面呈现时间急剧下降。仔细检查(使用ie8开发工具)发现整个DOM似乎一次又一次地“刷新”或“回流”,在页面初始加载后的短时间内。进一步的研究表明,回流的数量显然与文档中
元素的数量成正比

删除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>

警报(“一些内联js”);

在ie中运行时,上面的示例生成3个警报,我希望只看到一个。

您似乎正在体验facebook。它从新的all.js开始就存在了。我认为已经有几次尝试来修复它,但都没有真正起作用。看起来优先权在上周被提升了一个档次。让我们看看是否能很快修好

在任何情况下,您看到的问题都不是由修改DOM树引起的。事实上,被触发的javascript甚至不在您的页面中。。。你的“顶部”页面就是

该脚本位于facebook脚本创建的iFrame中,而不是您的
fb:like
元素

如果您的
警报显示以下内容,而不是“一些内联js”:

alert("This: " + window.location.href + "\nTop: " + window.top.location.href);
你会看到它是从哪里来的。在“This”url中,您将看到
fb\u xd\u fragment
以及附加到url的一系列参数。基本上,facebook脚本将每个iframe窗口重定向到您看到的URL,这将启动您的脚本

在本文中,他们讨论了将自定义频道URL(
channelURL
)init param作为一种解决方法,这似乎对许多人都不起作用。许多人在他们提供的通道URL上收到请求洪水

只是一个想法。。。您是否尝试过使用iframe方法加载“like”按钮?快一点吗

否则,您可以尝试延迟加载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);
}());

记录在案,这也发生在你身上吗?@alex我只收到IE9中的一个警报,不再需要测试IE8