JavaScript中如何让聊天初始化函数仅执行一次,避免子路由重复触发
解决方案
核心思路是新增全局初始化状态标记,阻断重复的初始化逻辑,修改后的完整代码如下:
// 全局初始化标记,首次加载时初始化 if (window.chatBotInited === undefined) { window.chatBotInited = false } // 路径匹配且未初始化时才执行初始化逻辑 if(location.hash.indexOf("#/financial-bills") > -1 && !window.chatBotInited) { var initESW = function(gslbBaseURL) { embedded_svc.init( 'https://example.com', 'https://example/ChatBot', gslbBaseURL, '00D4C00000019Iy', 'Support_Only', { baseLiveAgentContentURL: 'https://c.la2-c1cs.com/content', deploymentId: '5721E', buttonId: '5731E', baseLiveAgentURL: 'https://d.la2-c1cs.com/chat', eswLiveAgentDevName: 'EmbeddedServiceLiveAgent_Parent0200EAA_1754b2de11b', isOfflineSupportEnabled: false } ); // 初始化完成后修改标记,后续不再重复执行 window.chatBotInited = true }; if (!window.embedded_svc) { var s = document.createElement('script'); s.setAttribute('src', 'https://example/embeddedservice/5.0/esw.min.js'); s.onload = function() { initESW(null); }; document.body.appendChild(s); } else { initESW('https://service.force.com'); } }
你之前尝试的监听popstate删除script标签的逻辑可以直接移除,script标签加载完成后代码已经注入全局运行环境,删除标签不会清除已经执行的初始化逻辑和生成的聊天实例,没有实际作用。
如果后续需要支持用户离开#/financial-bills相关路径时自动关闭聊天、下次进入再重新加载,可以在路由变化逻辑中补充判断:路径不匹配时调用聊天SDK的销毁方法销毁已有的聊天实例,再把window.chatBotInited重置为false即可。
内容的提问来源于stack exchange,提问作者Duck_dragon
相关产品推荐
相关产品推荐

