我实现了一个非常简单的用例,但我不仅没有找到解决方案,而且找不到任何谈论它的文章,好像我是唯一一个。< / p>
我希望自定义Javascript在给定SharePoint网站的每个页面上执行。
很容易,你会说。好吧,不。远非如此,就像使用SharePoint一样。
重现的步骤:
- 创建一个开箱即用的发布网站
- 使用我在下面描述的任何方法
包括下面的自定义javascript- 转到该站点,转到主页。它是一个发布网站,因此默认情况下,您应该让左侧导航窗格至少包含&#34; 主页&#34;和&#34; 文件&#34;默认情况下。
- 首次加载页面时,javascript会执行。现在,点击&#34;文件&#34;。页面更改但Javascript 不已执行。
这是因为SharePoint使用 Ajax 。即使 MDS 被禁用。它通过URL中的哈希(#)使用Ajax。
例如,它会转换一个非常有用的链接,如下所示:
单击它时&LT; a href src =&#34; /SitePages/Home.aspx"&gt;
进入此URL:
https://your-url/sites/your-site/_layouts/15/start.aspx#/SitePages/Home.aspx
这是我的Javascript:
if (ExecuteOrDelayUntilScriptLoaded && _spBodyOnLoadFunctionNames) {
_spBodyOnLoadFunctionNames.push(ExecuteOrDelayUntilScriptLoaded(
function () {
alert("It's working!");
}, "sp.js"));
}
所以,我已经尝试了以下包含Javascript的方法:
&lt; head runat =&#34;服务器&#34;&gt;
...
&lt;! - SPM:&lt; SharePoint:ScriptLink语言=&#34; javascript&#34;命名=&#34; suitelinks.js&#34;按需=&#34;真&#34; RUNAT =&#34;服务器&#34;本地化=&#34;假&#34; /&GT; - &GT;
&lt;! - SPM:&lt; SharePoint:ScriptLink语言=&#34; javascript&#34;名称=&#34;〜sitecollection / SiteAssets / MYJAVASCRIPT.js&#34; RUNAT =&#34;服务器&#34; /&GT; - &GT;
但后来我读到了 AjaxDelta (这里:https://msdn.microsoft.com/fr-fr/library/office/dn456543.aspx),我将包含(仍然在标题中)移入&lt; AjaxDelta&gt;,像这样:
&lt; head runat =&#34;服务器&#34;&gt;
...
&lt;! - SPM:&lt; SharePoint:AjaxDelta id =&#34; DeltaPlaceHolderAdditionalPageHead&#34;容器=&#34;假&#34; RUNAT =&#34;服务器&#34;&GT; - &GT;
&lt;! - SPM:&lt; asp:ContentPlaceHolder id =&#34; PlaceHolderAdditionalPageHead&#34; RUNAT =&#34;服务器&#34; /&GT; - &GT;
&lt;! - SPM:&lt; SharePoint:DelegateControl runat =&#34; server&#34;控件ID =&#34; AdditionalPageHead&#34; AllowMultipleControls =&#34;真&#34; /&GT; - &GT;
&lt;! - SPM:&lt; SharePoint:ScriptLink语言=&#34; javascript&#34;名称=&#34;〜sitecollection / SiteAssets / MYJAVASCRIPT.js&#34; RUNAT =&#34;服务器&#34; /&GT; - &GT;
&LT; - SPM:&LT; /的SharePoint:AjaxDelta&GT; - &GT;
......然而没有任何作用。通过单击SharePoint&#34;托管&#34;在同一站点的页面之间切换时,Javascript永远不会执行。链接。
我正在寻找能够优雅地处理SharePoint的Ajax的解决方案,而不是劫持页面上每个超链接的重型和危险的东西。例如,我尝试将我的代码挂钩到 ajaxNavigate 方法(例如: addNavigate ),但我不确定我是否理解了什么?真的去那里,如果它对我有任何帮助。
编辑:
似乎已达成共识(例如,最底部为here)用户自定义操作无论如何都会被执行 - 因为SharePoint据称放置了他们的ScriptLink因某种原因进入AjaxDelta。嗯,那不是我目睹的。
通过使用&#34; RegisterModuleInit &#34;,可以解决此问题的另一个共识。这对我来说也不起作用。
我非常困惑。我认为当用户点击链接然后点击&#34; 返回&#34;时,这两个解决方案可以解决导航问题。但它并没有解决SharePoint的聪明和#34;,Ajax-riddled,超链接。
答案 0 :(得分:0)
我终于找到了一个迄今为止似乎永远不会失败的解决方案。这真是一种解脱。
简答:使用 asyncDeltaManager.add_endRequest
此MSDN讨论提出了一种实现它的简单方法: https://social.msdn.microsoft.com/Forums/office/en-US/1ae292b4-3589-46f6-bedc-7bd9dc741f1b/javascript-code-to-execute-after-all-the-elements-and-css-are-loaded?forum=appsforsharepoint
$(function () {
ExecuteOrDelayUntilScriptLoaded(function () {
if (typeof asyncDeltaManager != "undefined")
asyncDeltaManager.add_endRequest(MYCUSTOMCODE); //execute it after any ajax event
else
MYCUSTOMCODE(); //execute it at first load
}, "start.js");
});
这显示了如何在SharePoint的循环中正确包含它(使用ExecuteOrDelayUntilScriptLoaded) https://sharepoint.stackexchange.com/questions/171490/javacript-only-executed-on-first-page-load
完整的解决方案(objet“LefeCycleHelper”),由Mx提供 https://sharepoint.stackexchange.com/questions/192974/where-to-place-a-js-script-with-whom-i-need-to-get-an-div-id/193009#193009
//use an IIFE to create a scope and dont dirty the global scope
(function (_) {
// use strict to ensure we dont code stupid
'use strict';
var initHandlers = [];
var initMDSHandlers = [];
var ensureSharePoint = function (handler) {
var sodLoaded = typeof (_v_dictSod) !== 'undefined' && _v_dictSod['sp.js'] != null && _v_dictSod['sp.js'].state === Sods.loaded;
if (sodLoaded) {
handler();
} else {
SP.SOD.executeFunc('sp.js', 'SP.ClientContext', function () { });
SP.SOD.executeOrDelayUntilScriptLoaded(handler, 'sp.js');
}
};
var initMDS = function () {
for (var i = 0; i < initMDSHandlers.length; i++) {
initMDSHandlers[i]();
}
};
var init = function () {
// Register MDS handler
if ('undefined' != typeof g_MinimalDownload && g_MinimalDownload && (window.location.pathname.toLowerCase()).endsWith('/_layouts/15/start.aspx') && 'undefined' != typeof asyncDeltaManager) {
asyncDeltaManager.add_endRequest(initMDS);
} else {
for (var i = 0; i < initHandlers.length; i++) {
initHandlers[i]();
}
}
};
var registerInit = function (handler) {
initHandlers.push(handler);
};
var registerInitMDS = function (handler) {
initMDSHandlers.push(handler);
};
var domReady = (function (handler) {
var fns = [];
var listener;
var loaded = (document.documentElement.doScroll ? /^loaded|^c/ : /^loaded|^i|^c/).test(document.readyState);
if (!loaded) {
document.addEventListener('DOMContentLoaded', listener = function () {
document.removeEventListener('DOMContentLoaded', listener);
loaded = 1;
while (listener = fns.shift()) listener();
});
}
return function (fn) {
loaded ? setTimeout(fn, 0) : fns.push(fn);
};
})();
var attachToLoad = function (functionToAttach) {
registerInit(functionToAttach);
registerInitMDS(functionToAttach);
domReady(function () {
init();
});
};
_.AttachToLoad = attachToLoad;
// THIS WILL PROTECT YOUR GLOBAL VAR FROM THE GARBAGE COLLECTOR
window.LifeCycleHelper = _;
if (window.Function != 'undefined' && typeof (Function.registerNamespace) == 'function') {
Function.registerNamespace('LifeCycleHelper');
}
})({});
var theCodeYouWantToRun = function () {
alert('theCodeYouWantToRun');
};
window.LifeCycleHelper.AttachToLoad(theCodeYouWantToRun);