WebClient UI上自帶了一個列印按鈕,按Ctrl + P後可以生成一個新的頁面供列印。
如下圖所示。可以看到這個頁面裡所有的超連結都已經被移除了。
這個頁面的生成邏輯如下。
1. 按住ctrl + p之後,會觸發WebClient UI架構的按鍵響應函數thtmlbKeyDown。浏覽器傳入的事件處理對象裡ctrl屬性為true,keycode為80(按鍵p對應的code),意思就是ctrl和p同時按下。
這個響應函數thtmlbKeyDown被注冊到整個document對象上,是以您在頁面任何位置點選ctrl+p都能得到響應。
從右上角的調用棧能發現crmFrwPrint被調用。crmFrwPrint會打開print.do這個控制器,位于BSP應用bspwd_basics裡。
2. 打開print.do控制器的實作類CL_BSPWD_BASICS_PRINT
這個控制器會打開print.html頁面
3. 我們按了ctrl+p後生成的頁面的内容就是在print.html裡生成的。核心代碼在函數ppStartScripts裡,被thtmlbRegisterOnLoad注冊到頁面的load事件裡,意思是print.html加載時就執行。
thtmlUtil.addEventHandler就是SAP自己封裝的事件注冊函數,用于多浏覽器的相容支援。
最核心的兩個函數:
CreateShield
生成一個height和width為100%的div,背景圖檔設定成SAP預定義好的1x1.gif。
運作時顯示如下:
loadPage
通過window.opener拿到發生了ctrl+p按鍵的原始頁面,然後把其th-l-wcsubheadercontainer下面的所有元素的html直接複制到列印輸出頁面的header元素下面。
這樣就實作了把原始頁面的内容搬到了列印輸出頁面。
然後得到列印頁面所有超連結标簽,然後把這些标簽的href和onclick都置為一個函數體為return false的函數,這樣超連結就不再能點選。
var nirvana = new Function ( "return false;" );