Liferay 7中如何关闭或禁用超时/会话结束提示消息?
搞定Liferay超时/会话结束提示无法关闭的问题
嘿,我之前也碰到过Liferay里这种系统级提示搞不定的情况,你现在的问题核心在于那些超时提示是动态生成的,你之前写的代码只给页面加载时就存在的按钮绑了事件,后来才弹出来的提示自然没触发效果。而且这类系统提示的DOM结构可能和自定义的SessionMessages不太一样,咱们一步步来解决:
第一步:先搞清楚提示的DOM结构
先打开浏览器F12开发者工具,等超时提示弹出来的时候,看看它的HTML结构。Liferay的这类系统提示一般会在.lfr-notification-container或者.aui-message容器里,可能还带个特殊类名比如.session-timeout-warning。举个常见的结构例子:
<div class="lfr-notification-container session-timeout-warning"> <div class="aui-message aui-message-warning"> <span class="close"></span> <!-- 提示文字内容 --> </div> </div>
第二步:用事件委托绑定关闭事件
因为元素是动态生成的,所以得用事件委托的方式,把点击事件绑到页面一开始就存在的父元素上(比如document),这样新生成的按钮也能触发事件。把你的JS代码改成这样:
AUI().ready(function() { // 事件委托处理所有动态生成的关闭按钮 $(document).on('click', '.lfr-alert-container .close, .lfr-notification-container .close, .aui-message .close', function(e) { e.preventDefault(); // 找到最外层的提示容器并隐藏,也可以用.remove()彻底删掉 $(this).closest('.lfr-alert-container, .lfr-notification-container, .aui-message').addClass('hidden'); }); });
第三步:彻底禁用提示(更省心)
如果你根本不想让这个提示弹出来,而不是只处理关闭按钮,那直接监听Liferay的系统事件来阻止它:
AUI().ready(function() { // 拦截会话超时警告的默认提示 Liferay.on('session.timeout.warning', function(event) { event.preventDefault(); // 要是需要自定义超时后的行为,比如直接跳登录页,就在这里加代码 // window.location.href = '/c/portal/logout'; }); });
为啥之前的代码没用?
你之前的代码是在页面加载完成时,给当时已经存在的.close按钮绑了点击事件,但超时提示是在会话快结束的时候才动态插入到页面里的,这些新按钮根本没绑定到你的点击事件,所以点了没反应。事件委托就解决了这个问题,它是监听父元素的事件,然后匹配子元素的选择器,不管元素什么时候生成都能生效。
另外,要是你用$有问题,就换成Liferay自带的AUI().$,避免jQuery版本冲突的问题。
内容的提问来源于stack exchange,提问作者Julez
相关产品推荐
相关产品推荐

