添加指向sharepoint suite bar的链接 - 首次加载时失败

时间:2017-11-01 18:04:46

标签: javascript sharepoint sharepoint-2016

我正在尝试使用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);

这解决了这个问题,但我不喜欢每次页面运行时都使用超时的想法。

关于如何延迟代码执行直到套件栏准备好的任何想法?

2 个答案:

答案 0 :(得分:0)

根据马特的评论,这有效:

“尝试将链接添加到函数中并使用SP.SOD.executeFunc('sp.js','SP.ClientContext',yourFunctionToInsertHere);我相信它是你之前没有加载的sp.js试图添加它。这应该会延迟你的添加,直到它被加载。“

谢谢!

答案 1 :(得分:0)

我认为这是使用自定义操作完成的,但无法确定。

测试它的一种方法是将文件放入.js文件中,然后使用John Liu构建的优秀脚本将其添加为自定义操作。

http://johnliu.net/blog/2015/12/the-safest-future-proof-way-to-brand-your-sharepoint-and-sharepoint-online

另一种方法是使用PnP PowerShell cmdlet;

Add-PnPJavaScriptBlock -Name SuiteBar -Script '<your code here>' -Sequence 9999 -Scope Site