如何检测JavaScript函数est_wont_show是否已执行?
解决方案:跟踪函数执行状态 + 实现元素切换逻辑
咱们直接针对你的需求拆解解决,核心要搞定三个点:跟踪est_wont_show的执行状态、根据状态触发不同弹窗、实现元素"移除/恢复"的切换逻辑。下面一步步来:
1. 状态跟踪思路
可以用全局变量记录函数是否执行过,或者给目标元素加data-*自定义属性标记元素状态(更适合多元素场景)。两种方式都给你整理到代码里,按需选择。
2. 修复并完善est_wont_show函数
原代码只做了元素移除,缺少恢复逻辑,而且判断元素是否在DOM的写法有问题。修改后实现"存在则移除,不存在则恢复"的切换:
- 移除时用
detach()保存元素引用(保留事件和数据) - 恢复时把元素放回原来的位置
3. 实现TEST_ALERT函数
可以根据"函数是否执行过"或者"元素当前状态"来触发不同弹窗,两种判断逻辑都给你写好。
完整代码示例
// 全局变量:标记est_wont_show是否执行过(全局级跟踪) let estWontShowExecuted = false; function est_wont_show() { // 标记函数已执行 estWontShowExecuted = true; const estpgt_id = $(this).attr("estpgt_id"); const targetTr = $("#estpt_tr_for_" + estpgt_id); const targetElement = $("#estpgt_" + estpgt_id); // 用data属性判断元素是否已被移除(元素级状态跟踪) const isDetached = targetTr.data("detached") || false; if (!isDetached) { // 元素存在DOM中,执行移除 const detachedTr = targetTr.detach(); const detachedElem = targetElement.detach(); // 保存元素原来的父节点和位置,方便后续恢复 detachedTr.data("parent", targetTr.parent()); detachedTr.data("nextSibling", targetTr.next()); detachedElem.data("parent", targetElement.parent()); detachedElem.data("nextSibling", targetElement.next()); // 标记元素已移除 detachedTr.data("detached", true); detachedElem.data("detached", true); alert("元素已从DOM移除"); } else { // 元素已被移除,恢复到原位置 const trParent = targetTr.data("parent"); const trNext = targetTr.data("nextSibling"); const elemParent = targetElement.data("parent"); const elemNext = targetElement.data("nextSibling"); // 按原位置插入元素 trNext.length ? trNext.before(targetTr) : trParent.append(targetTr); elemNext.length ? elemNext.before(targetElement) : elemParent.append(targetElement); // 标记元素已恢复 targetTr.data("detached", false); targetElement.data("detached", false); alert("元素已恢复到DOM中"); } } function TEST_ALERT() { // 方式1:判断函数是否执行过 if (estWontShowExecuted) { alert("est_wont_show已执行"); } else { alert("est_wont_show尚未执行"); } // 方式2:判断特定元素的状态(推荐多元素场景,需传入estpgt_id) // function TEST_ALERT(estpgt_id) { // const isDetached = $("#estpt_tr_for_" + estpgt_id).data("detached") || false; // isDetached ? alert("元素已被移除") : alert("元素在DOM中"); // } } // 绑定按钮触发事件(假设按钮有class="toggle-btn") $(".toggle-btn").on("click", est_wont_show);
关键细节说明
- 状态判断修正:原代码
document.body.getElementsByTagName(HideThis)写法错误,getElementsByTagName需要传入标签名(如div),不是元素对象,改用data-detached属性判断更可靠。 - 元素恢复:
detach()会保留元素的事件和数据,所以我们保存原父节点和兄弟元素,能精准恢复元素位置。 - 灵活选择跟踪方式:全局变量适合单一场景,元素
data属性适合多个元素独立切换的场景。
使用提示
- 触发按钮要带
estpgt_id属性,比如:<button class="toggle-btn" estpgt_id="456">切换元素</button> - 确保目标元素ID符合格式:
estpgt_456和estpt_tr_for_456 - 调用
TEST_ALERT()查看函数执行状态,多元素场景可以用注释里的带参数版本。
内容的提问来源于stack exchange,提问作者user6158284
相关产品推荐
相关产品推荐

