如果使用 JavaScript 动态构建标记,Schema.org 标记是否有效?

Does Schema.org markup work if markup is dynamically built with JavaScript?

我有一个页面,其中一些事件是通过读取一些 JSON 和 JavaScript 来动态加载的。我使用 Event Schema.org 标记为每个事件构建一个 div

Google 的测试工具不读取此标记。是因为标记错误,还是因为动态加载?

一个Event的HTML代码是:

<div class="evento well" itemscope itemtype="http://schema.org/Event">
   <meta itemprop="startDate" content="2015-03-20T20:00:00.000Z">
   <meta itemprop="endDate" content="2015-01-21T20:00:00.000Z">
   <div class="dataEvento">
      <div class="dayWeekEvento">venerdì</div>
      <div class="dayNumEvento">20</div>
      <div class="monthEvento">Marzo</div>
   </div>
   <div class="datiEvento">
      <div class="oraEvento">ore 21:00</div>
      <div class="titoloEvento"><span itemprop="name">Titolo evento</span></div>
      <div class="luogoEvento" itemprop="address" itemscope="" itemtype="http://schema.org/PostalAddress"><a href="https://www.google.it/maps/place/Milano" target="_blank"><span class=" glyphicon glyphicon-map-marker" aria-hidden="true"></span> <span itemprop="addressLocality">Milano</span></a></div>
   </div>
</div>

Google’s documentation 只提到如果使用语法 JSON-LD,它们可以使用动态添加的结构化数据:

Also, Google can read JSON-LD data even when it is dynamically injected into the page's contents, such as by Javascript code or embedded "widgets".

这并不一定意味着他们无法阅读其他语法(如 Microdata 或 RDFa),但至少他们没有记录它。

他们的 testing tool 不读它可能意味着也可能不意味着什么(它 可能 是该工具不处理这个但他们的内部系统可以).但是,您的实际标记应该没有问题,因为您可以通过粘贴标记而不是输入 URL.

来轻松地自行测试它

这取决于它是什么类型的标记。来自 Google:

JSON-LD is supported for all Knowledge Graph features, sitelink search boxes, Event Rich Snippets, and Recipe Rich Snippets; Google recommends the use of JSON-LD for those features. For the remaining Rich Snippets types and breadcrumbs, Google recommends the use of microdata or RDFa.

它应该可以工作,但我知道有人报告了测试工具的问题。

如果您在使用 Google 测试工具验证架构标记时遇到问题,您可以使用 JS 创建 json-ld 代码段,如果需要,它还允许您操作数据,例如:

<script> 
    (function(){
       var data = {
            "@context": "http://www.schema.org",
            ...
        }
        var script = document.createElement('script');
        script.type = "application/ld+json";
        script.innerHTML = JSON.stringify(data);
        document.getElementsByTagName('head')[0].appendChild(script); 
    })(document);
</script>