2013年2月24日日曜日

WordPressでjQueryの$が使えないって話を聞いて思ったこと

理由は解らないけど$って書くとエラーが出て、jQueryって書き直したら大丈夫だった
って話を小耳に挟みました。

これの意味するところは

window.jQueryは使えたけど、window.$は使えなかった
だってことを理解しないと、$が使えなかった理由も、jQueryと書き直して解決できた理由も謎のままなんだろうなと思いました。

そしてその謎が解ければ、$をjQueryに書き直す必要がなかったことも解るでしょう。

$が使えなかった理由

WordPressではjQuery.noConflict()が呼ばれているからです。

試しに次のようなHTMLを作って確認してみましょう。

<!DOCTYPE html>
<html>
<meta charset="utf-8">
<script>
window.$ = 'test';
</script>
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script>
//jQuery.noConflict();
console.log(window.jQuery);
console.log(window.$);
</script>
</html>

jQuery.noConflict()によって、window.$が元の値(上の例では文字列'test')に戻ることが確認できると思います。
別のライブラリでなどでwindow.$を使っていて、jQueryによってwindow.$が別物に変わってしまうのを防ぐため、といった使い方が考えられるでしょう。

WordPressで$を使う方法

次のようなテキストウィジェットで、WordPressのJSでも$を使えることが確認できます。

<script>
console.log(window.jQuery);
console.log(window.$);
(function($) {
  // ここで$が使える
  console.log($.fn.jquery);
  console.log($('body'));
})(window.jQuery);
</script>

ポイントは、$を変数名として使うことも、それにwindow.jQueryを代入することも可能だという、すごく当たり前のことです。
使えなくなったのはwindow.$だけなのです。

そしてこのようにwindow.$を使わずに書いておくことで、jQuery.noConflict()の影響を受けないコードになっています。

jQuery.noConflict()を追ってみる

最後に、jQueryコアのソースから、noConflictに関係する箇所を抜粋しておきます。
変数_$に元のwindow.$を保持しておき、jQuery.noConflict()中で、window.$に_$を代入しているのが確認できます。

...
  // Map over jQuery in case of overwrite
  _jQuery = window.jQuery,

  // Map over the $ in case of overwrite
  _$ = window.$,
...
  noConflict: function( deep ) {
    if ( window.$ === jQuery ) {
      window.$ = _$;
    }

    if ( deep && window.jQuery === jQuery ) {
      window.jQuery = _jQuery;
    }

    return jQuery;
  },
...

興味深いのは、deepの指定です。
deep指定がなければwindow.$を元に戻すだけですが、deepをtrue指定すると、window.jQueryまで元に戻します。

先ほど、想定されるjQuery.noConflict()の利用局面は別のライブラリなどでwindow.$を使っている場合と書きましたが、deep指定が必要なのは、その別のライブラリがjQueryの別バージョンで、上書きされる前のwindow.jQueryにアクセスする必要がある場合です。

何年も前に書かれてメンテナンスが滞りがちなjQueryプラグインやウィジェットを使おうとすると、複数バージョンのjQueryを共存させる必要があるかもしれないですね。
紹介できそうな具体例を思いついたら、また書いてみたいと思います。

2012年10月12日金曜日

BootstrapのGoogle Maps JavaScript APIへの影響と対策

Bootstrapを使っているページ内ではGoogle Maps JavaScript APIで生成した地図の表示が乱れることがある件について、jsdo.itに投稿しました。

地図領域のIDが'map_canvas'でなければ、地図の表示が乱れるので、たとえばIDが'map'の場合、以下のCSSを書く必要があります。

#map img {
  max-width: none;
}

#map_canvasの場合のみ正常に表示されるのは、BootstrapのCSSが#map_canvasを特別扱いしているためなのですが、これは正直微妙ですよね。

確かに#map_canvasに固定しておけば、何も気づかずに救われる場合もいるでしょうが、別のIDを使っている場合に対して無意味すぎると思います。

こっちの方がBootstrapらしいかなと思うのですが、どうでしょうか。

.map-canvas img {
  max-width: none;
}

#map_canvas対応は後から追加されたものですが、githubでも、#map_canvas対応について、賛成しかねるとのコメントが付いています。
make bootstrap like google maps a bit more · fe30bd6 · twitter/bootstrap

「a bit more」だから、あまり気にしなくていいのでしょうか(笑)

2012年10月11日木曜日

Facebookの「宣伝する」リンクを非表示にする方法

Facebookで、自分の投稿を宣伝できるようになりました。

このように、「宣伝する」というリンクが現れます。

試しに「宣伝する」をクリックすると、こんな画面が出てきます。

これ、宣伝するつもりが全然ない人には邪魔ですよね。

Facebookヘルプセンターに書かれているように、投稿して6時間経つと「宣伝する」リンクは出なくなるのですが、投稿数が比較的多い人だと、目にする機会は多いと思います。

「宣伝する」リンクを非表示にする

Stylishというブラウザの拡張機能(アドオン)を使用します。
Chrome版Firefox版がありますので、どちらかのブラウザでインストールしてください。

次に、以下にアクセスして、拙作の「Hide boostActionLink」というユーザースタイルをインストールしてください。
Hide boostActionLink - Themes and Skins for Facebook - userstyles.org

「+ Install with Stylish」というボタンを押すとインストールされます。

以上で、「宣伝する」リンクが非表示になります。

また、拡張機能(アドオン)の管理で、インストールしたユーザースタイルの編集、有効化/無効化、削除が可能です。

この記事のリンクをシェアして、宣伝してみようかな(笑)

関連リンク