html - 在 <p> 标签中嵌入 <video> 标签会破坏 chrome 和 firefox 中的 <video> 标签

标签 html html5-video

我在 HTML5 video 标签中发现了这个问题,这让我很困惑。如果我在段落标签中嵌入视频标签,它会在某些浏览器中停止正常工作。

任何人都可以对此有所了解吗?

视频标签有点棘手,所以这个问题需要解释一下。为了说明这一点,这里有一个您可以运行的 HTML5 页面。它使用来自 Microsoft 网站的方便的 .mp4 测试视频:

<!DOCTYPE html>
<html>
  <head><title>video with no para</title></head>
  <body>
    <video controls>
    <source src="http://ie.microsoft.com/testdrive/graphics/videoformatsupport/big_buck_bunny_trailer_480p_high.mp4"
        type='video/mp4'/>
      These words and the button below should not be visible
      in an HTML5 browser
      <form method='get' action='www.microft.com'>
          <input type='submit' value='MS Home'</form>
    </video>
  </body>
</html>

一个 HTML5 video 标签可以有一个或多个 source 标签,每个标签提供某种格式的视频。浏览器将显示一个它可以处理的视频。为了应对不理解 HTML5 的浏览器,video 标签可以在 source 标签之外包含额外的内容。 HTML5 浏览器应该忽略这些额外的东西。非 HTML5 浏览器应忽略任何它不理解的标签(在本例中为视频和源),因此它将忽略视频并只呈现其他内容。在现实世界中,其他东西通常会提供一些下载和播放视频的方法。在此示例中,其他内容是一些文本和一个显示按钮的表单。

所以,不同的浏览器会以不同的方式显示这个页面。最新版本的 Chrome 和 IE 理解 HTML5,它们知道如何呈现 .mp4 源,因此它们应该呈现视频。他们不应显示文本或按钮。

最新版本的 Firefox 可以处理 HTML5,但不知道如何播放 .mp4。它需要一个 ogg 格式的视频。它通过在视频应该出现的地方显示一个黑框来解决这个问题。但是,再一次,它不应该显示文本或按钮。

这些不支持 HTML5 的旧版浏览器应该只显示文本和按钮。

上面显示的 HTML 按预期工作。如果我在视频部分周围加上段落,就会出现问题:

<!DOCTYPE html>
<html>
  <head><title>video with para</title></head>
  <body>
    <p>
      <video controls>
      <source src="http://ie.microsoft.com/testdrive/graphics/videoformatsupport/big_buck_bunny_trailer_480p_high.mp4"
          type='video/mp4'/>
    These words and the button below should not be visible
    in an HTML5 browser
    <form method='get' action='www.microft.com'>
        <input type='submit' value='MS Home'</form>
      </video>
    </p>
  </body>
</html>

IE 版本 9 工作正常 – 它显示没有文本和按钮的视频。

Chrome 版本 17.0.963.56 m 显示视频,忽略文本,但它会显示视频面板下方的按钮。

Firefox 9.0.1 和以前一样显示黑框,但它也显示按钮。

如果这只发生在一个浏览器上,我会假设这是一个简单的错误。令我困惑的是,Chrome 和 Firefox 中的中断方式相同。

当然,您可能会争辩说用 para 标签包装视频没有任何意义,但在我看来这应该不会造成问题。另外,我想知道还有哪些包装器可能会破坏它。

Firebug shows how the HTML is interpreted

最佳答案

我认为问题在于 form元素作为 p 的后代无效元素。浏览器尝试尽可能地解释文档,这导致屏幕截图中显示的 DOM,带有 form。元素显示为 p兄弟元素,而不是后代。

您可以在 HTML5 规范中遵循这一点。关于 p element 的部分告诉我们它需要“措辞内容”。关于措辞内容的部分准确地告诉我们哪些元素属于该类别。 form不是其中之一。

如果您查看关于 form element 的部分, 它表明 form元素属于“流内容”类别。

您可以使用 W3C 验证器进一步确认这一点。我已将这两个示例页面上传到 Web 服务器(validinvalid)以便您可以看到验证结果:

请注意,在这两种情况下,我都稍微修改了代码,以关闭 input在问题的两个示例中都未闭合的元素。

关于html - 在 <p> 标签中嵌入 <video> 标签会破坏 chrome 和 firefox 中的 <video> 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9553830/

相关文章:

javascript - 在 JavaScript 中,满足条件时尝试重新加载页面

javascript - 如果服务器上的 src 文件更改为另一个同名视频,则重新加载视频

ios - webkit 在 ipad/iphone 上是否全屏?

javascript - 如何获取 HTML5 <video> 元素中每一帧的像素数据

java - 使用 Thymeleaf 创建在新窗口/标签页中打开的链接

html - Font Awesome 图标悬停在文本之外

javascript - Angular JS 在 http 请求后不填充 html

javascript - WebRTC RTCPeerConnection 未建立

javascript - 如何在给定事件发生之前锁定 HTML5 中的 <video> 控件?

iphone - android 和 IOS 上加载什么 h.264 格式?