使用 SoundJS 离开网页会导致 Google Chrome 崩溃

Leaving a webpage with SoundJS causes Google Chrome to crash

我有一个网页 index.php,其中包含 link 到 sound.php。在 sound.php 上,使用 SoundJS 播放声音。

当我从 sound.php 导航到 index.php 时,Google Chrome 通常(但不总是)显示一条错误消息 ("Aw, Snap!"): https://support.google.com/chrome/answer/95669?hl=en

我正在使用 Chrome 40 作为 Mac OS。我使用 link 还是浏览器的后退按钮并不重要。

这是我的代码:

sound.php 调用一个使用 SoundJS 的 JS 函数:

<script type="text/javascript">      
  var int = [0, 7];
  prepareAudio();  
</script>

一旦我删除这段代码,浏览器就不会再崩溃了。

prepareAudio() 在外部文件中:

function prepareAudio() {   

  // Try WebAudio or HTMLAudio
  createjs.Sound.initializeDefaultPlugins();

  // Try flash otherwise
  if (!createjs.Sound.isReady()) {
    // Flash plug-in is not default
    createjs.FlashPlugin.swfPath = "../audio/";

    // Enable flash support
    $.getScript("../../js/flashplugin-0.6.0.min.js");

    // Prefer WebAudio over HTMLAudio. Prefer HTMLAudio over Flash.
    createjs.Sound.registerPlugins([createjs.WebAudioPlugin, createjs.HTMLAudioPlugin, createjs.FlashPlugin]);
    }

  // Get audio files
  var audioPath = "../audio/";

  var manifest = [];
  for (var i = 0; i< audioFiles.length; i++)
    manifest.push({id: audioFiles[i], src: audioPath + audioFiles[i] + ".ogg"});

  // Play audio 
  var queue = new createjs.LoadQueue(); 
  createjs.Sound.alternateExtensions = ["mp3"];
  queue.installPlugin(createjs.Sound);
  queue.addEventListener("complete", function() {playTask(int);});
  queue.loadManifest(manifest);
  createjs.Sound.registerSounds(manifest, audioPath);
}

涉及更多代码。我使用

播放声音
  createjs.Sound.play(mySound); 

音频在 Chrome 和其他浏览器中播放正常。

当页面失去焦点时,chrome 会减少页面的可用资源量。通常,这没什么大不了的,但是当您处理声音时,它可能会导致一些非常奇怪的行为。

您可以使用 window.onblur 检测页面何时失去焦点。当 window 失去焦点时,您应该尝试减少 javascript 使用的资源。如果可行,您就找到了罪魁祸首。如果没有,您可能应该向 google.

提交错误报告

正如 gskinner 所指出的,该问题可以在其他网站上重现。它也可以在仅使用单个音频资源的页面上复制。

此问题特定于 Chrome 40(或至少是 Chrome 的最新版本)。它不特定于某些版本的 SoundJS。

使用其他浏览器似乎是唯一的解决办法。

它似乎已在新的 Chrome 版本 40.0.2214.115 中修复,但 OJay here 的解决方法帮助我在 Chrome 修复之前解决了这个问题:

var isChrome40 = navigator && navigator.userAgent &&
navigator.userAgent.match("40.0.2214.111");
if (isChrome40) {
    createjs.Sound.registerPlugins([createjs.HTMLAudioPlugin]);
}`