SharePoint 2010:创建模态对话框时出现JavaScript错误?

7

由于某些原因,我的SharePoint模态对话框无法正常工作。我收到的错误是:

  • 在Firefox中:SP.UI.$create_DialogOptions不是一个函数
  • 在IE中:对象不支持此属性或方法

这是我的代码:

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);

有趣的是,当我在Firebug中检查SP.UI时,并没有看到所有的方法和属性。
注意:我使用的是标准Webpart(不是可视化)而不是应用程序页面。

我们需要动态加载它的唯一原因是我们需要在网格单元格的点击事件上显示弹出窗口。 - Moon
1
@Ruby 不,不,我的意思是提供 SP.UI.$create_DialogOptions 的 JavaScript 还没有加载。SP2010 通过这种“动态”的 JS 机制创造了一个新的混乱。 - user166390
请确保对话框的创建发生在任何SP DOM“ready”事件之后,同时您的布局中是否有“sp.js”的OnDemand ScriptLink? - user166390
@pst 我之前使用了 var options = {...},然后它在 SP.UI.ModalDialog.showModalDialog(options); 处出现了问题。 - Moon
你认为这是因为我使用的是标准 Webpart 而不是应用程序页面吗? - Moon
显示剩余2条评论
4个回答

16

问题在于所需的SharePoint JavaScript“Library”未加载。(SharePoint 2010 JS十分混乱,名称空间等来自各处--此事进一步复杂化了新的“按需”加载)。

需要加载库来使用SP2010模态对话框接口(包括$create_DialogOptionsshowModalDialog),该库名为“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>中使用指定了OnDemandsp.js来解决,但我无法保证:(我认为此方法可能存在问题,但我无法回想起为什么它没有在我刚查看的项目中使用)。
<SharePoint:ScriptLink runat="server" Name="sp.js" OnDemand="true" Localizable="false" />

请参考SPSOD以获取更多详细信息。

编程愉快。


肯定有什么问题 :(. 只要正确的JS库被加载,Webpart就没有问题。 - user166390
@Ruby 我看到这个答案被接受了 - 你最终解决了问题吗?如果是这样(特别是如果与上面的不同),你是怎么做的? :) - user166390
我不想谈论浏览器缓存问题,因为这没有意义。但是我还是要说一下! - Moon
1
@Ruby 我能相信。很高兴它“修复”了。 - user166390

2
对我而言,它的工作方式是这样的:ExecuteOrDelayUntilScriptLoaded(function () {}, "sp.js") 还有:
<SharePoint:ScriptLink ID="ScriptLink1" runat="server" Name="sp.js" 
    OnDemand="false" Localizable="false" LoadAfterUI="true"/>

1
发现Adela和user166390的方法在旧版IE 7-8中失败。看起来页面没有完全解析,试图通过对话框的iframe进行修改,这对这些IE不利。对于我的情况——我需要在应用程序页面中自动弹出对话框——我用下面的方法解决了问题。
<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 JavaScript脚本。
这种方法是在MSDN论坛上发现的。

0
你可以通过使用通用对象而不是DialogOptions类来解决此问题。这意味着你需要像这样编写option:
//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%28v=office.14%29.aspx 并查看示例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接