重复点击
This commit is contained in:
@@ -31,6 +31,7 @@
|
|||||||
'sf_demand_plan/static/src/scss/style.css',
|
'sf_demand_plan/static/src/scss/style.css',
|
||||||
'sf_demand_plan/static/src/js/print_demand.js',
|
'sf_demand_plan/static/src/js/print_demand.js',
|
||||||
'sf_demand_plan/static/src/js/custom_button.js',
|
'sf_demand_plan/static/src/js/custom_button.js',
|
||||||
|
'sf_demand_plan/static/src/js/global_button_protection.js',
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
'license': 'LGPL-3',
|
'license': 'LGPL-3',
|
||||||
|
|||||||
106
sf_demand_plan/static/src/js/global_button_protection.js
Normal file
106
sf_demand_plan/static/src/js/global_button_protection.js
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
/** @odoo-module **/
|
||||||
|
|
||||||
|
// 全局按钮点击保护
|
||||||
|
class ButtonClickProtection {
|
||||||
|
constructor() {
|
||||||
|
this.clickedButtons = new Set();
|
||||||
|
this.init();
|
||||||
|
}
|
||||||
|
|
||||||
|
init() {
|
||||||
|
// 监听整个文档的点击事件
|
||||||
|
console.log('init');
|
||||||
|
document.addEventListener('click', this.handleGlobalClick.bind(this), true);
|
||||||
|
|
||||||
|
// 监听页面变化,为新添加的按钮添加保护
|
||||||
|
this.observePageChanges();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理全局点击事件
|
||||||
|
*/
|
||||||
|
handleGlobalClick(event) {
|
||||||
|
const button = event.target.closest('button[name="button_release_plan"]');
|
||||||
|
if (!button) return;
|
||||||
|
|
||||||
|
// 如果按钮已经被点击过,阻止事件
|
||||||
|
if (this.clickedButtons.has(button)) {
|
||||||
|
event.preventDefault();
|
||||||
|
event.stopPropagation();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 标记按钮为已点击
|
||||||
|
this.clickedButtons.add(button);
|
||||||
|
|
||||||
|
// 立即禁用按钮
|
||||||
|
button.disabled = true;
|
||||||
|
button.style.opacity = '0.6';
|
||||||
|
button.style.cursor = 'not-allowed';
|
||||||
|
|
||||||
|
// 保存原始文本
|
||||||
|
const originalText = button.textContent;
|
||||||
|
button.textContent = '处理中...';
|
||||||
|
|
||||||
|
// 5秒后重新启用按钮(如果页面没有刷新)
|
||||||
|
setTimeout(() => {
|
||||||
|
if (button && button.disabled) {
|
||||||
|
button.disabled = false;
|
||||||
|
button.style.opacity = '1';
|
||||||
|
button.style.cursor = 'pointer';
|
||||||
|
button.textContent = originalText;
|
||||||
|
this.clickedButtons.delete(button);
|
||||||
|
}
|
||||||
|
}, 5000);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 监听页面变化
|
||||||
|
*/
|
||||||
|
observePageChanges() {
|
||||||
|
// 使用 MutationObserver 监听DOM变化
|
||||||
|
const observer = new MutationObserver((mutations) => {
|
||||||
|
mutations.forEach((mutation) => {
|
||||||
|
if (mutation.type === 'childList') {
|
||||||
|
mutation.addedNodes.forEach((node) => {
|
||||||
|
if (node.nodeType === Node.ELEMENT_NODE) {
|
||||||
|
// 检查新添加的元素中是否有下达计划按钮
|
||||||
|
const buttons = node.querySelectorAll ?
|
||||||
|
node.querySelectorAll('button[name="button_release_plan"]') :
|
||||||
|
(node.matches && node.matches('button[name="button_release_plan"]') ? [node] : []);
|
||||||
|
|
||||||
|
buttons.forEach(button => {
|
||||||
|
// 为新按钮添加视觉提示
|
||||||
|
button.addEventListener('mouseenter', () => {
|
||||||
|
if (!button.disabled) {
|
||||||
|
button.title = '点击后将禁用按钮防止重复操作';
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// 开始观察
|
||||||
|
observer.observe(document.body, {
|
||||||
|
childList: true,
|
||||||
|
subtree: true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 页面加载完成后初始化
|
||||||
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
|
new ButtonClickProtection();
|
||||||
|
});
|
||||||
|
|
||||||
|
// 如果页面已经加载完成,立即初始化
|
||||||
|
if (document.readyState === 'loading') {
|
||||||
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
|
new ButtonClickProtection();
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
new ButtonClickProtection();
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user