読者です 読者をやめる 読者になる 読者になる

jQueryと古いEffects.jsのArray.prototype.callがバッティングする問題を修正した

昔、jQueryを利用したブックマークレットを作ってて、

[Exception... "Component returned failure code: 0x80004005
(NS_ERROR_FAILURE) [nsIDOMViewCSS.getComputedStyle]" nsresult:
"0x80004005 (NS_ERROR_FAILURE)" location: "JS frame ::
jqueryのファイル名 ::
anonymous :: line 22" data: no]

みたいなエラーが出てハマったときがあったんですけど、
その時は確かここのページにたどりついて、

The issue wasn't so much a problem with jQuery as it was with Scriptaculous overwriting the call() method with custom functionality solely in effects.js. The script the implement is seen here:

Array.prototype.call = function() {
var args = arguments;
this.each(function(f){ f.apply(this, args) });
}

「あぁ、Effects.jsのせいなのかぁ。jQueryの方をいじるのも嫌だし、みんながファイルアップデートするのを待つかぁ」なんてこと思ってたんです。


でも、基本的にWebページのJavaScriptのライブラリなんてそうそうアップデートするものでもないんですよね。
# 何より自分のところのサービスページでさえ使えないのですから。


今日もまたCNETのページでブックマークレットが使えなくて、「あぁ、やっぱりそろそろどうにかしないと他のユーザからも問い合わせがきそうだし悪いなぁ」って思いググってみると、
とか、
なぜか$(/*何がし*/)でindex:0に全件分のa要素が入ったjQueryオブジェクトが返ってくる件調査(jQuery AOPを使ってみた。) - 文殊堂とか、
のようにやっぱりjQuery側をいじる解決法しか出てこず、結局僕もそれにならいました。


「どうせ、Array.prototype.callなんてみんな使ってないんだろう」とか思ってjQuery呼ぶ前に「delete Array.prototype.call」を実行して消してみたりしたんだけど、
さすがにそれを他のユーザの方々に使わせたらまずいよねって思い却下。


とりあえずは問題解決。これでみんなが喜んでくれればそれでいいのだけど。