使用JSONP同步AJAX请求

Synchronous AJAX request with JSONP

本文关键字:请求 AJAX 同步 JSONP 使用      更新时间:2023-09-26

我的理解是,iPhone上的Safari不会播放来自异步线程的音频(html5)。这是为了限制音频的播放,使其仅是对用户交互的响应,例如点击按钮。然而,这给我带来了一个问题。我希望通过点击按钮来播放声音,但点击按钮后,我需要建立要播放的mp3文件的地址,我目前正在通过异步AJAX调用来完成这项工作,如下所示:

function play() {
    $.ajax({
        url: 'http://apifree.forvo.com/etc/etc', jsonpCallback: "pronounce", jsonp: false, cache: true,           dataType: "jsonp",
        success: function (json) {
            if (json.items.length !== 0) {
                _player.src = json.items[0].mp3path;
                _player.load();
            }
        },
        error: function () {
        }
    });
}

正如你所看到的,我正在回调中调用_player.load()(随后调用_player.play()),这在iphone上不起作用,但在我的电脑上会起作用。我如何使这个AJAX调用同步,或者我如何解决这个问题?

这里有两个技巧来证明这个问题:

异步_player.load()不适用于iPhone,但适用于PC:http://jsfiddle.net/8muHa/27/

在iPhone和PC上同时工作的Syncronous _player.load():http://jsfiddle.net/8muHa/28/

如果必须异步加载文件名,可以预取吗?如果没有太多这样的值,那么只需预取这些值(比如当用户导航到网站的此部分时),然后在单击按钮时调用_player.play()就可以了。