Страницы с тегами : jQuery
Загрузка скриптов в SharePoint
В прошедшем недавно семинаре про клиентской разработке в SharePoint (записи – по ссылке) я показывал как сделать клиентский скрипт, который выполняет некоторый код после окончания загрузки страницы в SharePoint.
Эта, казалось бы, простая задача далеко не тривиально реализуется в SharePoint.
Причины
- SharePoint формирует интерфейс динамически. Многие блоки добавляются на страницу по событию body.onload. Это событие возникает позже, чем DOMContentLoaded. Именно это событие перехватывает jQuery.ready. Поэтому использование jQuery часто не приводит к хорошему результату. Подробнее об использовании jQuery в SharePoint.
- Minimal Download Strategy (MDS), появившийся в SharePoint 2013, загружает страницу один раз, потом обновляет блоки страницы, поэтому нужно выполнять дополнительные действия, чтобы скрипт выполнился после загрузки страницы под MDS.
- Механизм загрузки скриптов, о котором я писал ранее, требует чтобы скрипт самостоятельно оповещал об окончании выполнения.
Для скриптов в виртуальной файловой системе SharePoint
Чаще всего скрипты SharePoint деплоятся как файлы в виртуальной файловой системе. Это прекрасно работает как в on premises, так и в online.
Для размещения скриптов на странице используется контрол ScriptLink, в таком виде:
<SharePoint:ScriptLink Name="autofill.js" runat="server" OnDemand="true" LoadAfterUI="true" Localizable="false" />
или с помощью CustomAction ScriptLink в элементе решения
<CustomAction Location="ScriptLink" ScriptSrc="~site/Extensions/typescripttemplates.js" />
Внутри скрипта нужно выполнить следующие действия:
- Оповестить SharePoint об окончании загрузки.
- Добавить функцию, которую необходимо вызывать после загрузки страницы, в массив _spBodyOnLoadFunctions.
- Добавить зарегистрировать скрипт в системе MDS.
Код:
// IIFE для изоляции (function () { "use strict";
10 вещей, которые надо знать при использовании jQuery в SharePoint
Для чего нужен jQuery в SharePoint? Обычно его используют для четырех целей:
- Вызывать код JavaScript в момент загрузки страницы с помощью $(document).ready.
- Использовать Ajax функции для доступа к данным на сервере.
- Использовать готовые плагины,такие как tooltip или tabs, для того, чтобы расширить функционал сайта.
- Проводить некоторые манипуляции с объектной модели документа (DOM).
Если Вы собираетесь использовать jQuery на страницах SharePoint, то вам нужно знать следующие вещи:
1. Используйте mQuery и RequestExecutor в простых случаях
Если у вас простой случай, то Вы можете использовать библиотеку mQuery для манипуляции DOM и RequestExecutor для ajax запросов. Кроме того, вместо Ajax запросов гораздо выгоднее использовать JSOM и TypeScript для клиентской разработки. Об этом я писал ранее.
Если Вы, все таки, решили использовать jQuery, то вам нужно помнить следующее:
2. jQuery(document).ready срабатывает не вовремя
Это происходит потому, что $(document).ready взрывается при событии DOMContentLoaded. А это события создано для тех случаев, когда весь контент страницы загружается с сервера. Оно происходит после того как браузер скачал всю страницу, связанные файлы и всё распарсил. SharePoint использует механизмы динамического формирования страницы, когда скрипты в теле страницы запускаются и формируют части страницы. В этом случае использовать DOMContentLoaded, отрабатывает до того как сформирована страница. Гораздо более надежный способ вызова после загрузки страницы – с помощью события body.onload. Для этого в SharePoint есть готовые функции.
3. Используйте _spBodyOnLoadFunctions или _spBodyOnLoadFunctionNames
Эти два массива (да-да, обычные JS массивы). _spBodyOnLoadFunctionNames содержит имена глобальных функций, которые необходимо вызвать на событие body.onload. _spBodyOnLoadFunctions содержит объекты-функции, что гораздо удобнее, но доступно только в SharePoint 2013. Кроме того есть переменная _spBodyOnLoadCalled, которая равна true, если функции уже были выполнены.
Пример:
(function() { if (!_spBodyOnLoadCalled) { _spBodyOnLoadFunctions.push(pageLoad); } else { pageLoad(); }
Поиск в приложениях SharePoint. Часть 3.
В SharePoint 2013 появился REST веб-сервис, который позволяет делать поисковые запросы из JavaScript. В SharePoint 2010 есть только search.asmx, который требует генерировать и парсить большой объём XML (в лучших традициях SharePoint).Чтобы упростить жизнь разработчику клиентских компонентов я написал REST веб-сервис для SharePoint 2010.
Реализация
За основу взял метод, который описывал ранее - Javascript-enabled SharePoint WCF services.
Контракт у сервиса очень простой:
[ServiceContract] public interface ISearch { [OperationContract] [WebGet(BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)] Stream Query(string q, int top, int skip, string select, string orderBy, bool includeRefiners, string refiners); }
Параметры вызова:
- q – текст запроса (обязательно).
- top – количество результатов.
- skip – с какой позиции в выборке отдавать результаты.
- select – через запятую названия managed properties в результатах.
- orderBy – через запятую названия managed properties по которым сортировать результат, после имени можно указать desc для сортировки по убыванию.
- includeRefiners – true или false, возвращать результаты уточнений или нет.
- refiners - через запятую названия managed properties для формирования уточнений.
Реализация:
public System.IO.Stream Query(string q, int top, int skip, string select, string orderBy, bool includeRefiners, string r) { using (new SPMonitoredScope("Execute Query Method")) { var site = SPContext.Current.Site; var result = GetSearchResults(site, q, top, skip, select, orderBy, includeRefiners, r); return ToJson(result); } }
Метод GetSearchResults довольно простой, он передает параметры запроса в объект KeywordQuery и получает результат.
private static ResultTableCollection GetSearchResults(SPSite site, string q, int top, int skip, string select, string orderBy, bool includeRefiners, string r) { var query = new KeywordQuery(site); query.QueryText = q; query.StartRow = skip; if (top > 0) { query.RowLimit = top; }
Применение mQuery в SharePoint 2013
Нет, в заголовке не опечатка. Я действительно имею ввиду mQuery, а не jQuery. mQuery – аналог библиотеки jQuery, включенный в состав SharePoint 2013. Как обычно эта библиотека недокументированна и известна очень малому количеству людей. Исследовал её Антон Вишняков и опубликовал обзор с примером в своем блоге.
Что такое mQuery
Группа разработчиков SharePoint нашла критический недостаток в jQuery – её написали не они. И поэтому решили сделать свой jQuery с пасьянсом и куртизанками. Это конечно шутка.
Правда заключается в том, что jQuery – фактически стандарт для веб-разработки, но её довольно проблематично использовать в SharePoint. Часто возникают конфликты с другими расширениями, которые тоже хотят использовать jQuery других версий. Кроме того переопределение переменной $ в клиентском скрипте ломает Asset Picker и еще некоторые функции в SharePoint 2010 (в 2013 тоже ломается asset picker).
Поэтому было решено включить подмножество jQuery в SharePoint 2013, которое назвали mQuery. Точка входа – переменная m$, доступное API во многом повторяет jQuery, но есть отличия.
Вы спросите – а почему было не включить саму библиотеку jQuery в SharePoint? Увы, ответа на этот вопрос я не знаю, как и не знаю планов на будущее mQuery.
Как использовать mQuery
На всех страницах SharePoint 2013 библиотека mQuery уже присутствует как OnDemand, то есть загружаемая о требованию. Для использования mQuery надо написать такой код:
SP.SOD.executeFunc('mQuery.js', 'm$', function() { // DO STUFF }
Если вы разрабатываете с использованием TypeScript, то можете взять определения из проекта SPTypeScript, и получите не только intellisence в студии, но и проверку типов при компиляции.
Если же пишете JavaScript в VisualStudio, то в начале js файла добавьте строку:
/// <reference path=”C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\TEMPLATE\LAYOUTS\mQuery.debug.js” />