日历默认情况下全部展开

时间:2010-08-31 13:59:15

标签: calendar sharepoint-2010

任何人都知道如何在默认情况下展开日历视图?有关如何使用SP 2007而不是SP 2010执行此操作的大量信息。

6 个答案:

答案 0 :(得分:2)

Kuldeep,谢谢你的剧本!我稍微修改了它以扩展日历的所有行,方法是删除中断并检查锚文本是否“崩溃”。如果它不是“崩溃”,则执行单击。请注意,您只需要每行单击一个项目。否则,您可能会切换回折叠状态。

将CEWP添加到“日历”页面的另一个有问题的副作用是您丢失了“更改视图”下拉列表。您必须使用日历功能区来更改视图。

我还希望找到一个更强大的解决方案,但这是我的改进方案:

<script type="text/javascript">

_spBodyOnLoadFunctionNames.push("myFuncAfterLoad");

function myFuncAfterLoad() {
    var oldCalendarNotify4a = SP.UI.ApplicationPages.CalendarNotify.$4a;

    SP.UI.ApplicationPages.CalendarNotify.$4a = function () {
        oldCalendarNotify4a();
        myFuncToExpandCalendar();
    }
}

function myFuncToExpandCalendar() {
    try {
        var aTags = document.getElementsByTagName('A');
        for (i = 0; i < aTags.length; i++) {

            if ((aTags[i].evtid == "expand_collapse") && (aTags[i].innerText != "collapse")) {
                (aTags[i]).click();
            }
        }
    }
    catch (err) {
        alert(err.message);
    }
}

</script>

答案 1 :(得分:1)

不是最好的方法,但它有效,在CEWP或内联的页面上添加以下脚本:

<script type="text/javascript">

_spBodyOnLoadFunctionNames.push("myFuncafterLoad");

function myFuncafterLoad(){var OldCalendarNotify4a = SP.UI.ApplicationPages.CalendarNotify.$4a;SP.UI.ApplicationPages.CalendarNotify.$4a = function (){myFunctoExpandCalendar();OldCalendarNotify4a();}}

function myFunctoExpandCalendar(){try{var aTags=document.getElementsByTagName('A');for(i=0;i<aTags.length;i++){try{if(aTags[i].evtid=="expand_collapse"){aTags[i].click();break;}}catch(err){ alert('Bad Call at' + aTags[i].href);}}}catch(err){alert(err.message);}}</script>

它的作用是在加载日历后搜索第一个展开链接并模拟点击。

我不得不使用传统的Javascript,因为我无法使用JQuery触发click,因为没有使用JQuery添加click方法。

如果有人找到更好的解决方案,请告诉我。

答案 2 :(得分:1)

这个的两个选项。在CEWP中粘贴以下一项或另一项。

第一个将覆盖用于确定在显示展开/折叠链接之前要显示的项目数的功能。我在下面的示例中将其设置为100,以确保在我的用例中,我甚至从未看到展开/折叠按钮,并且我总是让所有项目一直呈现。

<script type="text/javascript">

_spBodyOnLoadFunctionNames.push('WaitForCalendarToLoad');

function WaitForCalendarToLoad() 
{   
    SP.UI.ApplicationPages.SummaryItemRenderer.prototype.$2u = function () 
    {
            ULSvSp: ;
            if (!this.$1A_1) this.$1A_1 = 100;
            return this.$1A_1
        }
}
</script>

第二个选项会覆盖日历通知事件,因此在呈现所有项目之后,脚本将找到第一个日历实例,并调用它的展开全部功能。这将确保默认情况下每个单元格都会展开,但仍会显示折叠链接。

<script type="text/javascript">

 _spBodyOnLoadFunctionNames.push('WaitForCalendarToLoad');

function WaitForCalendarToLoad() 
{   
    var old$4a = SP.UI.ApplicationPages.CalendarNotify.$4a;

    SP.UI.ApplicationPages.CalendarNotify.$4a = function () 
    {
        old$4a();

        ctrl = SP.UI.ApplicationPages.CalendarInstanceRepository.firstInstance();

        if (ctrl) {
            ctrl.expandAll();
        }
    }
}
</script>

答案 3 :(得分:0)

我正在使用它(2013年):

<style>
.ms-cal-nav { display:none; }
</style>

<script type="text/javascript">
  LoadSodByKey("SP.UI.ApplicationPages.Calendar.js", function () {
    window.setTimeout(ExpandCalendar, 500);
  });

  function ExpandCalendar() {
    // expand always
    $('.ms-cal-nav:has(img[src$="/expandbttn.gif"])').each(function() { this.click(); });

    window.setTimeout(ExpandCalendar, 1000);
  }
</script>

它每秒运行一次,虽然不好,但似乎可以完成工作

答案 4 :(得分:0)

