将 link 添加到 Sharepoint 套件栏 - 首次加载失败
Add link to sharepoint suite bar - fail on first load
我正在尝试使用 JavaScript 将自定义 link 添加到 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>
当我刷新页面或浏览时,一切正常。当我从新的 window 或选项卡打开页面时,它就不起作用了。 (我禁用了 MDS 功能。)当代码第一次运行时,套件栏似乎不可用,即使我正在使用 _spbodyOnLoadFunctions 技术延迟我的代码。
有什么想法吗?
更新:根据 Matt 在评论中的建议,我输入 try/catch 以获取任何错误。没有错误报告,但我确实注意到行为发生了变化。我连续做了大约 20 次测试,有时新的 link 可以正常添加,有时不能,有时添加一秒钟然后就消失了。
我还尝试在代码中的这一行之前添加一个警告:
var temp = document.getElementById("Sites_BrandBar");
延迟是执行使它工作得如此清楚,这是一个时间问题。我假设有时代码运行时套件栏还没有准备好。我添加了一个超时作为测试:
setTimeout(function(){
var temp = document.getElementById("Sites_BrandBar");
temp.parentElement.appendChild(link);
}, 500);
这解决了问题,但我不喜欢每次页面运行时都使用超时的想法。
关于如何延迟代码执行直到套件栏准备好有什么想法吗?
根据 Matt 的评论,这有效:
"Try to make your add link into a function and use SP.SOD.executeFunc('sp.js','SP.ClientContext', yourFunctionToInsertHere); I believe it's the sp.js that is not loading before you are trying to add it. This should delay your add until it's loaded."
谢谢!
我认为这是使用自定义操作完成的,但不能确定。
测试它的一种方法是将文件放入 .js 文件,然后使用 John Liu 构建的优秀脚本将其添加为自定义操作。
另一种方法可能是使用 PnP PowerShell cmdlet;
Add-PnPJavaScriptBlock -Name SuiteBar -Script '<your code here>' -Sequence 9999 -Scope Site
我正在尝试使用 JavaScript 将自定义 link 添加到 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>
当我刷新页面或浏览时,一切正常。当我从新的 window 或选项卡打开页面时,它就不起作用了。 (我禁用了 MDS 功能。)当代码第一次运行时,套件栏似乎不可用,即使我正在使用 _spbodyOnLoadFunctions 技术延迟我的代码。
有什么想法吗?
更新:根据 Matt 在评论中的建议,我输入 try/catch 以获取任何错误。没有错误报告,但我确实注意到行为发生了变化。我连续做了大约 20 次测试,有时新的 link 可以正常添加,有时不能,有时添加一秒钟然后就消失了。
我还尝试在代码中的这一行之前添加一个警告:
var temp = document.getElementById("Sites_BrandBar");
延迟是执行使它工作得如此清楚,这是一个时间问题。我假设有时代码运行时套件栏还没有准备好。我添加了一个超时作为测试:
setTimeout(function(){
var temp = document.getElementById("Sites_BrandBar");
temp.parentElement.appendChild(link);
}, 500);
这解决了问题,但我不喜欢每次页面运行时都使用超时的想法。
关于如何延迟代码执行直到套件栏准备好有什么想法吗?
根据 Matt 的评论,这有效:
"Try to make your add link into a function and use SP.SOD.executeFunc('sp.js','SP.ClientContext', yourFunctionToInsertHere); I believe it's the sp.js that is not loading before you are trying to add it. This should delay your add until it's loaded."
谢谢!
我认为这是使用自定义操作完成的,但不能确定。
测试它的一种方法是将文件放入 .js 文件,然后使用 John Liu 构建的优秀脚本将其添加为自定义操作。
另一种方法可能是使用 PnP PowerShell cmdlet;
Add-PnPJavaScriptBlock -Name SuiteBar -Script '<your code here>' -Sequence 9999 -Scope Site