咱們在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