Chrome扩展executeScript调用Dynamics CRM的XRM JS API不生效问题
问题原因
Chrome扩展通过chrome.scripting.executeScript默认注入的脚本运行在隔离执行环境(ISOLATED world),和目标页面的全局作用域完全隔离,无法直接访问页面挂载的Xrm全局对象,而Chrome控制台默认运行在页面主上下文,所以能直接调用Xrm API。
解决方案
方案1:指定执行上下文为页面主环境(推荐,Manifest V3支持)
直接在executeScript参数中添加world: "MAIN"配置,让注入代码运行在页面主上下文,即可直接访问Xrm对象:
chrome.tabs.query({ currentWindow: true, active: true }, function(tabs) { chrome.scripting.executeScript({ target: { tabId: tabs[0].id }, world: "MAIN", // 核心配置:切换到页面主执行上下文 func: () => { Xrm.Utility.alertDialog("Hello world", () => { }); } }); });
注意要确保你的manifest.json中host_permissions已经添加了Dynamics CRM站点的匹配规则,例如"https://*.crm.dynamics.com/*"。
方案2:注入script标签到页面DOM执行
如果需要兼容旧版本扩展,也可以通过在隔离环境中动态插入script标签的方式,让代码在页面主上下文执行:
chrome.tabs.query({ currentWindow: true, active: true }, function(tabs) { chrome.scripting.executeScript({ target: { tabId: tabs[0].id }, func: () => { const runScript = document.createElement('script'); runScript.textContent = 'Xrm.Utility.alertDialog("Hello world", () => { })'; document.body.append(runScript); runScript.remove(); } }); });
内容的提问来源于stack exchange,提问作者shashank
相关产品推荐
相关产品推荐

