如何解决控制台Uncaught ReferenceError: liferay is not defined报错
问题描述
运行代码时控制台抛出Uncaught ReferenceError: liferay is not defined错误,相关截图如下:
涉及代码片段:
Liferay.on("endNavigate", (function(e) { dropdownMegaMenu(), secondaryNavMobile() } )), Liferay.on("endNavigate", (function(e) { $(".banner-prompt-display").length && $(".banner-prompt").delay(2e3).slideDown("slow", (function() {} )) } ));

报错原因
全局Liferay对象在代码执行时未完成初始化,或是当前运行环境未正确引入Liferay前端核心依赖。
解决方案
- 方案1:添加对象存在性防御判断
给代码加一层判断,只有Liferay对象存在时才执行对应逻辑,避免直接调用抛出错误,示例代码如下:
if (window.Liferay) { Liferay.on("endNavigate", (function(e) { dropdownMegaMenu(), secondaryNavMobile() })); Liferay.on("endNavigate", (function(e) { $(".banner-prompt-display").length && $(".banner-prompt").delay(2e3).slideDown("slow", (function() {} )) })); }
- 方案2:调整代码执行时机
不要把这段代码放在页面<head>中加载,移动到页面底部位置执行,确保Liferay核心资源先加载完成再运行自定义脚本。如果是在Liferay主题或Portlet中开发,也可以将代码包裹在Liferay官方提供的就绪回调中:
Liferay.on('ready', function() { // 把你原来的Liferay相关逻辑放在这里执行 Liferay.on("endNavigate", (function(e) { dropdownMegaMenu(), secondaryNavMobile() })); Liferay.on("endNavigate", (function(e) { $(".banner-prompt-display").length && $(".banner-prompt").delay(2e3).slideDown("slow", (function() {} )) })); });
- 方案3:检查运行环境和依赖
确认当前页面是运行在Liferay门户环境中,如果你是在本地独立调试页面、没有部署到Liferay站点下,必然无法获取全局Liferay对象。如果已经部署在Liferay中,检查当前主题是否正确引入了Liferay前端核心JS资源,没有缺失依赖。
内容的提问来源于stack exchange,提问作者Nazmul Hossain Pappu
相关产品推荐
相关产品推荐

