解决SyntaxHighlighter换行问题

因为用的百度编辑器自带的缘故,代码高亮插件选用了SyntaxHighlighter。

但是这货有个蛋疼的问题就是长一些的代码不能自己换行,会出滚动条。

于是网上找了个“解决方法”:把默认的不换行样式去掉,或覆盖成默认:

.syntaxhighlighter .line {
  /*white-space: pre !important; 注释掉,或者外部覆盖掉 */
}

烦人的横向滚动条没有了,但是,看起来还是怪怪的。就像这样,这是从贼寇同学站上截的图,求不打

竟然和行号没对齐!

显然还需要额外再用JS处理一下。正巧,百度编辑器里已经有了解决代码,不要问我为啥不全用jQuery来操作DOM

$('.syntaxhighlighter').each(function(index,me){
    var tds = me.getElementsByTagName('td');
    for(var i=0,li,ri;li=tds[0].childNodes[i];i++){
        ri = tds[1].firstChild.childNodes[i];
        ri.style.height = li.style.height = ri.offsetHeight + 'px';
    }
});

需要特别注意的是,需要在SyntaxHighlighter渲染过后执行这段代码。于是,我们需要给渲染方法加一个回调参数。在shCore.js中找到all方法,添加一个callback的参数:

all: function(params, callback)
{
    attachEvent(
       window,
       'load',
       function() { sh.highlight(params); callback(); }
    );
}

网上也有不改插件源码的方法,就用setTimeout去监听是否完成全部渲染,也是可以的。不再赘述。

页面调用的时候这样就好:

jQuery(function(){
	if(!window.SyntaxHighlighter) return;
	var comepete = function(){
		$('.syntaxhighlighter').each(function(index,me){
			var tds = me.getElementsByTagName('td');
			for(var i=0,li,ri;li=tds[0].childNodes[i];i++){
				ri = tds[1].firstChild.childNodes[i];
				ri.style.height = li.style.height = ri.offsetHeight + 'px';
			}
		});
	}
	SyntaxHighlighter.all({},comepete);
});

然后大家看到的代码高亮就正常了。