因此,基于安德鲁·皮科克(Andrew Peacock)提供的原始解决方案(大概是针对SP2010),我能够以此为出发点,为SP2016提出可行的解决方案。

最大的区别似乎是CalendarNotify在SP2016中已弃用,这导致许多基于SP2010的解决方案无法在较新版本中使用。如果使用重叠日历,还会带来其他复杂性;似乎在页面加载过程中直到很晚才呈现重叠日历上事件的HTML元素-即使使用SP.SOD等待页面上最后一个源脚本(sp.ui.socialribbon.js)也不会等待很长时间足以使这些可用。我相信这就是为什么大多数(如果不是全部)依赖于SP2016日历的可用解决方案,都必须使用setTimeout()或setInterval()结束。对于我们的情况,对于第二种解决方案,我们需要等到所有叠加的事件都呈现在日历上之后再调用日历的expandAll()函数,否则它将无法正常工作。

话虽如此,这是我根据上面提到的原始SP2010解决方案提出的两个SP2016兼容解决方案。第一个选项将完全删除扩展/折叠链接,并确保将日历始终展开以显示所有事件。

第一种方法将覆盖内置功能,该功能设置“折叠项限制”(将强制显示“展开/折叠”链接的项数)。

<script type="text/javascript">
    function setCalendarCollapseItemLimit() {
        // Configure the calendar's "collapse item limit" so that it always shows
        // all items by default and never collapses them.
        SP.UI.ApplicationPages.SummaryItemRenderer.prototype.$3V_1 = function() {
            ULSvSp:;
            if(!this.$1B_1) {
                // This sets the "collapse item limit" to 100 events
                this.$1B_1 = 100;
            }
            return this.$1B_1;
        }
    }

    // Call our function once the necessary script is loaded (sp.ui.applicationpages.calendar.js in this case).
    ExecuteOrDelayUntilScriptLoaded(setCalendarCollapseItemLimit, "sp.ui.applicationpages.calendar.js");
</script>

此方法的优点是,即使在页面加载后将新事件添加到日历中,它也保持扩展状态,而无需手动重新扩展或刷新页面。缺点是升级后此解决方案可能需要更新,因为混淆的变量名称可能会更改(此示例已在带有2016/7/2017 CU的SP2016 / v16.0.4561.1000上运行确认。)

显示所有事件后,第二种方法将调用日历的内置expandAll()函数。这种方法的优点是,如果需要,它可以使“折叠”链接可供用户折叠日历。

<script type="text/javascript">
    function expandAllCalendarItems() {
        var cal = SP.UI.ApplicationPages.CalendarInstanceRepository.firstInstance();
        if (cal) {
            cal.expandAll();
            return true;
        } else {
            return false;
        }
    }

    // We need to use setInterval() here so that the calendar will be expanded when it becomes available and
    // after any overlaid calendar events have been rendered. An interval of 1400 seems to be sufficient for this.
    // We store the return value so that we can clear it (stop the loop) once we’ve successfully expanded it.
    var expItemsInterval = setInterval(function() {
        var retVal = expandAllCalendarItems();
        if (retVal === true) {
            // Calendar was expanded - clear interval
            clearInterval(expItemsInterval);
        }
    }, 1400);
</script>

我不是这个解决方案的忠实拥护者,尽管它有很多缺点。一种是,如果在页面加载后向其中添加了新事件,则日历将重新折叠。但是,更重要的是,我们所依赖的间隔足够长,以等待所有叠加的日历事件在页面上呈现(如果使用日历叠加层)。因此,我们这里有一种竞赛条件。在我的测试中,间隔1400似乎足够长,无法正常工作,但是从理论上讲,如果叠加事件需要太长时间才能呈现,则此解决方案可能无效。如果不使用重叠日历,那么这应该不是问题。

一种更合适的解决方案可能是使用MutationObserver之类的东西来监视添加到页面的新元素(特别是具有.ms-acal-mdiv类的div),如果出现以下情况,请再次调用expandAll():检测到新的。这也可以解决添加新事件后重新展开日历的问题。

总而言之,如果不需要向用户显示“折叠”链接,我更喜欢第一种解决方案。我认为它是最干净,最简单的方法,因为它不依赖于setInterval(),并且可以用于常规日历和重叠日历。

非常感谢Andrew Peacock在这里提供的原始解决方案;这些使我走上了正确的道路,以便为SP2016解决这些问题。

* EDIT:删除了jQuery依赖项,因为它是不必要的,并在代码周围添加了脚本标签。这需要通过SharePoint Designer在PlaceHolderMain标记下实现(使用SEWP或CEWP可能也可以,但是我没有使用这些方法进行测试)。

答案 5 :(得分:-1)

function expandCalendar() 
{
    var calendar = SP.UI.ApplicationPages.CalendarInstanceRepository.firstInstance();
    if (calendar && typeof calendar.expandAll === 'function') {
        calendar.expandAll();
    }