From f3ebfb942e75e7789f8e9268e4de0c64b1efdc14 Mon Sep 17 00:00:00 2001 From: renshen <1005457301@qq.com> Date: Wed, 30 Sep 2026 10:17:08 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=BB=88=E7=89=88=E9=A1=B5?= =?UTF-8?q?=E7=AD=BE=E5=88=87=E6=8D=A2=E5=90=8E=E5=AF=BC=E5=85=A5/?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E6=8C=89=E9=92=AE=E6=97=A0=E5=8F=8D=E5=BA=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 供应商应付工作区用局部替换方式切换页签,被替换进来的页面自己追加在 body_end 的行内脚本不会执行,导入/编辑弹窗因此没有绑定事件(原「供应商应付」下同样使用 行内弹窗的板材扣款页也受影响)。 现在导航完成后补执行一次新出现的行内脚本,并按源码内容去重,避免重复绑定。 --- .../local-navigation.blade.php | 25 ++++++++++++++++++- .../SupplierPayableFinalPagesTest.php | 5 ++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/resources/views/business/pages/supplier-payables/local-navigation.blade.php b/resources/views/business/pages/supplier-payables/local-navigation.blade.php index 67d60a2a..373541e9 100644 --- a/resources/views/business/pages/supplier-payables/local-navigation.blade.php +++ b/resources/views/business/pages/supplier-payables/local-navigation.blade.php @@ -6,6 +6,23 @@ if (!initial) return; const cache = new Map(); const loaded = new Set([...document.scripts].map(script => script.src)); + // 局部替换导航只会换掉工作区节点,页面在 body_end 追加的行内脚本不会执行, + // 导入/编辑弹窗这类按钮就会“点了没反应”。这里按源码内容去重后补执行一次。 + const executedInline = new Set( + [...document.querySelectorAll('body script:not([src])')].map(script => script.textContent.trim()) + ); + const collectInlineScripts = doc => [...doc.querySelectorAll('body script:not([src])')] + .map(script => script.textContent.trim()) + .filter(code => code !== '' && !executedInline.has(code)); + const runInlineScripts = codes => { + for (const code of codes || []) { + if (executedInline.has(code)) continue; + executedInline.add(code); + const script = document.createElement('script'); + script.textContent = code; + document.body.appendChild(script); + } + }; let current = location.href; let pending = false; const heading = document.querySelector('#main-body h1'); @@ -34,7 +51,12 @@ if (!node) throw new Error('页面不可用或登录已过期'); scripts = [...doc.querySelectorAll('script[src]')].map(s => s.src) .filter(src => new URL(src).origin === location.origin && new URL(src).pathname.startsWith('/public/js/ecommerce-finance/') && !loaded.has(src)); - next = {node: document.importNode(node, true), title: doc.title, heading: doc.querySelector('#main-body h1')?.innerHTML || ''}; + next = { + node: document.importNode(node, true), + title: doc.title, + heading: doc.querySelector('#main-body h1')?.innerHTML || '', + inline: collectInlineScripts(doc), + }; } remember(); previous.replaceWith(next.node); @@ -48,6 +70,7 @@ document.body.appendChild(script); }); } + runInlineScripts(next.inline); cache.set(href, next); current = href; document.title = next.title; diff --git a/tests/Feature/Business/SupplierPayableFinalPagesTest.php b/tests/Feature/Business/SupplierPayableFinalPagesTest.php index e878b2e2..a4331829 100644 --- a/tests/Feature/Business/SupplierPayableFinalPagesTest.php +++ b/tests/Feature/Business/SupplierPayableFinalPagesTest.php @@ -38,6 +38,11 @@ class SupplierPayableFinalPagesTest extends FeatureTestCase ->assertSeeText('暂无数据,请点击“导入”上传本表数据。') ->assertSee('workspace/supplier-payables-final/actions/board-deductions/import', false) ->assertSee('workspace/supplier-payables-final/actions/board-deductions/template', false) + // 导入/编辑弹窗的行内脚本必须随页面输出,局部替换导航才不会出现“点了没反应”。 + ->assertSee('data-supplier-import-modal', false) + ->assertSee('data-supplier-import-choose', false) + ->assertSee('modal.dataset.ready', false) + ->assertSee('data-supplier-maintenance-modal', false) ->assertDontSee('workspace/supplier-payables/actions/board-deductions/import', false); }