如何在sharepoint 2013博客(Office365)上使用SyntaxHighlighter?

时间:2014-12-08 15:50:10

标签: javascript events sharepoint-2013 syntax-highlighting office365

我尝试在sharepoint 2013博客网站(office365门户网站)上使用SyntaxHighlighter进行代码突出显示。

这是我在masterpage的头部放置的代码(之前加载了js和css ressources):

<script type="text/javascript">
    function sh(){
        SyntaxHighlighter.highlight();
    };

    // executed when SP load completes
    _spBodyOnLoadFunctionNames.push("sh");
</script>

_spBodyOnLoadFunctionNames应提供在加载页面事件之后运行函数的机制,但它似乎从未执行过。 从开发工具(控制台)运行我的sh函数正在按预期工作。

有没有人知道,我使用的是正确的活动吗?

2 个答案:

答案 0 :(得分:1)

_spBodyOnLoadFunctionNames中声明的

init.js数组(它是SharePoint JavaScript库的一部分)

根据init.js

AttachEvent("DOMContentLoaded", _spBodyOnLoadWrapper, document);
window.onload = _spBodyOnLoadWrapper;

其中

function _spBodyOnLoadWrapper() {
    ExecuteOrDelayUntilScriptLoaded(ProcessDefaultOnLoad, "core.js");
    //the remaining code is omitted for clarity..
}


function ProcessDefaultOnLoad() {
    ProcessOnLoadFunctionNames(_spBodyOnLoadFunctionNames);
    //the remaining code is omitted for clarity..
}
function ProcessOnLoadFunctionNames(onLoadFunctionNames) {
    if (onLoadFunctionNames != null) {
        for (var i = 0; i < onLoadFunctionNames.length; i++) {
            var expr = "if(typeof(" + onLoadFunctionNames[i] + ")=='function'){" + onLoadFunctionNames[i] + "();}";

            eval(expr);
        }
        onLoadFunctionNames = [];
    }
}

总而言之,指定的方法是在加载页面事件之后运行函数的正确机制。

事实上它对我很有用(见下图)

确保在init.js初始化之前加载_spBodyOnLoadFunctionNames库。

或者您可以尝试以下方法:

<script type="text/javascript">
    function sh(){
        SyntaxHighlighter.highlight();
    };

    ExecuteOrDelayUntilScriptLoaded(sh, "core.js");
</script>

<强>结果

enter image description here

答案 1 :(得分:1)

+ Vadim Gremyachev的答案对IE有效,但不适用于chrome,这是我使用的解决方法(从https://stackoverflow.com/a/2956980/381149启发):

function sh(){
    SyntaxHighlighter.highlight();
};

function setIntervalX(callback, delay, repetitions) {
    var x = 0;
    var intervalID = window.setInterval(function () {

       callback();

       if (++x === repetitions) {
           window.clearInterval(intervalID);
       }
    }, delay);
}

$(document).ready(function () {
    if( $('.syntaxhighlighter').length == 0 ){
        setIntervalX(function() { sh() }, 1000,5);
}

$("a").on("click",function () {
if( $('.syntaxhighlighter').length == 0 ){
    setIntervalX(function() {
      sh()
    }, 1000,5);
}
return true;
});

});