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); }