Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top