【问题标题】:Somehow pause or sleep javascript on iOS Safari在 iOS Safari 上以某种方式暂停或休眠 javascript
【发布时间】:2025-11-29 16:10:01
【问题描述】:

我有一段 javascript,我正在播放这样的声音......

var audio = document.createElement('audio');
audio.src = 'folder/test.wav';
audio.play();

我需要播放多个分开的文件,以便您知道它在说什么。 iOS 不允许您使用 setTimeout。我在单独的函数中尝试过,但在使用 setTimeout 时它无法发出第二个音频剪辑。还有其他想法吗?

编辑

我有这个功能:

function playaudio(file) {
    var audio = document.createElement('audio');
    audio.src = 'folder/'+file+'.wav';
    audio.play();
}

这样称呼它:

playaudio("test1");
playaudio("test2");

我只需要它在 test1 和 test1 之间暂停,这样它们就不会一起玩。有什么想法吗?

【问题讨论】:

  • setTimeout 在移动版 Safari 中 100% 有效。
  • 也许它正在工作并且它无法播放额外的音频剪辑?它在浏览器中运行良好,在 iOS 中失败。
  • 贴出失败的代码,说不定会有人教你怎么解决。
  • 这可能与自动播放属于同一类别。查看this answer。这是这个工作的fiddle,但它是由点击事件初始化的。

标签: javascript jquery ios


【解决方案1】:

setTimeout() 适用于 iOS。这个问题可能与浏览器如何处理<audio><video> 内容有关。

iOS 仅会在用户输入触发时播放 <audio><video> 内容。您提到您对第一个剪辑的初始audio.play() 调用工作正常,所以我猜它是用户触发的。问题是 setTimeout() clear the call stack 内部的函数,所以它们可能不再被浏览器认为是用户驱动的,即使它们之前有一个点击事件。

最简单的解决方案是将多个音频片段合并为一个。您还可以在开始时用静音填充您想要延迟的剪辑,并在点击事件之后立即播放它们(假设您的目标操作系统版本一次支持多个音频对象)

【讨论】:

  • 我考虑过...但是考虑到我需要考虑的所有变化,我可以从服务器上的 30 个剪辑增加到数千个。
  • 顺便说一句,您正在开发应用程序吗?在这种情况下,您可以覆盖此限制:*.com/questions/15731667/…
【解决方案2】:

您可以使用 iOS Native 代码来触发 Javascript 方法调用:

[webViewObject stringByEvaluatingJavaScriptFromString:@"playNextSound();"];

其中playNextSound是UIWebView加载的页面中定义的JS方法。 除了 setTimeout 之外,您还可以使用 NSTimer 使用本机计时器来分隔您的音频播放。

【讨论】: