javascript自体良く分かっていないので調べながらです…。
- まず最初のpath関数は@をアドレスに置換して配列にしてSyntaxHighlighter.autoloaderメソッドに渡す。
- SyntaxHighlighter.autoloaderメソッド中にpreタグ内を取得して、そこからbrush名を抽出。
- brush名から配列のアドレスを引き出す。
- アドレスを元にHTMLScriptElementオブジェクトを作成、読み込み完了時に動作するように、onloadに関数を設定。
- bodyにappendChildメソッドで追加。
書き換えただけでは、読み込んでくれないのでは?と思いましたが、大丈夫のようです。
試しに実験してみました。
まず外部スクリプトとして、以下のファイルを作成。
function test()
{
alert("test");
}
そして、表示しているページで以下のスクリプトを実行。
<script type="text/javascript">
var script = document.createElement('script');
script.src = 'js1.js';
script.type = 'text/javascript';
script.language = 'javascript';
script.onload = function()
{
test();
};
document.body.appendChild(script);
</script>
ちゃんと外部ファイルのtest()が呼ばれて、"test"とアラートが出ました。ただし元のshAutoloader.jsのソースでは、script.onloadが以下の様になっています。
script.onload = script.onreadystatechange = function()
{
if (!done && (!this.readyState || this.readyState == 'loaded' || this.readyState == 'complete'))
{
//省略
// Handle memory leak in IE
script.onload = script.onreadystatechange = null;
script.parentNode.removeChild(script);
}
};
調べてみると、script.onloadはIEの場合反応しないとか。その場合、onreadystatechangeを使ってスクリプト読み込み完了時の処理をして、更にIEにはメモリリークのバグがあるので、上記のような処理を行なっているということらしいです(javascript自体を調べながらというレベルなので詳細は分かりませんが…)。
IE9で実験してみると、onloadだけでも動作したのでIEのバージョンでも違うんでしょうね。