4

I have created a fiddle of my function here( http://jsfiddle.net/rhy5K/10/ ) . Now i want to disable the button click i.e play/pause if the sound is playing like Get ready,5,4,3,2,1 .

I know only how to disable the form submit button , but I am very confused how to disable the click in my case the hyperlinks.

Explanation using code example:

I want to disable this

<a href="#" id="btn_start">PLAY</a>

click, while interpreter is executing the below code:

var playGetReady = function (done) {
    var ids = ['audiosource', 'a_5', 'a_4', 'a_3', 'a_2', 'a_1'],
        playNext = function () {
            var id = ids.shift();
            document.getElementById(id).play();
            if (ids.length) {
                setTimeout(playNext, 1000);
            } else {
                done();
            }
        };
    playNext();
};

Warning: This JS fiddle demo may play sound on load

4

3 回答 3

1

您可以尝试这个(更改以下功能),但不确定这是否是您想要的,也许还有其他方法可以做到这一点。

App.prototype.start = function () {
    var self = this;
    // unbind for a while
    self.$button.unbind('click', self.buttonHandler); // <--
    var start = function () {
            // start countdown
            self.intervalHandle = setInterval($.proxy(self.tick, self), 1000);
            // bind again
            self.$button.click($.proxy(self.buttonHandler, self)); // <--
            // change button text to PAUSE
            self.$button.text('PAUSE');
        };

    if (this.newTimer) {
        playGetReady(start);
    } else {
        start();
    }
};

演示。

于 2013-10-06T08:22:13.753 回答
0

在 jquery 中,可以通过取消默认操作轻松完成。这是示例。

$("#btn_start").click(function(event){      
    if(not_active_flag){
        // Prevent anchor to active
        return false;
    }else{
        // Anchor active as usual
        return true;
    }       
});
于 2013-10-06T08:10:30.040 回答
0

在您的情况下,链接最终将调用this.buttonHandler,它具有以下代码:

App.prototype.buttonHandler = function (e) {
    e.preventDefault(); // prevent anchor default action
    this.toggle(); // toggle play/pause
};

因为buttonHandler是在playGetReady执行之前附加的,所以不可能让单击处理程序附加到用于阻止其他单击处理程序执行的playGetReady锚元素。.stopImmediatePropagation()

在这种情况下,@gp. 在评论中的解决方案很可能是最好的解决方案。在您的情况下,您甚至可以在您的应用程序中使用局部变量。如果您使用全局变量,请使用window.yourglobalvariable. 如果您使用局部变量,请确保在某处定义它并使用this.yourvariable. 将您的 buttonHandler 更改为:

App.prototype.buttonHandler = function (e) {
    e.preventDefault(); // prevent anchor default action
    if( this.soundready )
        this.toggle(); // toggle play/pause
};

在适当的地方设置此变量false以防止“按钮”工作。当按钮应该起作用时,将变量更改为true. 我认为这应该就done()在您问题中的代码之前,但是您可能对代码的执行顺序有更好的了解。

于 2013-10-06T08:13:18.110 回答