【问题标题】:How to disable the click if a function is in active status如果功能处于活动状态,如何禁用点击
【发布时间】:2013-10-12 22:30:27
【问题描述】:

我在这里创建了我的函数的小提琴(http://jsfiddle.net/rhy5K/10/)。现在我想禁用按钮点击,即play/pause,如果声音像Get ready,5,4,3,2,1一样播放。

我只知道如何禁用表单提交按钮,但我很困惑如何在我的情况下禁用点击hyperlinks

使用代码示例说明:

我想禁用它

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

点击,解释器正在执行以下代码:

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();
};

警告:这个 JS fiddle 演示可能会在加载时播放声音

【问题讨论】:

  • 为什么我没有收到上述问题的任何答案。我的问题是不是不恰当或我的其他错误?
  • 欢迎使用 StackOverflow。 StackOverflow 是大多数人居住的地方。虽然有些巫师可以在 6 分钟内写出最惊人的答案,但大多数人需要的还不止这些。请……耐心点……
  • 一个简单的解决方案...设置一个标志,例如window.__compilerbusy = true 运行定时器时,定时器完成时将其设置为 false。在 btn 点击处理程序中,检查标志。
  • @RecoveringSince2003 谢谢你提醒我

标签: javascript jquery timer disabled-control


【解决方案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();
    }
};

DEMO.

【讨论】:

  • 其实我没有正确查看其他函数但是逻辑是相同的,可能不是相同的上下文。
  • 您能更具体地介绍一下您正在使用的功能吗?
  • 我想你想要this one。检查else 中的App.prototype.end 最后一行。
  • 很高兴知道这一点,那么您将向我的帐户转入多少,哈哈! :p
  • 您是否尝试为您的网站获取 Google Adsense heera.it
【解决方案2】:

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

$("#btn_start").click(function(event){      
    if(not_active_flag){
        // Prevent anchor to active
        return false;
    }else{
        // Anchor active as usual
        return true;
    }       
});

【讨论】:

    【解决方案3】:

    在您的情况下,链接最终将调用this.buttonHandler,其代码如下:

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

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

    在这种情况下,@gp. 在 cmets 中的解决方案很可能是最好的解决方案。在您的情况下,您甚至可以在您的应用程序中使用局部变量。如果您使用全局变量,请使用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() 之前,但您可能对代码的执行顺序有更好的了解。

    【讨论】:

      猜你喜欢
      • 2016-06-28
      • 1970-01-01
      • 1970-01-01
      • 2014-12-20
      • 2016-01-11
      • 2014-07-26
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      相关资源
      最近更新 更多