今日の1日振り返ります。

ジャンルは不特定多数で、主にメモ書きですね。

はてなブログでjQueryがうまくいかない時、読み込みの順番が問題かも?

はじめに

 別のはてなブログにて、jQuery プラグインを導入しようとしたところ、盛大につまずいてしまいまして(約2週間くらい…)その問題と解決方法について記載します。具体的には、セレクタをいじったりしているjQueryプラグインは特に注意が必要です。導入にあたって、「教えて!Goo」で色々と質問させていただきました。たくさんの回答のおかげで、なんとかなりました。
スポンサーリンク


解決方法(jQuery プラグインの順番を入れ替える)

 初めに、解説方法です。一言で言ってしまうと。「読み込む、jQuery プラグインをページが読み込まれた後に読み込ませるようにする事」でした。これだけで、解決です。具体的には、

<script type="text/javascript" src="http://www.googledrive.com/host/[google drive ホスティングID]" async="async"></script>

のように、

async="async"

を入れる事。「async」について調べてみると、「非同期で読み込む。」との事、ページが読み込まれた後に「async」がついているスクリプトを読み込みますよってことです。似たものに「defer」ってのがあります。これは、ページが読み込まれた後にスクリプトを読み込むとのこと。同じように感じますが、全てを読み込み終えないとページが表示されない。つまり、ページ表示速度(正確には、最初に目に入る箇所の表示)が遅くなるようです。確かめてないので、わかりませんが。

解決方法はわかったが、何が問題だったのか?次に問題点について記述してます。

問題点

 そもそも、導入しようとしている jQuery プラグインは multifilter というプラグインです。以下リンクです。
Multifilter - Sort a table on Multiple inputs. A jQuery plugin from Tommy Palmer.
ライセンスはMITの模様。

 問題はなんだったのか?それは、「はてなブログ」が問題だったのです(問題って言い方は言い過ぎでした)。「はてなブログ」では、jQueryの読み込みをページの最後の方に行っていることが「はてなブログ」のソースコードをみると分かります。これは、表示スピードを上げるためのようです(SEO対策の一環?)。「はてなブログ」を使っている方々全てに以下の一文があるはずです。これが、原因だったのです。

<script type="text/javascript" src="http://blog.hatena.ne.jp/js?version=[英数字の羅列]"></script>

中身をみるとわかるのですが、実はこれ、jQuery v1.9.1 (2015/09/01現在では)。はてな側でjQuery.jsをホスティングしているのです。私自身読み込みの順番とか意識していなかったので、盛大につまずいていました。なぜなら、他の jQuery プラグインは問題なく動作するからです。

じゃなぜ、multifilter はうまくいかなくて、他のプラグインはうまくいったのか?その答えは、multifilter の中身をみると分かります。multifilter.js に以下の一文があると思います。

jQuery.expr[":"].Contains = function(a, i, m) { return (a.textContent || a.innerText || "").toUpperCase().indexOf(m[3].toUpperCase()) >= 0;};

これは、jQuery のセレクタを独自のものに書き換えているようです(java script をよく知らないので正確ではないかもしれませんが)。各スクリプトの読み込みについて図示してみました。
f:id:San3saN:20150902105008p:plain
他のjQuery プラグインは動いて、jQueryの中身を書き換えているプラグインは動かない理由がこれで、わかるかと思います。これを解決方法に記載した方法をとると、
f:id:San3saN:20150902105308p:plain
となって、動作してくれるのです。とはいっても、jQuery二重で読み込んでることになるんだな…。

以上です。


スポンサーリンク