我正在尝试使用JavaScript将自定义链接添加到SharePoint中的套件栏(SharePoint 2016内部部署)。除了第一次加载SharePoint站点之外,代码工作正常。这是:
<script>
var raiseFunc = function() {
var link = document.createElement('a');
var linktext = document.createTextNode("Google");
link.href = "http://www.google.ca"
link.setAttribute("class", "o365button o365cs-nav-appTitle o365cs-topnavText");
var span = document.createElement('span');
span.appendChild(linktext);
span.setAttribute("class", "o365cs-nav-brandingText");
link.appendChild(span);
var temp = document.getElementById("Sites_BrandBar");
temp.parentElement.appendChild(link);
};
_spBodyOnLoadFunctions.push(raiseFunc);
</script>
当我刷新页面或浏览时,一切正常。当我从新窗口或选项卡打开页面时,它不起作用。 (我禁用了MDS功能。)当代码第一次运行时,似乎套件栏不可用,即使我使用_spbodyOnLoadFunctions技术延迟我的代码。
有什么想法吗?
更新:根据Matt在评论中的建议,我输入了try / catch来获取任何错误。没有报告错误,但我注意到行为发生了变化。我连续做了大约20次测试,有时新的链接被添加好了,有时它不是,有时它会被添加一秒然后消失。
我还尝试在此行之前的代码中添加警告:
var temp = document.getElementById("Sites_BrandBar");
延迟是执行使它工作如此清楚它是一个计时的事情。我假设有时套件栏在代码运行时没有准备好。我添加了超时作为测试:
setTimeout(function(){
var temp = document.getElementById("Sites_BrandBar");
temp.parentElement.appendChild(link);
}, 500);
这解决了这个问题,但我不喜欢每次页面运行时都使用超时的想法。
关于如何延迟代码执行直到套件栏准备好的任何想法?
答案 0 :(得分:0)
根据马特的评论,这有效:
“尝试将链接添加到函数中并使用SP.SOD.executeFunc('sp.js','SP.ClientContext',yourFunctionToInsertHere);我相信它是你之前没有加载的sp.js试图添加它。这应该会延迟你的添加,直到它被加载。“
谢谢!
答案 1 :(得分:0)
我认为这是使用自定义操作完成的,但无法确定。
测试它的一种方法是将文件放入.js文件中,然后使用John Liu构建的优秀脚本将其添加为自定义操作。
另一种方法是使用PnP PowerShell cmdlet;
Add-PnPJavaScriptBlock -Name SuiteBar -Script '<your code here>' -Sequence 9999 -Scope Site