自定义母版页之列表过滤菜单位置issue fix
問題描述:
自定義母版頁,為了使左邊導航和頂部導航位置不變(不滾動),將原本位于ribbon下方的#s4-workspace調整到左側導航右邊。
<div id="s4-workspace" style="position: relative; margin-left: 155px; ">body #s4-workspace { overflow-y: scroll; overflow-x: auto; position: relative; left: 0px; }
這時,如果視圖字段較多,需要往右滾動主區域,會出現過濾菜單被左側導航壓住的情況。
解決:
1) 修改web.config將編譯模式調整為debug,這時候,moss會采用調試模式的js,如core.debug.js.
2)跟蹤js代碼,最終發現設置菜單位置的js函數位于Core.debug.js的SetMenuPosition
3)SetMenuPosition這個函數比較復雜,但是好在它是在最后設置菜單位置的:
oPopup.style.left=posLeft+"px"; oPopup.style.top=posTop+"px"; oPopup.LeftForBackIframe=posLeft; oPopup.TopForBackIframe = posTop;這樣,我們就可以直接把代碼附加到這個函數后面來修復菜單的位置。
修復邏輯:
1-檢測菜單是否處于#s4-workspace內,若否,則不做操作(因為moss中的其他彈出菜單,包括網站操作,也是采用這個js來設置位置的)
2-如果菜單的left小于#s4-workspace的左側滾動寬度,則將菜單的left設置為#s4-workspace的左滾動寬度(scrollLeft)
4)修該moss自帶的js文件不是一個推薦的做法,因為系統升級的時候自帶的js文件可能被覆蓋掉。所以,這里采用一種類似于“重載”的方式。代碼如下:
//fix function begin-------------------- //add by zjy to fix the filter menu is hidden by left bar issue var defaultSetMenuPosition = SetMenuPosition; SetMenuPosition = function (oMaster, oParent, oPopup, oInnerDiv, fFlipTop, fTopLevel) {defaultSetMenuPosition(oMaster, oParent, oPopup, oInnerDiv, fFlipTop, fTopLevel);var $parentWs = $(oPopup).closest("#s4-workspace");if($parentWs.length==0)return;var wsScrollLeft = $parentWs.scrollLeft();var leftStr = "" + oPopup.style.left;var intMenuLeft = parseInt(leftStr.substring(0,leftStr.length-2)); //2px to 2if(intMenuLeft<wsScrollLeft){oPopup.style.left = wsScrollLeft + "px";oPopup.LeftForBackIframe = wsScrollLeft;} } //fix function end-----------------------備注:
1)將以上函數添加到任意地方即可,如自定義的母版頁中。
此函數依賴jquery,請確保母版頁引用jquery.
因為core.js是采用SOD加載的,所以需要用ExecuteOrDelayUntilScriptLoaded確保SetMenuPosition函數已加載:
// Fix issue: popup menu was hidden by left menu bar.ExecuteOrDelayUntilScriptLoaded(function () {var defaultSetMenuPosition = SetMenuPosition;SetMenuPosition = function (oMaster, oParent, oPopup, oInnerDiv, fFlipTop, fTopLevel) {defaultSetMenuPosition(oMaster, oParent, oPopup, oInnerDiv, fFlipTop, fTopLevel);var $parentWs = $(oPopup).closest("#s4-workspace");if ($parentWs.length == 0)return;var wsScrollLeft = $parentWs.scrollLeft();var leftStr = "" + oPopup.style.left;var intMenuLeft = parseInt(leftStr.substring(0, leftStr.length - 2)); //2px to 2if (intMenuLeft < wsScrollLeft) {oPopup.style.left = wsScrollLeft + "px";oPopup.LeftForBackIframe = wsScrollLeft;}}}, "core.js")</script>2)為避免列表項上下文菜單位置異常,滾動條一定要設置在s4-workspace上。
?
轉載于:https://www.cnblogs.com/jianyi0115/p/3777755.html
總結
以上是生活随笔為你收集整理的自定义母版页之列表过滤菜单位置issue fix的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: chapter 01
- 下一篇: Java输入数据流