前回の記事で書いた通り、プラグインを作成して配布する場合は競合対策をする必要があります。 今回は例として、jQueryを用いたkintoneプラグイン開発での競合対策を紹介します。
jQuery.noConflict()
jQueryには、「$」変数の競合対策として、jQuery.noConflict()というメソッドが用意されています。 jQueryファイルを読み込むと、グローバルスコープに「jQuery」と「$」という変数が定義されます。 jQuery.noConflict()を呼び出すと、「$」をjQueryファイルが読み込まれる前の状態に戻します。
競合対策の例
jQueryとjQueryプラグイン(iziModal)を利用した下記のようなkintoneプラグインを作成したとします。
-
manifest.json
{…“desktop”:{“js”:[“https://js.cybozu.com/jquery/2.1.3/jquery.min.js",“https://cdnjs.cloudflare.com/ajax/libs/izimodal/1.5.1/js/iziModal.min.js”,"js/desktop.js”],…},…}
-
desktop.js
$(function(){$(“h2”).iziModal();$(‘body’).click(function(){$(‘h2’).iziModal(‘open’);});});
もちろん単体では問題なく動作します。
このプラグインを、ユーザーが次のようなprototype.jsを利用したプラグインと併用したとします。
-
manifest.json
{…“desktop”:{“js”:[“https://cdnjs.cloudflare.com/ajax/libs/prototype/1.7.3/prototype.min.js","js/desktop.js”],…},…}
-
desktop.js
document.observe(‘dom:loaded’,function(){$(“searchbox-keyword-gaia”).hide();});
-
単体での動作。
この2つのプラグインが併用された場合、モーダルウィンドウが出なかったり、検索窓が消えなかったりします。
この競合の対策として、先ほどのjQuery.noConflict()を利用してみようと思います。
自作プラグインのdesktop.jsを次のように書き換えます。
jQuery.noConflict();//追加(function($){//追加$(function(){$("h2").iziModal();$('body').click(function(){$('h2').iziModal('open');});});})(jQuery);//追加
コードの先頭にjQuery.noConflictを記述して、グローバル変数の$をjQueryオブジェクトとしては利用しないようにします。 また元のコードを即時関数で囲み、スコープ内では$をjQueryオブジェクトとして扱えるようにしています。
結果として、2つのプラグインの機能が両立するようになりました。
今回はプラグインを作成する上で最低限想定し対策すべき事態について紹介しました。 挙動を理解して、自分のプラグインに必要な競合対策を考えることが重要かと思います。