我尝试在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函数正在按预期工作。
有没有人知道,我使用的是正确的活动吗?
答案 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>
<强>结果
答案 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;
});
});