保存日历项后调用 Javascript

Call Javascript After Saving Calendar Item

我的脚本如下:-

function getColorValue(aId,atitle) {
try{
        var clientContext = new SP.ClientContext();
        var oWebsite = clientContext.get_web();
        var oList = oWebsite.get_lists().getByTitle('Item type');
        var oListItem = oList.getItemById(parseInt(aId));
        clientContext.load(oListItem);
        clientContext.executeQueryAsync(function () {            
            var listItem = oListItem;
            var colorname = listItem.get_item('Color_x0020_Name');
            if (typeof colorname != 'undefined') {
                if (colorname != null) {
                    $("div[title$='" + atitle + "']").css("background-color", colorname);
                }
            }
        }, onColorQueryFail);
}
catch(e){

}
}

我需要在每次创建 SharePoint 日历项目后调用此脚本。

有人能帮忙吗?

创建事件接收器,其中类型为列表项事件,源为日历,然后检查'An item is being added' 处理事件。

然后在事件接收器的代码中:

public override void ItemAdding(SPItemEventProperties properties)
       {
           base.ItemAdding(properties);

           //Call your function through this
           Page.ClientScript.RegisterStartupScript(this.GetType(), "CallMyFunction", "MyFunction()", true);
       }

希望对您有所帮助:)

以下 JavaScript 示例演示了如何注册将在创建日历项目后触发的事件:

//custom handler that will be triggered after Calendar item is created
function onEventCreated(){
    alert('Event has been created...');     
}


function registerCalendarEventOnItemCreated(event)
{
    var currentCtx = getCurrentContextInfo();
    var calContainer = SP.UI.ApplicationPages.CalendarInstanceRepository.lookupInstance(currentCtx.ctxId);
    for(var name in calContainer) {
       if(calContainer.hasOwnProperty(name)) {
          var p = calContainer[name];
          if(p instanceof SP.UI.ApplicationPages.CalendarNewFormDialog) { 
              p.get_events().addHandler("newitemcreated",event);  
          }   
       }
     }
}

//get current context info
function getCurrentContextInfo()
{
   var currentListId = new SP.Guid(_spPageContextInfo.pageListId);
   for(var ctxKey in g_ctxDict){
     var curCtx = g_ctxDict[ctxKey];
     if(curCtx.listName == currentListId.toString()){
        return curCtx; 
     }
   }
   return null;
}  



//register Calendar events 
$('body').on('click', 'div#AsynchronousViewDefault_CalendarView', function() {
    registerCalendarEventOnItemCreated(onEventCreated);
});

Has been tested against SharePoint 2013/Online

在您的情况下,可以从 onEventCreated 调用函数 getColorValue,例如:

function onEventCreated(){
    getColorValue (id,title);     
}

如何应用更改

  1. 将页面切换到编辑模式
  2. Script Editor webpart 添加到页面中。
  3. 将指定的代码用script标签代码包装到脚本编辑器中,例如:<script type="text/javascript">{JavaScipt code goes here}</script>
  4. 保存页面

结果

我知道这是一个老问题,但给出的解决方案存在问题。

我需要对 Sharepoint online 中缺少的资源预留功能实施解决方法。不可能使用更适合现代体验的方法,因为它依赖于 Azure(没有可用的 Azure 订阅),所以我使用 Sharepoint API 调用来执行与资源预留相同的功能。

要使用 Sharepoint API,需要进行一些 Ajax 调用。但是我观察到每个请求都执行了两次调用。

关键是当你注册日历事件时,需要使用one附加点击事件,如下所示,以防止点击事件被触发多次。

//register Calendar events 
$('body').one('click', 'div#AsynchronousViewDefault_CalendarView', function() {
    registerCalendarEventOnItemCreated(onEventCreated);
});