在SharePoint2013中,经常需要对用户界面进行定制以满足特定的业务需求。一个常见的需求是控制用户对列表项的删除权限。例如,可能希望在用户选择列表项时禁用删除图标,但当用户登录到SharePoint站点并选择他们自己创建的列表项时,如果只选择了一个,他们应该能够看到删除选项。这可以通过自定义权限级别来实现,删除权限被移除,并且使用项目级别或文件夹级别的权限,但这可能会导致权限继承管理上的问题。另一种方法是编写事件处理程序来防止删除该项,但最佳实践是使用jQuery/CSOM/REST API来实现。
以下是实现上述需求的步骤:
首先,访问SharePoint2013网站。
从该页面,选择“站点操作”|“编辑页面”。编辑页面后,转到Ribbon上的“插入”选项卡,点击“Web部件”。在“Web部件”选择器区域,转到“媒体和内容”类别,选择“脚本编辑器”Web部件并按下“添加”按钮。
一旦Web部件被插入到页面中,会看到一个“编辑代码片段”链接;点击它。可以插入以下HTML和/或JavaScript代码:
        <script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.9.1.min.js"></script>
        <script type="text/javascript">
        $(document).ready(function() {
            ExecuteOrDelayUntilScriptLoaded(init_HideButton, "sp.ribbon.js");
        });
        function init_HideButton() {
            setInterval(function() {
                HideDeleteIconRibbomButton();
            }, 1000);
        }
        function HideDeleteIconRibbomButton() {
            $('a[id*="Ribbon.ListItem.Manage.Delete-Medium"]').hide();
            var cc = new SP.ClientContext.get_current();
            var web = cc.get_web();
            var listId = SP.ListOperation.Selection.getSelectedList();
            var selectedItems = SP.ListOperation.Selection.getSelectedItems();
            if (selectedItems.length == 1) {
                var flag = CheckCreatedAuthor(listId, selectedItems[0].id, _spPageContextInfo.userId);
                if (flag) {
                    $('a[id*="Ribbon.ListItem.Manage.Delete-Medium"]').show();
                }
            } else {
                $('a[id*="Ribbon.ListItem.Manage.Delete-Medium"]').hide();
            }
        }
        function CheckCreatedAuthor(ListId, ItemID, AuthorID) {
            var result = false;
            var url = _spPageContextInfo.webAbsoluteUrl + "/_api/web/lists/getbyid('" + ListId + "')/items?$filter=((ID eq '" + ItemID + "') and (ApprovalStatus eq 'Draft') and (Author/ID eq '" + AuthorID + "')";
            getListItems(url, function(data) {
                var items = data.d.results;
                if (items.length > 0) {
                    result = true;
                } else {
                    result = false;
                }
            }, function(data) {
                result = false;
            });
            return result;
        }
        function getListItems(siteurl, success, failure) {
            $.ajax({
                async: false,
                url: siteurl,
                method: "GET",
                headers: {
                    "Accept": "application/json; odata=verbose"
                },
                success: function(data) {
                    success(data);
                },
                error: function(data) {
                    failure(data);
                }
            });
        }
        </script>
    
在没有任何列表项选择的情况下隐藏Ribbon上的删除图标: