jQueryのプラグイン作成方法をメモ。
jQueryはプラグインの作成用にjQuery.fnオブジェクトを用意している。プラグインの作成方法は2通りある[1]。
jQuery.fn.hoge = function () { // something... };
jQuery.fn.extend({ hoge:function () { // something... } });
jQuery.fnにメッソドを定義して簡単なプラグインを作成する。
<div id="outer"> <div id="inner">Hello World</div> </div>
div#outer { width: 400px; height: 200px; border: 10px solid #666; } div#inner { width: 100px; height: 100px; border: 5px solid #ccc; }
jQuery(function($) { jQuery.fn.setCenter = function() { // 自身のサイズ var width = $(this).width(); var height = $(this).height(); // 要素親のサイズ var parentWidth = $(this).parent().width(); var parentHeight = $(this).parent().height(); // Cssのposition var parentCssPos = $(this).parent().css('position'); if ((parentCssPos != 'absolute') && (parentCssPos != 'relative')) { $(this).parent().css({ position: 'relative' }); } // オフセット var offsetX = (parentWidth - width) / 2; var offsetY = (parentHeight - height) / 2; $(this).css({ position: 'absolute', top: offsetY, left: offsetX }); return $(this); }; $('#inner').setCenter().css('backgroundColor', 'yellow'); });
jQueryエレメントに独自の新しいメソッドを追加する。(典型的なjQueryプラグインの作成方法)
jQuery.extend()は引数の数に応じて異なる動作をする。
上記の例では2の目的でjQuery.extendを使っている。
参考サイト
»jQuery.extend() – jQuery API
»jQueryを読むために知っておきたい6つの知識 | tech.kayac.com – KAYAC engineers’ blog
» 【jQuery】プラグインでのオプション(オブ ジェクト形式)の初期設定方法を2通り
jQuery.extend()に、引数としてオブジェクトを1つ渡す場合はjQueryオブジェクト自体を拡張できる。
しかし通常プラグインを作成する場合はjQuery.fn.extend(object)かjQuery.fn = function () { }を使う(と思う)。
参考記事
»JavaScriptとかPerlとかPHP とかさくらとか勉強する
»jquery.jsを読み解く:第1回 jQueryライブラリ(1~171行目)
プラグイン名: jListBgColor
動作内容 :li要素に背景色を設定し、オプションの指定があればマウスオーバーで不透明度を変化させる。
»DEMO
jQuery(function ($) { $.fn.extend({ // $はJQueryオブジェクト。$.fn.extendはjQueryオブジェクトのプロタイプを拡張。 setListBgColor : function(options) { // 初期値を設定 var defaults = { backgroundColor : 'transparent', hover : false, opacity : '1' }; // オプションの初期値を設定 $.extend()はdefaultとoptionをマージして返す var setting = $.extend(defaults, options); // ulの処理 // thisはul要素。ul要素は複数の場合があるのでeachを利用している。 $(this).each(function() { var list = $(this).children('li'); $(list).each(function () { // liの処理 // thisはli $(this).css("backgroundColor", setting.backgroundColor); if (setting.hover) { $(this).hover( function () { $(this).css("opacity", setting.opacity); }, function () { $(this).css("opacity", "1"); } ); } }); }); // メソッドチェーン用 return this; } }); });
<html> <title>jQuery Pluginの作り方</title> <script type="text/javascript" src="jquery-1.4.2.min.js"></script> <script type="text/javascript" src="jListBgColor.js"></script> <script type="text/javascript"> jQuery(function ($) { // 引数値を渡す $("#idList").setListBgColor({backgroundColor: "#D0D2D3"}); $(".classList").setListBgColor({backgroundColor: "#9BACCA", hover : true, opacity: "0.75"}); // 複数のul要素が渡される可能性がある。 }); </script> </head> <body> <ul id="idList"> <li>リスト 項目1</li> <li>リスト 項目1</li> <li>リスト 項目1</li> </ul> <ul class="classList"> <li>リスト 項目1</li> <li>リスト 項目1</li> <li>リスト 項目1</li> </ul> <ul class="classList"> <li>リスト 項目1</li> <li>リスト 項目1</li> <li>リスト 項目1</li> </ul> </body> </html>
[1] 方法1と2の記述方法にどのような違いがあるのかは調査中。
No comments yet.
改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。