咱们在classic环境中,有时针对page layout不能实现的地方,能够引入 一个vf page去加强标准的 page layout 功能,有时可能要求这个 vf page的部分修改须要更新此 page layout 或者当前这个vf page弹出的新的window的改动须要刷新这个总体的page layout,项目中碰见了这种需求,由于前端很差,费了一些时间去解决了他,mark一下后期有碰见一样的场景,能够直接拿过来用了。javascript
下面咱们的demo根据 当前引入的vf page弹出新的窗口,窗口对当前 page layout的部分的变量进行从新赋值须要刷新自动此page layout达到预期效果。前端
GoodsDemoPage.page:用于展现一个按钮,点击此按钮弹出来一个子页面java
1 <apex:page standardController="Goods__c"> 2 <script type="text/javascript"> 3 function openChangeStatusWindow() { 4 var directURL = '/apex/GoodsDemoDirectPage?id={!Goods__c.Id}'; 5 window.open(directURL,'newwindow','height=100,width=200,top=200, left=350,toolbar=no, menubar=no, scrollbars=no, resizable=yes, location=no, status=no'); 6 } 7 8 function refreshPagelayout() { 9 window.top.location.href = '/{!Goods__c.Id}'; 10 } 11 </script> 12 <apex:form> 13 <input type="button" value="清空Status状态" onclick="openChangeStatusWindow();" /> 14 </apex:form> 15 </apex:page>
GoodsDemoDirectPage.page:用于清空Goods中的Status的状态而且更新父层面的page layout.ajax
1 <apex:page showHeader="false"> 2 <script src="../../soap/ajax/42.0/connection.js" type="text/javascript"></script> 3 <script type="text/javascript"> 4 sforce.connection.sessionId='{!GETSESSIONID()}'; 5 function changeGoodsStatus() { 6 var goods = new sforce.SObject("Goods__c"); 7 goods.Id = '{!$CurrentPage.parameters.Id}'; 8 goods.Status__c = null; 9 result = sforce.connection.update([goods]); 10 console.log('result' + result); 11 if(result[0].getBoolean('success')) { 12 window.opener.refreshPagelayout(); 13 window.close(); 14 } else { 15 alert('error occured'); 16 } 17 } 18 </script> 19 <apex:form> 20 <input type="button" value="清空" onclick="changeGoodsStatus();" /> 21 </apex:form> 22 </apex:page>
将GoodsDemoPage配置在Goods__c这个sObject的page layout便可。点击‘清空Status状态’按钮之后,会弹出来一个页面,点击页面中的‘清空’按钮之后弹出的页面会关闭而且当前的 page layout会自动刷新。浏览器
这里主要有两个关键点:window.top以及window.opener。这两个区别以下:session
window.top用于返回顶层窗口,即浏览器的窗口。GoodsDemoPage嵌在了page layout中,则针对 GoodsDemoPage来讲,其window.top指向的就是当前的 page layout对应的窗口。spa
window.opener用于返回打开此页面的页面。针对GoodsDemoDirectPage,其由GoodsDemoPage打开,因此针对GoodsDemoDirectPage来讲,其window.opener指向的是GoodsDemoPage。因此针对这个demo中咱们只须要经过window.opener调用GoodsDemoPage的refreshPageLayout方法,而后在方法中使用window.top指向到当前的URL刷新便可。code
总结:篇中主要涉及到js的知识,由于本人js比较菜,若是有错误或者更好的方式欢迎指出,有不懂的欢迎留言。orm