29

免责声明:我没有使用 SharePoint2013 的经验。

我有问题 - 我必须在整个页面加载后包含/触发一些 javascript 函数。我尝试收听 DOMDocumentReady 和 window.load 事件,但 sharepoint 在这些事件之后呈现页面的其余部分。

我的问题是:在呈现整个带有 ajax 的页面后,我应该怎么做才能运行脚本。我还注意到页面导航基于哈希 (#) 部分。显然我也必须检测到那个时刻。

任何帮助甚至指向文档中正确页面的链接都会很棒!

4

5 回答 5

58

你是对的,很多事情发生在 $(document).ready() 之后的页面上。2013 确实提供了一些选择。

1)按需脚本:(加载一个js文件然后执行我的代码。)

function stuffThatRequiresSP_JS(){
    //your code
}

SP.SOD.executeFunc("sp.js")

2)延迟直到加载(等待一个js文件,然后运行)

function stuffToRunAfterSP_JS(){
    //your code
}
ExecuteOrDelayUntilScriptLoaded(stuffToRunAfterSP_JS, "sp.js")

3)在其他东西完成后加载

function runAfterEverythingElse(){
    // your code
}
_spBodyOnLoadFunctionNames.push("runAfterEverythingElse");

资料来源:

executeFunc: http: //msdn.microsoft.com/en-us/library/ff409592 (v=office.14).aspx

ExecuteOrDelayUntilScriptLoaded: http: //msdn.microsoft.com/en-us/library/ff411788 (v=office.14).aspx

在 _spBodyOnLoadFunctionNames 上找不到源,但我在几个地方使用它。

祝你好运。

于 2013-06-26T17:11:38.367 回答
12

一个文档化的事件注册函数,大致相当于_spBodyOnLoadFunctionNamesis SP.SOD.executeOrDelayUntilEventNotified。调用它来接收“sp.bodyloaded”事件的通知:

SP.SOD.executeOrDelayUntilEventNotified(function () {
    // executed when SP load completes
}, "sp.bodyloaded");

这个处理程序实际上在_spBodyOnLoadFunctionNames函数之前稍微触发。

此参考适用于 SharePoint 2010,但 SOD 实用程序存在于 SharePoint 2013 中:http: //msdn.microsoft.com/en-us/library/office/ff410354 (v=office.14).aspx

于 2014-05-20T15:25:10.543 回答
8

有不同的技术用于提供我们在 SharePoint 中的 OnLoad 事件之前/中间/之后加载的自定义 JavaScript 代码:

ExecuteOrDelayUntilBodyLoaded.
Sys.Application.pageLoad.
document.ready Jquery.
_spBodyOnLoadFunctionNames.
_spBodyOnLoadFunction.
ExecuteOrDelayUntilScriptLoaded:sp.core.js.
SP.SOD.executeFunc: sp.js.
Sys.WebForms.PageRequestManager.PageLoaded

– ExecuteOrDelayUntilBodyLoaded 函数总是最先执行(但在这个阶段我们无法访问 SP 方法)。这对于在 OnLoad 过程的早期阶段执行我们的自定义代码可能很有用。

– 有两个 SharePoint onLoad 函数 _spBodyOnLoadFunctionNames 和 _spBodyOnLoadFunction。始终按顺序执行。所以,如果我们想在我们(或其他开发人员)包含在 _spBodyOnLoadFunctionNames 中的所有函数之后执行一些代码,那么使用这个 _spBodyOnLoadFunction 很有用,因为最后执行。

– ExecuteOrDelayUntilScriptLoaded:sp.core.js 和 SP.SOD.executeFunc:sp.js。正在以随机方式交换执行顺序。

– 如果我们想在所有函数之后执行一些函数(SP、加载后函数、Yammer 等),我们可以使用此函数附加 OnLoad 事件 –> Sys.WebForms.PageRequestManager.PageLoaded。

你可以在这里看到整篇文章解释每种类型的优缺点:https ://blog.josquinto.com/2015/06/16/custom-javascript-function-loaded-after-the-ui-has-loaded-in -sharepoint-2013/

问候!

于 2015-06-16T14:07:21.763 回答
2

https://mhusseini.wordpress.com/2012/05/18/handle-clicks-on-calendar-items-in-sharepoint-2010-with-javascript/

上面的链接对我有用。他基本上使用 ExecuteOrDelayUntilScriptLoaded 在 SP.UI.ApplicationPages.Calendar.js 加载后启动他的日历挂钩代码。

然后,在日历挂钩中,他将自己的函数附加到:SP.UI.ApplicationPages.CalendarStateHandler.prototype.onItemsSucceed 函数。

 _spBodyOnLoadFunctionNames.push("LaunchColorCodeCalendarScriptOnReady");


function LaunchColorCodeCalendarScriptOnReady() {


    ExecuteOrDelayUntilScriptLoaded(
        MyCalendarHook,
        "SP.UI.ApplicationPages.Calendar.js");


}

function MyCalendarHook() {
    var _patchCalendar = function () {
        //Do something to the items in the calendar here
        //ColorCodeCalendar();
    };

    var _onItemsSucceed = SP.UI.ApplicationPages.CalendarStateHandler.prototype.onItemsSucceed;
    SP.UI.ApplicationPages.CalendarStateHandler.prototype.onItemsSucceed = function ($p0, $p1) {
        _onItemsSucceed.call(this, $p0, $p1);
        _patchCalendar();
    };
}
于 2015-06-10T08:33:37.300 回答
0

这是一篇很好的文章如何使用内置的 SharePoint SOD(按需脚本)功能:http ://www.ilovesharepoint.com/search/label/SOD

它适用于 SP 2010 和 2013。

按需脚本加载的想法非常有意义。SharePoint 2010 加载了很多 JavaScript - 这需要时间!所以想法是:首先加载 HTML 并让它由浏览器呈现,以便用户能够尽可能快地阅读请求的信息。在第二步中加载行为(JavaScript)。

于 2016-12-08T10:17:15.200 回答