【前言】:最近在做一个公益型项目时,客户原先的系统有一个JS Button用来打开Conga(电子合同管理的第三方插件),由于系统需要从Classic迁移到LEX,随后又通过Custom Button调用VF Page,并把原来的JS提取到VF Page来执行,用以解决LEX,Classic的兼容问题。直到最近,客户反馈说按钮没生效,才意识到浏览器把弹窗(window.open JS方法)给拦截了。
【基础知识】:
window.open & window.location.href
1. 前者和a标签有着相似的功效,都能设置target属性,如在当前窗口打开"_self",在新窗口打开"_blank",最核心的弊病是易被浏览器拦截,如果客户电脑知识不是很好,使用这个方案就很糟糕了;
FAQ: 为什么会被拦截呢?哪些情况不会被拦截呢?
A1: 浏览器的安全机制,会防止恶意网站肆意弹窗给用户造成损失,这种设计初衷是好的;
A2: 用户触发的事件,打开的弹窗即使在浏览器的内容设置中弹出式窗口已屏蔽,也会正常打开;
下面列举了常用用例:
不禁用:如按钮点击事件中调用的弹窗;
禁用:如文档加载后调用的弹窗;
2. 后者无法设置target,所以最核心的弊病是无法在新窗口打开;
【期待体验】:
如果客户在编辑完单子后,直接在不脱离当前单子context情况下,能够显示Conga的窗口,无疑是最好的体验。
而最差的体验无疑是直接把当前页面给覆盖了,即直接使用window.location.href这种省事的方法。
所以折衷的方案是:在新窗口打开页面;
【解决方案与思考过程】:
1. 既然a标签能设置target,为了在新窗口打开,我们可以选择Custom Link<URL> / Formula Field with HYPERLINK;
2. 由于当前需求需要基于一定条件去打开新窗口,比如链接中依赖字段的值为空,我们需要像Custom Button那样有提示,另外我们也期待条件1用Link1,条件2用Link2,所以最终敲定了Formula Field with HYPERLINK这种方案来实施;
3. 最终公式字段设置如下:
IF(ISNULL(Required_Template__c),
HYPERLINK('/'&Id, $Label.ERROR_Message, '_self'),
HYPERLINK('/apex/APXTConga4__Conga_Composer?SolMgr=1&serverUrl='&$Api.Partner_Server_URL_370&'&Id='&Id&'&DC=0&DS7=3&TemplateId='&Required_Template__c&'&OFN=PB+Placement+Agreement+-+'&Name&'&DefaultPDF=1' , 'Open Conga' , '_blank'))
4. 最终在Classic和LEX的显示效果如下:
5. 最后我们发现在LEX中的Link即使设定了target = "_blank",还是在当前页面打开了,所以解决方法如下:
在Critical Updates找到Lightning Experience Honors Target Values for Hyperlinks in Formula Fields并激活
【已知问题】:
Image HYPERLINK formula does not open up link in new tab in lightning