任何人都知道如何在默认情况下展开日历视图?有关如何使用SP 2007而不是SP 2010执行此操作的大量信息。
答案 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();
}