SharePoint 2010: ошибка JavaScript при создании модального диалога?

#sharepoint #sharepoint-2010 #sharepoint-clientobject

#sharepoint #sharepoint-2010 #sharepoint-clientobject

Вопрос:

По какой-то причине модальный диалог моего SharePoint не работает должным образом. Ошибка, которую я получаю, заключается в следующем:

  • В Firefox: SP.UI.$create_DialogOptions is not a function
  • В IE: Object doesn't support this property or method

Вот мой код:

 var options = SP.UI.$create_DialogOptions();
options.width = 525;
options.height = 300;
options.url = '/_layouts/mywork/richtexteditor.aspx';
options.dialogReturnValueCallback = Function.createDelegate(null, function (result, value)
{
    alert(result   value);
});

SP.UI.ModalDialog.showModalDialog(options);
  

Интересно, что когда я проверяю SP.UI в Firebug, я не вижу всех методов и свойств.

ПРИМЕЧАНИЕ: Я использую стандартную веб-часть (не визуальную), а не страницу приложения.

Комментарии:

1. Соответствующий SP «модуль» загружен неправильно. Скорее всего, это бессмысленно связано с динамической загрузкой JS (и не загружается во время вызова). Смотрите ilovesharepoint.com/2010/08 / … по сути.

2. Единственная причина, по которой нам нужно загружать его динамически, заключается в том, что нам нужно показывать всплывающее окно при событии щелчка в ячейке нашей сетки

3. @Ruby Нет, нет, я имею в виду, что JavaScript, который предоставляет SP.UI.$create_DialogOptions , еще не загружен. SP2010 создал новый беспорядок с этим «динамическим» материалом JS.

4. Убедитесь, что создание диалога также происходит после любого события SP DOM «ready» — у вас есть ссылка на скрипт OnDemand для «sp.js «в макете нет?

5. P.S. Просто используйте: var options = {...} , хотя это просто отложит ошибку до showModalDialog строки. Я не уверен, почему $create_DialogOptions когда-либо так широко предлагалось…

Ответ №1:

Проблема в том, что требуемая «Библиотека» SharePoint JavaScript не была загружена. (В SharePoint 2010 JS царит изрядный беспорядок, а пространства имен / etc. Приходят отовсюду — вопрос еще более усложняется с новой загрузкой «по требованию»).

Библиотека, которую необходимо загрузить для использования модального диалогового интерфейса SP2010 (включая $create_DialogOptions и showModalDialog ), является «sp.js «.

Для обеспечения «sp.js «загружено:

 ExecuteOrDelayUntilScriptLoaded(function () {
  // do modal dialog stuff in here (or in another function called from here, etc.)
}, "sp.js")
  

Функция обратного вызова вызывается только после «sp.js «(включая SP.UI.ModalDialog материал) гарантированно будет загружен (и он может никогда не вызываться при возникновении ошибки загрузки).

Это также, вероятно, можно было бы решить с помощью <ScriptLink> to sp.js с OnDemand указанным, но я не могу этого гарантировать: (Я думаю, что, возможно, были проблемы с этим подходом, но я не могу вспомнить, почему он не используется в проекте, который я только что просмотрел.)

 <SharePoint:ScriptLink runat="server" Name="sp.js" OnDemand="true" Localizable="false" />
  

Смотрите SPSOD для получения более подробной информации.

Удачного кодирования.

Комментарии:

1. Тогда что-то определенно не так :(. С веб-частью проблем нет, пока загружены правильные библиотеки JS.

2. @Ruby Я вижу, что этот ответ был принят — вы в конечном итоге устранили проблему, и если да (особенно если она отличалась от приведенной выше), то каким образом? 🙂

3. Я не хочу, чтобы проблема с кэшированием в браузере sat, потому что это не имеет смысла. Но я все равно это скажу!

4. @Ruby Я могу в это поверить. Рад, что это «исправлено».

Ответ №2:

Для меня это работало так: ExecuteOrDelayUntilScriptLoaded(function () {}, "sp.js")

и:

 <SharePoint:ScriptLink ID="ScriptLink1" runat="server" Name="sp.js" 
    OnDemand="false" Localizable="false" LoadAfterUI="true"/>
  

Ответ №3:

Обнаружено, что оба подхода Adela и user166390 терпят неудачу в старых версиях 7-8. Кажется, что страница не полностью проанализирована и ее пытались изменить с помощью iframe диалога, и это плохо для этих файлов. В моем случае — мне нужно автоматически всплывающее диалоговое окно на странице приложения — я исправил это с помощью next

 <asp:Content ID="PageHead" ContentPlaceHolderID="PlaceHolderAdditionalPageHead" runat="server">
    <SharePoint:SPPageManager ID="SPPageManager1" runat="server" />
    <script type="text/javascript">
        var ShowDialog = function () {
            var options = {
                url: '/_login/default.aspx,
                title: 'Title, Description, and Icon',
                width: 640,
                height: 400,
                dialogReturnValueCallback: function(dialogResult, returnValue) {
                    window.location.replace(returnValue);
                }
            };

            SP.UI.ModalDialog.showModalDialog(options);
        };

        ExecuteOrDelayUntilScriptLoaded(ShowDialog, "sp.ui.dialog.js");
    </script>
</asp:Content>
  

Эта маленькая вещь

 <SharePoint:SPPageManager ID="SPPageManager1" runat="server" />
  

регистрирует все SP javascripts.

Подход был найден на форумах MSDN.

Ответ №4:

Вы можете устранить эту проблему, используя универсальный объект для option вместо класса DialogOptions. это означает, что вы должны написать параметр, подобный этому:

 //Using a generic object.
var options = {
    title: "My Dialog Title",
    width: 400,
    height: 600,
    url: "/_layouts/DialogPage.aspx" };
  

для получения дополнительной информации об его использовании посетите:
http://msdn.microsoft.com/en-us/library/ff410058(v=office.14).aspx
и посмотрите пример.