我正在尝试在js中播放音频文件。我究竟做错了什么?
脚本在某些事件发生后会自动停止,该事件可以100%运行,现在我要做的就是在停止后添加声音

这是其中的代码:

function stop() {
    stop_flag = true;
    var audio = new Audio('play.mp3');
    audio.play();
}

这是函数的完整script.js在底部。
chrome.runtime.onMessage.addListener(function(message) {
    if (message.action == "init") {
        init(message.options.divider, message.options.delay, message.options.maxLosses);
    }

    if (message.action == "stop") {
        stop();
    }
});

var stop_flag;

function init(divider, delay, maxLosses) {

    var $table = $('table.dice_table').last();
    var lastBetNumber;
    var lastBetValue;
    var lastProfit;
    var losses = 0;

    stop_flag = false;

    loop_start();

    function loop_start() {

        lastBetNumber = getLastBetNumber();

        var betValue = (getCurrentBalance() / divider).toFixed(9);

        //var betValue = (getCurrentBalance() / divider);

        lastBetValue = betValue;

        $("input.bet").val(betValue);

        play();

        setTimeout(loop, delay);

    }

    function loop() {

        if (stop_flag)
            return;

        waitForTableChange()
            .then(roll)
            .catch(loop_start);

        function roll() {
            //only if the last bet has changed \/

            lastBetNumber = getLastBetNumber();

            lastProfit = $table.children('tbody').children('tr').first().children('td').last().text()[0];

            changeBet();

            if (losses >= maxLosses)
                return;

            play();

            setTimeout(loop, delay);
        }

    }

    function waitForTableChange() {
        return new Promise(function(resolve, reject) {

            var n = 0;

            attempt();

            function attempt() {
                n++;

                if (n >= 100) {
                    reject();
                    return;
                }

                if (getLastBetNumber() == lastBetNumber) {
                    setTimeout(attempt, 100);
                    return;
                }

                resolve();
            }
        });
    }

    function changeBet() {

        var newBetValue;

        if (lastProfit == "-") {
            losses++;
            newBetValue = lastBetValue * 2;
        } else {
            losses = 0;
            newBetValue = (getCurrentBalance() / divider).toFixed(9);
        }

        lastBetValue = newBetValue;

        $("input.bet").val(newBetValue);

    }

    function play() {
        $('input.clDicePlay').first()[0].click();
    }

    function getLastBetNumber() {
        return $table.children('tbody').children('tr').first().children('td').first().text();
    }

    function getCurrentBalance() {
        return $('.dice_select .chosen-single span').text().split('- ')[1].split(' ')[0];
    }

}

function stop() {
    var audio = new Audio('play.mp3');
    stop_flag = true;
audio.play();
}

最佳答案

问题是您正在函数audio中设置stop(),这使其在该函数中处于本地状态。一旦函数执行完毕,所有本地var都将被销毁。您需要使用全局范围来使对象保持 Activity 状态。

例如:

// set 'audio' in the global scope
var audio = new Audio('/path/to/default.mp3');

// create a play / pause button
function playPause(e) {
    // NOTE: audio is from the gloabl scope
    if (this.textContent == 'Play') {
        audio.play();
        this.textContent = 'Pause';
    } else {
        audio.pause();
        this.textContent = 'Play';
    }
}

window.onload = function() {
    var a = document.getElementById('func');
    a.addEventListener('click',playPause,false);
}
<button id="func">Play</button>

10-05 21:09
查看更多