You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PrestaShop重复绑定.click事件触发两次点击,如何仅保留一份生效?

解决方案

方案1:绑定前清空已有同类型事件(推荐,改动最小)

每次执行绑定逻辑前,先移除该元素上已绑定的所有click事件,再重新绑定,无论代码加载多少次,最终都只会保留一份生效的事件。
修改后的代码如下:

$(function () {
    // 仅新增了.off('click')逻辑,其余业务代码无需改动
    $(".ajax_table_link").off('click').click(function () {
        var link = $(this);
        $.post($(this).attr('href'), function (data) {
            if (data.success == 1) {
                showSuccessMessage(data.text);
                if (link.hasClass('action-disabled')){
                    link.removeClass('action-disabled').addClass('action-enabled');
                } else {
                    link.removeClass('action-enabled').addClass('action-disabled');
                }
                link.children().each(function () {
                    if ($(this).hasClass('hidden')) {
                        $(this).removeClass('hidden');
                    } else {
                        $(this).addClass('hidden');
                    }
                });
            } else {
                showErrorMessage(data.text);
            }
        }, 'json');
        return false;
    });
});

方案2:新增全局绑定标记,仅执行一次绑定逻辑

通过全局自定义变量标记绑定状态,代码重复加载时直接跳过绑定逻辑,性能更优,适合元素不会动态新增的场景。
代码如下:

// 已绑定过则直接终止执行
if (window.AJAX_TABLE_LINK_BOUND) return;
window.AJAX_TABLE_LINK_BOUND = true;

$(function () {
    $(".ajax_table_link").click(function () {
        var link = $(this);
        $.post($(this).attr('href'), function (data) {
            if (data.success == 1) {
                showSuccessMessage(data.text);
                if (link.hasClass('action-disabled')){
                    link.removeClass('action-disabled').addClass('action-enabled');
                } else {
                    link.removeClass('action-enabled').addClass('action-disabled');
                }
                link.children().each(function () {
                    if ($(this).hasClass('hidden')) {
                        $(this).removeClass('hidden');
                    } else {
                        $(this).addClass('hidden');
                    }
                });
            } else {
                showErrorMessage(data.text);
            }
        }, 'json');
        return false;
    });
});

如果你的列表元素是动态渲染的,可以将绑定逻辑改为事件委托写法,后续新增的元素也能正常触发事件:

if (window.AJAX_TABLE_LINK_BOUND) return;
window.AJAX_TABLE_LINK_BOUND = true;

$(function () {
    // 事件委托绑定到document,无需重复绑定
    $(document).on('click', '.ajax_table_link', function () {
        var link = $(this);
        $.post($(this).attr('href'), function (data) {
            if (data.success == 1) {
                showSuccessMessage(data.text);
                if (link.hasClass('action-disabled')){
                    link.removeClass('action-disabled').addClass('action-enabled');
                } else {
                    link.removeClass('action-enabled').addClass('action-disabled');
                }
                link.children().each(function () {
                    if ($(this).hasClass('hidden')) {
                        $(this).removeClass('hidden');
                    } else {
                        $(this).addClass('hidden');
                    }
                });
            } else {
                showErrorMessage(data.text);
            }
        }, 'json');
        return false;
    });
});

内容的提问来源于stack exchange,提问作者Max399

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 15:24:05