运行时切换Survey主题:SurveyTheme对象被覆盖问题求助
问题
根据SurveyJS官方文档说明,只需引入主题的JavaScript文件并调用survey.applyTheme()即可使用多个主题,示例代码如下:
<!-- In classic script applications: --> <head> <!-- ... --> <link href="https://unpkg.com/survey-core/defaultV2.min.css" type="text/css" rel="stylesheet"> <script type="text/javascript" src="https://unpkg.com/survey-core/survey.core.min.js"></script> <script type="text/javascript" src="https://unpkg.com/survey-core/themes/contrast-dark.min.js"></script> <script type="text/javascript" src="https://unpkg.com/survey-core/themes/contrast-light.min.js"></script> <!-- ... --> </head> <script> const surveyJson = { ... }; const survey = new Survey.Model(surveyJson); survey.applyTheme(SurveyTheme.ContrastLight); </script>
但实际使用中发现,每个主题JS文件会覆盖全局的SurveyTheme对象,导致仅最后引入的ContrastLight可用,ContrastDark无法调用。已通过以下操作验证问题:
- 在浏览器控制台查看
SurveyTheme对象,仅存在最后引入的一个主题 - 调整JS文件引入顺序,确认同一时间仅能使用最后引入的主题
现寻求解决该问题的可行方案。
可行解决方案
方案1:提前保存主题配置(适合传统脚本引入场景)
在引入下一个主题JS文件前,将当前SurveyTheme中的目标主题配置单独保存到变量中,避免被后续主题覆盖:
<head> <link href="https://unpkg.com/survey-core/defaultV2.min.css" type="text/css" rel="stylesheet"> <script type="text/javascript" src="https://unpkg.com/survey-core/survey.core.min.js"></script> <!-- 引入深色主题并保存配置 --> <script type="text/javascript" src="https://unpkg.com/survey-core/themes/contrast-dark.min.js"></script> <script> // 单独保存深色主题配置 const contrastDarkTheme = SurveyTheme.ContrastDark; </script> <!-- 引入浅色主题 --> <script type="text/javascript" src="https://unpkg.com/survey-core/themes/contrast-light.min.js"></script> <script> // 单独保存浅色主题配置 const contrastLightTheme = SurveyTheme.ContrastLight; </script> </head> <script> const surveyJson = { ... }; const survey = new Survey.Model(surveyJson); // 切换主题时直接使用保存的变量 survey.applyTheme(contrastDarkTheme); // 切换到浅色主题:survey.applyTheme(contrastLightTheme); </script>
方案2:使用ES模块化导入(适合现代项目)
如果项目支持ES模块,直接通过import语句导入每个主题的独立配置,避免全局对象覆盖:
import { Model } from 'survey-core'; import { ContrastDark } from 'survey-core/themes/contrast-dark'; import { ContrastLight } from 'survey-core/themes/contrast-light'; const surveyJson = { ... }; const survey = new Model(surveyJson); // 直接使用导入的主题配置 survey.applyTheme(ContrastDark); // 切换到浅色主题:survey.applyTheme(ContrastLight);
方案3:合并主题对象(应急方案)
如果无法调整引入顺序,可在引入所有主题后,手动合并备份的主题配置到最终的SurveyTheme对象中:
<head> <link href="https://unpkg.com/survey-core/defaultV2.min.css" type="text/css" rel="stylesheet"> <script type="text/javascript" src="https://unpkg.com/survey-core/survey.core.min.js"></script> <!-- 引入第一个主题并备份整个SurveyTheme --> <script type="text/javascript" src="https://unpkg.com/survey-core/themes/contrast-dark.min.js"></script> <script> const backupTheme = { ...SurveyTheme }; </script> <!-- 引入第二个主题 --> <script type="text/javascript" src="https://unpkg.com/survey-core/themes/contrast-light.min.js"></script> <script> // 将备份的主题合并到当前SurveyTheme中 Object.assign(SurveyTheme, backupTheme); </script> </head> <script> const surveyJson = { ... }; const survey = new Survey.Model(surveyJson); // 现在两个主题都可直接调用 survey.applyTheme(SurveyTheme.ContrastDark); survey.applyTheme(SurveyTheme.ContrastLight); </script>
内容的提问来源于stack exchange,提问作者BSB
相关产品推荐
相关产品推荐

