Пользовательский 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 и ссылаюсь на него в веб-части ресурса на странице, он работает должным образом.