为什么自制的自动点击书签脚本会两次弹出输入提示框?
重复弹窗原因
- 你在监听回调中调用
target.click()生成的模拟点击事件,同样会冒泡到document节点,触发你绑定的点击监听函数 - 原代码是在所有模拟点击执行完成后才将
clicked设为true,第二次触发监听函数时clicked仍然为false,因此会再次弹出输入框
修复方案
有两种常用的修复逻辑,你可以根据使用需求选择:
方案1:单次执行自动解绑(最符合书签脚本使用习惯)
点一次书签触发脚本,选元素点击执行完自动失效,下次使用再点书签即可,不会残留全局事件监听:
document.onclick = function(event) { // 阻止当前点击事件冒泡和默认行为,避免干扰页面原有逻辑 event.preventDefault(); event.stopPropagation(); // 直接解绑监听,后续模拟点击不会再触发当前逻辑 document.onclick = null; const target = 'target' in event ? event.target : event.srcElement; const inputVal = prompt("请输入点击次数,点击元素为:" + (target.id || '未命名元素')); const clickamount = parseInt(inputVal); // 输入非法直接终止执行 if (isNaN(clickamount) || clickamount < 1) return; // 手动点击已经触发了一次,所以模拟点击次数减1 for (let i = 0; i < clickamount - 1; i++) { target.click(); } };
方案2:支持多次连续触发
不用重复点书签,每次点击元素都会弹出输入框执行点击,适合需要多次操作不同元素的场景:
let isProcessing = false; document.onclick = function(event) { // 正在执行点击逻辑时直接跳过,避免重复触发 if (isProcessing) return; isProcessing = true; event.stopPropagation(); const target = 'target' in event ? event.target : event.srcElement; const inputVal = prompt("请输入点击次数,点击元素为:" + (target.id || '未命名元素')); const clickamount = parseInt(inputVal); if (isNaN(clickamount) || clickamount < 1) { isProcessing = false; return; } for (let i = 0; i < clickamount - 1; i++) { target.click(); } // 执行完成后重置状态,支持下一次点击触发 isProcessing = false; };
内容的提问来源于stack exchange,提问作者Dormierian
相关产品推荐
相关产品推荐

