2007-12-10

jQuery 1.2.1 で script 要素を append すると意図しないパラメータが勝手に付いてしまう

次のコードは YouTube Data API (JSONP) を使って、動画をキーワード検索するものですが、jQuery 1.2.1 と 1.1.2 でその実行した結果がぜんぜん違うのです。かなり焦りました。
jQuery(function($) {
var script = $(document.createElement('script'))
.attr('type', 'text/javascript')
.attr('charset', 'UTF-8')
.attr('src', 'http://gdata.youtube.com/feeds/videos?' +
jQuery.param({
vq: 'jQuery',
alt: 'json-in-script',
callback: 'fn'
})
);
$('head', document).append(script);
});
jQuery 1.2.1 だと script 要素の src 属性が、次のような URL になります。なんか意図しないパラメータが勝手に付いています。
http://gdata.youtube.com/feeds/videos?
vq=jQuery&alt=json-in-script&callback=fn&_=1197287049812
このままの URL で YouTube Data API にリクエストすると、次のように 400 Bad Request となってしまいます。
HTTP/1.x 400 Bad Request
Content-Type: text/plain; charset=UTF-8
Transfer-Encoding: chunked
Cache-Control: private
Date: Mon, 10 Dec 2007 11:44:12 GMT
Server: GFE/1.3

Invalid parameter: '_'.
jQuery 1.1.2 だと script 要素の src 属性が、次のような期待どおりの URL になります。
http://gdata.youtube.com/feeds/videos?
vq=jQuery&alt=json-in-script&callback=fn
jQuery 1.2.1 のソースコードを見ると、domManip メソッドの中で evalScript メソッドを呼び出して、スクリプトを評価するタイミングが追加になっていて、script 要素の src 属性が有効のとき、$.ajax メソッドを使って、script をロードしようと試みまています。
function evalScript(i, elem){
var script = jQuery.nodeName(elem, "script");
if ( script ) {
if ( elem.src )
jQuery.ajax({ url: elem.src, async: false, dataType: "script" });
else
その $.ajax メソッドの中でブラウザのキャッシュを無効にするため、src 属性の値に現在日時(ミリ秒)を値とする "_" というパラメータを付与しています。なんてこった!

そろそろ jQuery 1.2.1 に移行しようとしたときの出来事だったので、デバナを挫かれた感じがして、まだしばらく様子を見ようかなぁと、気持ちが戻ってしまいました。ビミョーに互換性が維持されてないのね。

ニコニコ動画+YouTube―動画共有サイトを楽しく活用する本ニコニコ動画+YouTube―動画共有サイトを楽しく活用する本
メディアバックアップ研究会

ニコニコ動画ファンブック 完全保存版!!!―超人気動画サイトの裏までわかる! (100%ムックシリーズ) エアーマンが倒せない 2ちゃんねる公式ガイド2006 同人音楽を聴こう! (三才ムック VOL. 167) コンティニューvol.36

by G-Tools

2 件のコメント:

nobu さんのコメント...

試してみてないのでなんともですが、

$.ajaxSetup({
'cache': true
});

とかしてやると、1.1系と同じ動きになると思われます。
その代わりに、IEだとキャッシュしまくってしまうんですが。

nakajiman さんのコメント...

YouTube Data API など、仕様外のパラメータを受け入れずにエラーとする API もあるんですよね。