Пользовательский JavaScript в SharePoint 2016 не запускает OnPostRender

У меня есть пользовательский процесс выноски в файле JavaScript, который я загрузил в наш экземпляр SharePoint 2016. Почти такой же код используется с экземпляром SharePoint Online без каких-либо проблем.

Единственная разница в коде - это включение SP.SOD.executeFunc чтобы убедиться, что callout.js из SharePoint загружен.

Кажется, что происходит, когда код выбирается, но не загружается, когда я нажимаю на соответствующий элемент в библиотеке документов. Если я затем нажимаю на эллипсы в списке, вызывая стандартную выноску, предоставляемую SharePoint, то нажимаю на мой элемент - код запускается. Но когда я впервые загружаю страницу, я вижу callout.js в списке доступных ресурсов.

Как сделать мой код доступным, когда страница впервые загружается, и я щелкаю по своему элементу с помощью пользовательского выноски, не нажимая сначала на объект выноски SharePoint по умолчанию?

SP.SOD.executeFunc("callout.js", "Callout", loadPreview);

function loadPreview()
{
    var itemCtx = {};
    itemCtx.Templates = {};
    // Define the list template type
    itemCtx.ListTemplateType = 101;
    itemCtx.OnPostRender = function(ctx) {
        var rows = ctx.ListData.Row;
        for (var i = 0; i < rows.length; i++) {
            if (rows[i].File_x0020_Type.toLowerCase() === 'eml') {
                var rowElementId = GenerateIIDForListItem(ctx, rows[i]);
                CustomRenderEMailSection(ctx, rows[i], rowElementId);
            }
        }
    };

    SPClientTemplates.TemplateManager.RegisterTemplateOverrides(itemCtx);
};

function buildCallout(renderCtx, data)
{
  jQuery(document).ready(function ()
  {
        var placeHolder = jQuery(jQuery(jQuery(renderCtx.getContentElement()).children(".js-callout-body")[0]).children(".emailPlaceHolder")[0])
        var url = placeHolder.attr("data-url")
        placeHolder.html("<p>Hello!</p>");
  });
}

function CustomRenderEMailSection(ctx, row, rowid)
{
  if (row.File_x0020_Type.toLowerCase() !== 'eml') return;
  var td = document.getElementById(rowid).cells[0].querySelector("div");
  var url = converationDomain + "/sharepoint/previewemail?url=" + sharePointDomain + encodeURIComponent(row.FileRef);
  EnsureScriptFunc("callout.js", "Callout", function ()
  {
        var calloutPopUpOptions = {}
        calloutPopUpOptions.ID = 'EmailPreviewCallout_' + rowid; //Set the id  
        calloutPopUpOptions.launchPoint = td; //Set the destination element  
        calloutPopUpOptions.beakOrientation = 'topBottom';
        calloutPopUpOptions.onOpeningCallback = function (calloutPopUpOptions) { return buildCallout(calloutPopUpOptions, null); }
        calloutPopUpOptions.content = "<div class='emailPlaceHolder' data-url='" + url + "'></div>";
        calloutPopUpOptions.openOptions = { event: 'click', showCloseButton: true };
        calloutPopUpOptions.contentWidth = 600;
        CalloutManager.createNewIfNecessary(calloutPopUpOptions);
  });
}

Обновить

Мне удалось доказать, что проблема была вызвана тем, как загружен скрипт. Поскольку это необходимо использовать на всем сайте, я использовал команду PowerShell Add-PnPJavaScriptLink сделать его доступным для всех страниц (и я вижу, что он загружен для всех страниц).

Однако, если я размещаю JavaScript в Site Assets и ссылаюсь на него в веб-части ресурса на странице, он работает должным образом.

укажите js для использования в веб-части

0 ответов

Другие вопросы по тегам