貼り付け用のJavaScriptコードを書いていて初めて知ったんですが、JavaScriptって引数を渡してロードすることが出来ないんですね。例えばこんな感じの書き方で。

<script type="text/javascript" src="http://www.example.com/js/hoge.js?type=recent&num=50">


確かに。今まで意識してませんでしたが、普通何か要素を渡すときには別途要素を用意して渡しますね。書いたことあるコードで言うとこんな感じとか。

<div id="type" rel="recent" />
<div id="num" rel="50" />
<script type="text/javascript" src="http://www.example.com/js/hoge.js"></script>

こんな感じとか。

<script type="text/javascript">
var type = "recent";
var num = 50;
</script>
<script type="text/javascript" src="http://www.example.com/js/hoge.js"></script>

でもこれだと、実装時に書くコードが長くなっちゃってちょっと面倒。仕様上無理なのか…と思いましたが、でも無理矢理やれば、引数っぽく値を渡すことが出来るみたいです。
このエントリのタイトルも含めて参考にしたのはこちら。

前回のエントリで触れたscript要素のsrc属性に指定したJavaScriptファイルに引数を渡す方法。ネタ元はscript.aculo.usで、script.aculo.usでは読み込むライブラリを指定するために使っている模様。引数が指定できるというのは夢が拡がる(った)。
 


ここで言われているのは、getElementsByTagNameを使ってscript要素を抽出してsrc要素を解析すれば、そのプログラムのURL+与えられた引数が得られるから、そこからURLを削除すれば取り出せるんじゃね?ということ。そしてそれをさらに発展させると、一番最初に書いたような書式でも引数として獲得できる、と。

実際書いたコードは簡単に書くとこんな感じ。

var configs = new Object;
var scripts = document.getElementsByTagName("script");
for (var i = 0; i < scripts.length; i++) {
  var s = scripts[i];
  if (s.src && s.src.match(/hoge\.js(\?.*)?/)) {
    var params = s.src.replace(/.+\?/, '');
    break;
  }
}
params = params.split("&");
for(var i = 0; i < params.length; i++) {
  var tmp = params[i].split("=");
  configs[tmp[0]] = unescape(tmp[1]);
}

上のhail2uさんとTumblr Tag Cloudsで使われていたタグのあいのこみたいな感じで、マッチする要素からsrcを取り出したあと「?」以降の文字列を抽出して、それを「=」で分割するって感じ。

大体これで目的は果たせると思います。



ちなみにコレだと同じファイルを引数を変えて何度も呼び出したい場合には、最初の1回しかきちんと表示されない。もうちょっと汎用性を持たせてきちんと作り込んだ形としてはこんなものもあるみたいだけど…

外部Javascriptのsrc属性で、URL引数を取得する | CSS-EBLOG

多分同じかなー

あくまで引数っぽいだけであって引数ではないからね。その値と読み込まれた関数との間には何の関係もないから仕方がないかな。引数だけを変えた同じスクリプトを何度も読み込ませるってのはあんまりしない考えなのかしら。まぁふつうに考えれば、スクリプトは1回だけ読み込ませて、設定を持たせた要素を表示させる分だけ配置するってのが正しいんだろうな。きっと。楽だし。