javascript - JavaScript 中的通用按钮处理程序

标签 javascript jquery ajax

我的网络应用程序上有很多按钮,用于请求数据并将其发布到 PHP 以检索和更新数据库。我正在努力创建一种通用方法来防止提交表单时多次单击按钮,因为我正在使用 AJAX 和 Jquery。

这是我当前的实现,但我什至不知道它是否有效。看起来 99% 的时间都有效。

在我的常用functions.js 文件中,我有一个位于全局范围内的函数

var canClick = true;

function buttonWithPromise(promise){
    if(!canClick) return;
    canClick = false;
    promise.done(function(){
        canClick = true;
    });
}

然后,每当我将 .click 附加到 dom 元素时,我都会这样做:

$('body').on('click', '.table > .row', function(){
    var nbr = $(this).attr('nbr');  
    buttonWithPromise(get_count(nbr));
});

某些可能被调用的函数将有一个延迟对象。

function get_count(){
    var defer = $.Deferred();
    var options = "getCount"
    Query.init(options)
        .fetchData(function(data){   //Ajax data request
            if(data){
            }
            defer.resolve();
    });
    return defer.promise();
}

由于这只是有时有效,所以我可以看出这是错误的。有什么改进建议吗?

最佳答案

Javascript 中的一切都是对象,是吗?那么为什么不呢:

$('body').on('click', '.button', function()
{
    // Set default value of property
    if(typeof this.isClicked === 'undefined')
        this.isClicked = false;

    // Check if button is working
    if(this.isClicked)
    {
        // Send error to console if button is busy
        console.log('Cannot click as a network action is occuring!');
    }else
    {
        // Begin new network action if button is not busy
        var self = this;

        console.log('Begin network for: ' + $(this).text());
        this.isClicked = true;

        setTimeout(function()
                   {
                       // Reset button state once network action is done
                       console.log('End network for: ' + $(self).text());
                       self.isClicked = false;

                       //Call any callbacks/promises here
                   }, 5000);
    }
});

fiddle :

http://jsfiddle.net/mdLfug1t/

注意:我使用 setTimeout 来模拟 ajax 请求

编辑:让我将其更多地放在上下文中:

function buttonWithPromise(promise)
{
    if(typeof promise.canClick === 'undefined')
        promise.canClick = true;

    if(!promise.canClick) return;

    promise.canClick = false;

    promise.done(function()
    {
        promise.canClick = true;
    });
}

您遇到的问题是“canClick”是全局的,因此会被每个 promise 修改。您需要将其设为 Promise 的属性,以便可以创建无限的 Promise,每个 Promise 都有自己的 canClick 实例。

关于javascript - JavaScript 中的通用按钮处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27097578/

相关文章:

javascript - 为没有在源中指定宽度和高度的图像获取图像尺寸

jquery - 将 jQuery .css() 与变量一起使用

javascript - jquery 中 css 中的警报框

javascript - 在 gulp-inject 中包含 CDN 源

javascript - 如果显示元素,想要添加填充 - jquery

jquery - 使用 click() 方法增加/减少网页的文本大小

javascript - 当我单击具有相同类的列表中的按钮时,在顶部元素中添加类 - Jquery

Javascript 正则表达式代码到 PHP 正则表达式?

javascript - 如何对提供/注入(inject)的 VUE 组件进行单元测试?

javascript - InnerHTML 更新不起作用