Порядок отрисовки SharePoint DelegateControl
-
09-09-2019 - |
Вопрос
У меня есть две функции SharePoint, каждая из которых реализована одинаково (см. ниже), которые добавляют элементы управления к элементу управления делегата в заголовке моих страниц.Один из элементов управления зависит от другого (один — от библиотеки jQuery, а другой — от jQuery), однако при отрисовке элементов управления порядок элементов управления неверен.Как указать порядок отображения этих элементов управления?
Элемент управления (оба идентичны, за исключением того, что они ссылаются на другой файл .js):
<%@ Control ClassName="MyScriptControl" %>
<script type="text/javascript" src="/_layouts/MyScript.js"></script>
функция.xml:
<?xml version="1.0" encoding="utf-8" ?>
<Feature Id="AA9D59AC-D53E-4338-9B52-CD39F2A8C31A"
ActivateOnDefault="true"
Title="My Feature"
Description="Does something."
Scope="Site" Version="1.0.0.0"
Hidden="FALSE"
DefaultResourceFile="core"
xmlns="http://schemas.microsoft.com/sharepoint/">
<ElementManifests>
<ElementManifest Location="MyFeature\Elements.xml" />
</ElementManifests>
</Feature>
Элементы.xml:
<?xml version="1.0" encoding="utf-8" ?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/"
Id="24A4BB9A-9636-4a73-B3A5-35661DE19902">
<Control Id="AdditionalPageHead"
ControlSrc="~/_controltemplates/MyControl.ascx" />
</Elements>
Вывод на странице (jQuery развертывается до DependsOnjQuery):
<script type="text/javascript" src="/_layouts/DependsOnjQuery.js"></script>
<script type="text/javascript" src="/_layouts/jQuery.min.js"></script>
Я хочу, чтобы MyControl1.js отображался раньше MyControl2.js.
Решение
Мне удалось заставить это работать, добавив второй DelegateControl в заголовок моей главной страницы и добавив jQuery к этому делегату.Таким образом, я могу быть уверен, что jQuery всегда будет загружаться раньше всего остального, без необходимости писать какую-то логику, чтобы задержать загрузку моих зависимых библиотек.
<SharePoint:DelegateControl runat="server" ControlId="jQueryDelegate" AllowMultipleControls="true"/>
<SharePoint:DelegateControl runat="server" ControlId="AdditionalPageHead" AllowMultipleControls="true"/>
Другие советы
Мне кажется, что атрибут Sequence можно использовать для управления порядком рендеринга этих парней.Дайте вашему элементу управления jQuery последовательность 50, а вашему элементу управления DependsOnjQuery последовательность 100, и все будет хорошо.
См. Документация по делегированию контроля на MSDN для получения дополнительной информации.
Вы пытались установить атрибут DEFER="DEFER" в сценарии.
это сообщит пользовательскому агенту, что сценарий должен дождаться загрузки и отображения страницы, прежде чем загружать сценарий.
В противном случае вы можете взломать его, установив переменную в одном скрипте, которая будет иметь значение true при загрузке скрипта.В другом вы поместили логику, которая проверяла (подумайте о цикле и методе тайм-аута), был ли загружен сценарий, а затем вызывала вашу логику при загрузке обоих сценариев.
не очень приятно, но вам нужна какая-то логика для управления выполнением, а не просто запуск методов, встроенных в ваш скрипт.
Нэйтану:последовательности в делегатах используются для определения кто из делегатов контролирует загружать.Это не должно иметь никакого отношения к рассматриваемой проблеме.Насколько я понимаю, файлы JS просто устанавливают значение для сценария, который просто является элементом управления делегатом.