SharePoint 功能区:规避上下文敏感度

本文关键字:上下文 敏感度 功能区 SharePoint | 更新日期: 2023-09-27 18:31:27

我是 sharepoint 开发的新手,我正在尝试修改 SharePoint 功能区的行为。众所周知,功能区是这样的,当其他内容获得焦点(例如列表项)时,功能区会自动切换到适当的选项卡或选项卡组(例如列表工具选项卡组)。

我想禁用这种选项卡的不断切换,并使浏览选项卡始终是活动选项卡,除非用户明确单击另一个选项卡。

我尝试在用户控件的 Page_Load() 中执行以下操作,但它仅在最初加载页面时工作一次。我做错了什么?更重要的是,我怎么能做对呢,如果有的话?

基本上,我希望有人能指出上下文更改和功能区切换时触发的事件,以及如何挂接到此事件并强制功能区切换回浏览选项卡。

protected void Page_Load()
        {
            string showBrowseTabScript = string.Empty;
            showBrowseTabScript = @"
                                function ShowBrowseTab() {
                                         var ribbon = SP.Ribbon.PageManager.get_instance().get_ribbon();
                                         SelectRibbonTab(""Ribbon.Read"", true);
                                      }
                                      SP.SOD.executeOrDelayUntilScriptLoaded(function() {
                                         var pm = SP.Ribbon.PageManager.get_instance();
                                         pm.add_ribbonInited(function() {
                                            ShowBrowseTab();
                                         });
                                         var ribbon = null;
                                         try
                                         {
                                            ribbon = pm.get_ribbon();
                                         }
                                         catch (e) { }
                                         if (!ribbon) {
                                            if (typeof(_ribbonStartInit) == ""function"")
                                               _ribbonStartInit(_ribbon.initialTabId, false, null);
                                         }
                                         else {
                                            ShowBrowseTab();
                                         }
                                      },
                                      ""sp.ribbon.js"");
                                ";
            this.Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "BrowseTabScript", showBrowseTabScript, true);
        }

SharePoint 功能区:规避上下文敏感度

这是我对这个问题的解决方案,以防有人感兴趣。

考虑到 Ken Henderson 的建议,我能够实现我一直在尝试做的事情,尽管我通过修改 SP 的代码来实现了这一点。功能区.js和 SP。功能区调试.js文件。我正在使用 SP。Ribbon.debug.js在下面显示我的解决方案,因为它不像SP那样神秘。丝带.js。

基本上,我使用下面的代码来欺骗功能区,使其认为用户位于不同的选项卡上,并且单击了"浏览"选项卡。您会注意到我在代码中设置了旧的选项卡信息。没有我这样做,它仍然可以工作,但我这样做只是为了以防功能区需要这些信息来做我不知道的其他事情。此代码与我在第一篇文章中发布的 Page_Load() 函数相结合,使功能区的行为就像我需要的那样。

SP.Ribbon.PageManager.prototype = {
    executeRootCommand: function (commandId, properties, commandInfo, root) {
        ULSMg8: ;
        var $v_0;
        if (!SP.ScriptUtility.isNullOrUndefined(commandInfo) && commandId !== 'RibbonEvent' && (commandId !== 'CommandContextChanged' || (!SP.ScriptUtility.isNullOrUndefined(properties) && properties['ChangedByUser']))) {
// My changes to SP.Ribbon
if (properties["ChangedByUser"] === false) {
            properties["ChangedByUser"] = true;
            var $NewContextId = properties["NewContextId"];
            var $NewContextCommand = properties["NewContextCommand"];
            properties["OldContextId"] = $NewContextId;
            properties["OldContextCommand"] = $NewContextCommand;
            properties["NewContextId"] = "Ribbon.Read";
            properties["NewContextCommand"] = "ReadTab";
            SelectRibbonTab("Ribbon.Read", true);
        }
// End of changes to SP.Ribbon
            // the rest of the code has been ommitted for clarity
        return $v_0;
    }
}

据我所知,SharePoint 不会公开任何事件来检测功能区选项卡何时更新(添加/删除选项卡或处于活动状态的选项卡)。 至少几周前当我试图检测何时添加/删除选项卡时,我找不到任何选项卡(我不在乎哪个处于活动状态,只是它们的数量/宽度)。

(很抱歉缺少详细信息,办公室的 SharePoint 开发环境目前不可用,所以我无法轻松查找详细信息。

解决此问题有两种可能性(每种都有风险/问题):

覆盖 JS 功能

弄清楚当用户单击更新功能区的项目时调用的 JavaScript 函数。 您也许可以将该函数替换为提供所需行为的自己的函数。 这在概念上类似于在窗口上滚动并且必须更改宽度大小调整行为的自定义母版页。 我目前无法验证详细信息,但看起来该函数在核心.js中称为 SingleItemSelect。

如果您对何时覆盖此行为有例外,并且如果 MS 更改了将来您的实现可能会中断和/或需要更新的任何内容,这可能是一个问题。

添加您自己的事件处理程序

在您的 JavaScript 代码中,尝试在功能区中找到适当的 DOM 事件以将事件处理程序附加到该事件区,以检测 MS 的代码何时更改功能区。 考虑到 DOM 事件的限制,很有可能没有要附加处理程序的事件。 您最终可能会添加一个定期调用的函数(轮询循环/计时器),该函数检测功能区选项卡更改并重置活动选项卡。

老实说,这不会很好地工作,因为当MS的功能区代码更改活动选项卡而您的功能区代码将其更改回来时,会出现闪烁。 此外,还需要检测用户何时单击选项卡,以便不会撤消其更改。

老实说,我会反击并更改此要求,以便功能区行为按照MS设计的方式工作,而不是试图与之抗争。 如果用户单击项目时显示的功能区确实是一个问题,那么我会向客户端建议,而不是强制Browse选项卡处于活动状态,而是在功能区区域中的某个地方添加一个额外的链接,允许功能区(或至少在标题区域上扩展的部分)切换为隐藏/显示独立于 MS 的 JavaScript 对功能区执行的操作。