【问题标题】:New Facebook like button HTML validation新的 Facebook 按钮 HTML 验证
【发布时间】:2011-02-15 05:44:40
【问题描述】:

在我的页面上添加新的 facebook like 按钮后,它不再使用 XHTML 严格标准进行验证。我遇到的两个错误是:

  1. 所有的元属性标签都说没有属性属性
  2. 在like 按钮行中使用的所有变量都列出,没有属性。该行如下:

    <fb:like href="http://www.pampamanta.org" layout="button_count" show_faces="false" width="120" action="like" font="arial" colorscheme="light"></fb:like>

【问题讨论】:

标签: html facebook


【解决方案1】:

这是一个不交换文档类型的解决方案:

正如 zerkms 所建议的,添加“fb”命名空间仅适用于“fb:”属性。元标记的“property”属性仍然是无效的 XHTML。

如您所知,Facebook 建立在 RDFa 合规性之上,因此您可以使用以下文档类型:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd"> 

在大多数情况下,使用 RDFa 带来的问题比简单的 FB 问题修复要多。

正如 _timm 建议的那样,将元标记动态写入 dom 没有任何意义。这些 fb 元标记的主要用途之一是 FB-bot 解析“分享”或“我喜欢”目标页面(操作页面),以为 Facebook 墙帖自动填充提供自定义标题、图像和锚标签。鉴于这一事实以及 facebook 最肯定使用简单的页面获取来读取交付的 html 响应而没有任何解析由 javascript 注入的相关元标记的能力这一事实,预期的功能将完全失败。

现在,有一个非常简单的修复方法可以在 XHTML 验证和 facebook 成功解析之间提供折衷:将 facebook 元数据包装在 html cmets 中。这绕过了 w3c 解析器,facebook 仍然可以识别元标记,因为它忽略了评论。

<!--
<meta property="og:image" content="myimage.jpg" />
<meta property="og:title" content="my custom title for facebook" />
-->

【讨论】:

  • 我刚刚在我的网站上测试了 Facebook 元注释解决方案,它奏效了。 Facebook 仍然会读取元标签,即使它们已被注释掉。我的页面现在通过 W3C 验证。很好的解决方案。
  • 我刚刚对此进行了测试,Facebook 忽略了 cmets 并恢复为从 DOM 中获取数据。对于其他想要测试他们从哪里获取数据的人,这里是FB's Linter
【解决方案2】:

从今天开始,您还可以使用符合 HTML5 的标记

例如而不是

<fb:like href="example.org">

你可以的

<div class="fb-like" data-href="example.org">

由于 data-* 属性在 HTML5 中有效

【讨论】:

    【解决方案3】:

    只是一个跟进,以防有人使用评论方法。 Facebook 目前支持 cmets,因此在 cmets 中包装元属性标签会导致 Facebook 忽略它们。如果您使用 Facebook URL Linter 检查您的页面,您会发现它们没有使用注释掉的元标记。

    【讨论】:

      【解决方案4】:

      FBML 不会验证,因为它不是有效的 XHTML。 W3C 验证器不知道如何处理它。可以安全地忽略这些错误。

      如果您必须进行验证,您可以使用&lt;script&gt; 标记来输出 FBML,而不是直接将其包含在页面的 HTML 中。

      【讨论】:

      • XHTML 是 X HTML,因为它是 X 可伸缩的。 w3c 验证器可以通过正确的xmlns 规范获取fb: 标签描述
      • 我很难让验证器获取像 FBML 这样的扩展命名空间,但那是不久前的事了。
      【解决方案5】:

      @Eric 我希望你最终找到了你要找的东西。

      如果您想让开发人员能够在不考虑 XHTML Strict 1.0 或 HTML5 的情况下进行验证,那么 Twitter 集成就会遇到困难。另一方面,Facebook 的自定义 FBML 标签完全不可能。

      在我们上一个项目中,我和我的朋友 Jason 肯定知道两件事:

      1. 我们将使用 Facebook 的 Like 按钮验证 XHTML Strict 1.0
      2. 我们不会通过伪造 DOCTYPE 或 xmlns 来添加技术债务

      解决方案是使用灵活的异步 JavaScript 模块。谢天谢地,我们一路上得到了一些帮助和指导:http://techoctave.com/c7/posts/40-xhtml-strict-tweet-button-and-facebook-like-button

      【讨论】:

        【解决方案6】:

        您是否尝试过添加xmlns:fb="http://www.facebook.com/2008/fbml"

        【讨论】:

          【解决方案7】:

          您可以通过 document.write 将 html 标签嵌入到脚本中。 http://www.tymsh.com/2010/06/25/sitenize-facebook-like-begen-butonu-ekleyin/ 这里有一个例子。

          【讨论】:

          • 这不是一个好主意,因为点赞按钮会起作用,但是当 facebook 来索引你的页面时,它不会运行 javascript document.write 所以它不会看到标签
          【解决方案8】:

          对于使用"&lt;javascript... document.write... 的剂量,document.write 不是有效的 DOM 过程,因此在 Fire Fox 和 Chrome 中,如果您在内容类型为 text/xml 的 XML/XHTML Strict 中使用它,则不起作用。

          适合我的有效 DOM 方法:

          <div id="FbCont">
                  <script src="http://connect.facebook.net/en_US/all.js#xfbml=1" type="text/javascript"></script>
          
                  <script type="text/javascript">
          <!--//--><![CDATA[//><!--
          var fb = document.createElement('fb:like'); 
          fb.setAttribute("href","http://www.cirugia-obesidad.mx"); 
          fb.setAttribute("layout","button_count");
          fb.setAttribute("show_faces","true");
          fb.setAttribute("width","100");
          fb.setAttribute("font","arial");
          document.getElementById("FbCont").appendChild(fb);
          //--><!]]>
          </script>
          
                  </div>
          

          希望这对其他人有用。

          韦尔奇

          【讨论】:

            【解决方案9】:

            回复:韦尔乔

            发现脚本类型对我造成了错误(XHTML 1.0 过渡)。还为那些可能错过的人添加了。

            Your's 是迄今为止我在网上看到的最好和最容易使用的。又看了一遍——哈!你是最棒的:)

            干杯和感谢 :)

            <div id="fb-root"></div>   
            
            <div id="FbCont">
            <script type="text/javascript" 
            src="http://connect.facebook.net/en_US/all.js#appId=XYOURIDXyourapID=1">
            </script>
            <script type="text/javascript">
            <!--//--><![CDATA[//>
            <!--
            var fb = document.createElement('fb:like'); 
            fb.setAttribute("href","http://www.wakawakblahblah.com"); 
            // fb.setAttribute("layout","button_count");
            fb.setAttribute("send","true");
            fb.setAttribute("action","recommended");
            fb.setAttribute("show_faces","false");
            fb.setAttribute("width","280");
            fb.setAttribute("font","trebuchet ms");
            document.getElementById("FbCont").appendChild(fb);
            //--><!]]>
            </script>
            </div>
            

            【讨论】:

              【解决方案10】:

              总是把它注释掉。

              对于fb:like

              <script language="javascript" type="text/javascript">
              //<![CDATA[
              document.write('<fb:like href="http://www.c-p-p.net" layout="button_count" show_faces="false" width="90" action="like" font="arial" colorscheme="light"></fb:like>');
              //]]>
              </script>
              

              还有标题中的元数据

              <!--
              <meta property="og:title" content=" some title" />
              <meta property="og:type" content="website" />
              <meta property="og:url" content="http://c-p-p.net/" />
              <meta property="og:image" content="site image" />
              <meta property="og:site_name" content="site name" />
              <meta property="og:description" content="description text" />
              <meta property="fb:admins" content="some number" />
              -->
              

              修复 javascript 标签添加 type="text/javascript"

              <script type="text/javascript">(function(d, s, id) {
                var js, fjs = d.getElementsByTagName(s)[0];
                if (d.getElementById(id)) return;
                js = d.createElement(s); js.id = id;
                js.src = "//connect.facebook.net/en_EN/all.js#xfbml=1";
                fjs.parentNode.insertBefore(js, fjs);
              }(document, 'script', 'facebook-jssdk'));</script>
              

              对于 iframe 版本

              <script language="javascript" type="text/javascript">
              //<![CDATA[
              document.write('<iframe src="//www.facebook.com/plugins/likebox.php?href=http%3A%2F%2Fwww.facebook.com%..... allowTransparency="true"></iframe>');
              //]]>
              </script>
              

              它适用于我的网站http://c-p-p.net

              【讨论】:

                【解决方案11】:

                我最近用过:

                <script type="text/javascript">
                document.write('<fb:like href="http://www.mywebsite.co.uk" layout="button_count" show_faces="true" width="100"></fb:like>');
                </script>   
                

                它似乎工作正常,即使它有点臭。

                【讨论】:

                  【解决方案12】:

                  好的,在浏览了数百篇这样的帖子之后,我终于找到了一种快速简便的方法来获得一个带有“赞”按钮(或任何其他 Facebook 小部件)的有效页面。

                  真的就几行代码,看看http://www.liormark.com/develop/development-articles/facebook-fbml-w3c-validation-solved

                  【讨论】:

                  • 为了防患于未然,本页代码为:
                  【解决方案13】:

                  这里有一个很好的解决方案。如果您要使用 document.write,请按如下所示使用它,它将完美验证

                  <script type="text/javascript">
                  //<![CDATA[
                  (function() {
                      document.write('<a href="https://twitter.com/share" data-count="vertical" data-via="siteripe">Tweet</a>');
                      var s = document.createElement('SCRIPT'), s1 = document.getElementsByTagName('SCRIPT')[0];
                      s.type = 'text/javascript';
                      s.async = true;
                      s.src = 'http://platform.twitter.com/widgets.js';
                      s1.parentNode.insertBefore(s, s1);
                  })();
                  //]]>
                  </script>
                  

                  【讨论】:

                    【解决方案14】:

                    我用过这段代码,它对 W3C Validator 有效。

                    <script type="text/javascript">
                    <!--//--><![CDATA[//><!--
                        document.write('<fb:like href="http://www.pampamanta.org" layout="button_count" show_faces="false" width="120" action="like" font="arial" colorscheme="light"></fb:like>');
                        //--><!]]>
                    </script> 
                    

                    【讨论】:

                      【解决方案15】:

                      这是验证任何标签或无法识别的代码的纯粹解决方案(技巧)!

                      我使用 smarty 作为模板引擎,但如果你不这样做也可以这样做!

                      我想出了更多的技巧而不是解决方案(因为到目前为止还没有解决方案),只是让 W3C Validator 通过不向其显示那些元字符串来通过验证。

                      当 Validator 使用 PHP 引用我的页面时,我不会呈现 W3C Validator 无法识别的内容。我只是通过提取 W3C Validator 发送的标头信息来做到这一点,它是用户代理,是 W3C_Validator/version。

                      1. 创建 PHP 函数并将其分配给 Smarty:

                        function User_Agent_Check($user_agent) {
                          $user_agent_check = strpos($_SERVER['HTTP_USER_AGENT'], $user_agent);
                            if ($user_agent_check === false) {
                                return false;
                            } else {
                                return true;
                            }
                        }
                        
                      2. 那么我们来检查一下用户代理:

                        if (User_Agent_Check("W3C_Validator")) {
                           $smarty->assign('W3C', "1");
                         } else {
                           $smarty->assign('W3C', "0");
                        }
                        
                      3. 然后在您使用的 Smarty 模板中(如果您不使用 Smarty,只需使用 PHP 'echo' 内容):

                        {if $W3C == 0}
                         <meta property="og:url" content="">
                         <meta property="og:title" content="">
                         <meta property="og:description" content="">
                         <meta property="og:type" content="video">
                         <meta property="og:image" content="">
                         <meta property="og:video" content="">
                         <meta property="og:video:type" content="application/x-shockwave-flash">
                         <meta property="og:video:width" content="1920">
                         <meta property="og:video:height" content="1080">
                         <meta property="og:site_name" content="">
                         <meta property="fb:app_id" content="">
                         <meta name="twitter:card" content="">
                         <meta name="twitter:site" content="">
                         <meta name="twitter:player" content="">
                         <meta property="twitter:player:width" content="1920">
                         <meta property="twitter:player:height" content="1080">
                        {/if}
                        

                      当验证器尝试检查您的页面时,这些元标记不会输出到页面!当任何其他用户代理看到您的页面时,这些代码就会像往常一样输出!您可以为 Facebook Like Button 或任何 OG Metatags 执行此操作 - 实际上对于其他任何内容。

                      这对我来说恰好是时代精神的正确解决方案!

                      【讨论】:

                      • 重点很明显——大多数人想要验证不受支持的标签。这就是重点和我的解决方案。容易和工作。虽然并不完美 - 但我认为这里没有完美的决定!
                      • 但是你为什么要验证每个人真正看到的页面是否无效有效?我关心有效 HTML 的唯一原因是如果我担心浏览器切换到怪癖模式或其他东西,他们会这样做。
                      • 好吧,好吧!然后我将稍后调整我的代码,以便这些标签仅显示特定:例如 Facebook、Twitter 或 Google!在所有其他情况下,它将被隐藏,包括浏览器,并会阻止它们进入怪癖模式?这些标签只对某些应用程序(网站)很重要,那么为什么我们不只为它们显示这些标签呢?这个怎么样?
                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-10-18
                      • 2013-01-22
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2013-08-10
                      • 1970-01-01
                      相关资源
                      最近更新 更多