【问题标题】:Turbolinks and autoplay HTML5 videoTurbolinks 和自动播放 HTML5 视频
【发布时间】:2018-06-15 19:08:05
【问题描述】:

我刚刚开始了一个 Rails 5 项目,在主页上我应该有一个视频横幅,静音,循环自动播放。我用的是Turbolinks 5,不知道能不能留着。

当我第一次加载主页时,一切正常。但是当我转到任何其他页面时,开始播放主页视频的声音。如果我回到家,声音会再次响起,而不是之前响起的声音。

所以我有多个同时播放静音视频的声音实例。

一开始很有趣,5 秒后是噩梦。

我已经看到了这个问题:https://github.com/turbolinks/turbolinks/issues/177,它仍然是开放的,在 cmets 中没有实际的解决方案。

显然这不是新的,这篇帖子https://www.ruby-forum.com/topic/6803782 似乎在谈论 2015 年的同样问题。这家伙谈到禁用指向该页面的链接的 Turbolinks。我做不到,因为我的问题在主页上。

【问题讨论】:

  • 如果禁用整个网站的 turbolink 会发生什么?
  • 它只是工作。这是一个简单的解决方案,但这是一个耻辱。 2016 年禁用 Turbolinks。
  • 我同意。但至少它可以肯定地告诉你这是 turbolinks 中某处的问题

标签: ruby-on-rails video html5-video turbolinks


【解决方案1】:

这是由于 Turbolinks 缓存了主页 DOM 的副本。即使视频不可见,它仍然存在于缓存中,因此会播放。 (但是,我不确定为什么它没有被静音——这可能是一个浏览器错误:/)

我认为 Turbolinks 可以默认处理这个问题,但与此同时,这里有几个选项:

解决方案 1:在首页禁用缓存

为防止 Turbolinks 缓存主页的副本,您可以禁用该页面的缓存。例如,您可以在布局的<head> 中包含以下内容:

<% if @turbolinks_cache_control %>
  <meta name="turbolinks-cache-control" content="<%= @turbolinks_cache_control %>">
<% end %>

然后在您的主页视图中:

<% @turbolinks_cache_control = 'no-cache' %>

缺点是当访问者重新访问主页时,您会错过性能优势。

解决方案 2:跟踪 autoplay 元素

或者,您可以跟踪autoplay 元素,在缓存页面之前删除autoplay 属性,然后在呈现之前重新添加它。与Persisting Elements Across Page Loads 类似,此解决方案要求autoplay 元素具有唯一ID。

在您的应用程序 JavaScript 中包含以下内容:

;(function () {
  var each = Array.prototype.forEach
  var autoplayIds = []

  document.addEventListener('turbolinks:before-cache', function () {
    var autoplayElements = document.querySelectorAll('[autoplay]')
    each.call(autoplayElements, function (element) {
      if (!element.id) throw 'autoplay elements need an ID attribute'
      autoplayIds.push(element.id)
      element.removeAttribute('autoplay')
    })
  })

  document.addEventListener('turbolinks:before-render', function (event) {
    autoplayIds = autoplayIds.reduce(function (ids, id) {
      var autoplay = event.data.newBody.querySelector('#' + id)
      if (autoplay) autoplay.setAttribute('autoplay', true)
      else ids.push(id)
      return ids
    }, [])
  })
})()

此脚本在页面缓存之前获取所有autoplay 元素,将每个ID 存储在autoplayIds 中,然后删除autoplay 属性。当一个页面即将被渲染时,它会遍历存储的 ID,并检查新正文是否包含具有匹配 ID 的元素。如果是,则重新添加autoplay 属性,否则将ID 推送到新的autoplayIds 数组。这可确保autoplayIds 仅包含尚未重新渲染的 ID。

【讨论】:

    猜你喜欢
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多