免责声明:我没有使用SharePoint2013的经验。
我有问题 - 我必须在整个页面加载后包含/触发一些javascript函数。我试着听DOMDocumentReady和window.load事件,但sharepoint在这些事件之后呈现页面的其余部分。
我的问题是:在呈现带有ajax的整个页面后,我应该怎么做才能运行脚本。 另外我注意到页面导航基于哈希(#)部分。显然我也必须发现那一刻。
任何帮助,甚至链接到文档中的右页都会很棒!
答案 0 :(得分:56)
你是对的,$(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上找到源代码,但我在一些地方使用它。
祝你好运。答案 1 :(得分:10)
大致相当于_spBodyOnLoadFunctionNames
的文档化事件注册函数是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
答案 2 :(得分: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.josequinto.com/2015/06/16/custom-javascript-function-loaded-after-the-ui-has-loaded-in-sharepoint-2013/
问候!
答案 3 :(得分:2)
以上链接对我有用。在加载SP.UI.ApplicationPages.Calendar.js之后,他基本上使用ExecuteOrDelayUntilScriptLoaded来启动他的日历钩子代码。
然后,在日历钩子中,他将自己的功能附加到: 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();
};
}
答案 4 :(得分:0)
以下是一篇很好的文章如何使用内置的SharePoint SOD(脚本点播)功能:http://www.ilovesharepoint.com/search/label/SOD
它适用于SP 2010和2013.
按需脚本加载的想法非常有意义。 SharePoint 2010加载了很多JavaScripts - 这需要时间!所以我的想法是:首先加载HTML并让它由浏览器呈现,以便用户能够尽快读取所请求的信息。在第二步中加载行为(JavaScripts)。