ラベル jQuery の投稿を表示しています。 すべての投稿を表示
ラベル jQuery の投稿を表示しています。 すべての投稿を表示

2014-02-12

[ js ]jQueryのonとtriggerを使って記述を分離

今さらだけど
jQueryのonとtriggerを使うと必要な処理をエレメントごとに記述できてコードがすっきりするらしい
と知ったのでメモ。

jQueryオブジェクト.on( イベント名, ファンクション )で、jQueryで取得したエレメントにイベント名の処理を追加して、
jQueryオブジェクト.trigger( イベント名 )はイベントを発火させるらしい。

参考サイト
.on() | jQuery API Documentation http://api.jquery.com/on/
.trigger() | jQuery API Documentation http://api.jquery.com/trigger/

イベント名には、clickとかmousemoveとか通常よくつかわれると思うイベント名の他、自作のイベント名も指定できるみたいで、その際はtriggerを使って発火させる。
当たり前だけど、イベント名がclickとかmousemoveの場合はtriggerを使わなくても発火される。


数字を入力してaddボタンを押すと、すぐ下にその個数分のテキストボックスのリストを追加する処理を、ボタンに対する処理とリスト追加の処理を分離した感じで書いてみた

  • 1
  • 2

上記のコード
●addボタンには(66行目から)、入力データ取得して数字確認。数字だったら背景黒の部分へ個数を通知(73行目)
●背景黒のulには(76行目から)、通知された数字の個数分テキストボックスのリストを追加

<style>
div#r, div#r * {
 margin: 0;
 padding: 0;
}
div#r {
 background: #ccc;
 width: 400px;
 color: #fff;
}
div#s {
 width: 400px;
 padding: 10px 0;
}
div#s input {
 margin: 0 5px;
}
div#s .n, div#s .add {
 -webkit-border-radius: 10px;
 -moz-border-radius: 10px;
 border-radius: 10px;
 font-size: 1.2em;
 padding: 0 10px;
}
div#t {
 width: 400px;
 background: #000;
 display: table-cell;
 vertical-align: middle;
 text-align: center;
}
div#t li {
 margin-top: 10px;
 list-style: none;
}
div#t li:last-child {
 margin-bottom: 10px;
}
div#t input {
 font-size: 150%;
 padding: 4px;
 -webkit-border-radius: 10px;
 -moz-border-radius: 10px;
 border-radius: 10px;
}
</style>

<div id="r">
<div id="s">
<input type="number" value="" name="n" class="n"><input type="button" name="add" class="add" value="add">
</div>
<div id="t">
 <ul>
  <li>1<input type="text"></li>
  <li>2<input type="text"></li>
 </ul>
</div>
</div>

<script>
$( function() {
 var $btn = $( 'div#s > input.add' );
 var $lst = $( 'div#t > ul' );
 var lst_n = $lst.children().length;

 $btn.on( 'click', function( e ){
  var n = $( this ).prev().val();
  if( n === '' || !!isNaN( n ) ){
   alert( '数字を入力してください' );
   return false;
  }

  $lst.trigger( 'listAdd', n );
 } );

 $lst.on( 'listAdd', function( e, n ) {
  for( ; n > 0; n-- ){
   $( this ).append( '<li>' + ( ++lst_n ) +  '<input type="text" /></li>' );
  }
 } );
} );
</script>

この程度だと分ける意味も無いと思うけど、ちょっとMVCっぽい?

2013-12-05

[ js ]css3のアニメーションでアイコン的動きにするjQueryプラグインを作ってみた

コピペで使えるCSS3アニメーション http://jsdo.it/gryng02/css3animation を拝見していて、「New!」が一つずつ大きくなるのが面白いけど、文字が多くなったらcss書くの大変だな。と思ったので指定された場所にcssを適用させるjqueryプラグインを書いてみた。

ま、活用できるかは置いておくとして…。

New!
Conguratulations!
Update!
Topics!

ソース

css(外部ファイルとかでicon_tip.css)

/*

 文字一つ一つにかかるスタイル指定。
  似たような感じでバリエーションを増やしてクラス名を引数で渡す

*/
.icnBgGreen {
	background-color: rgba( 0, 250, 0, 1 );
	color: rgba( 255, 255, 255, 1 );
	font-weight: bold;
	font-size: 110%;
	padding: 4px;
}
.icnBgRed {
	background-color: rgba( 250, 0, 0, 1 );
	color: rgba( 255, 255, 255, 1 );
	font-weight: bold;
	font-size: 110%;
	padding: 4px;
}




/*

 アニメーションさせたりするのスタイル指定。
  数字を変更するくらいで基本は変更しなくてよいはず

*/
span#iconTip {
	display: inline;
}
span#iconTip span.icnLetter {
	display: inline-block;
	-webkit-transform-origin: middle center;
	-moz-transform-origin: middle center;
	-ms-transform-origin: middle center;
	-o-transform-origin: middle center;
	transform-origin: middle center;
	-webkit-transform: scale( 1 );
	-moz-transform: scale( 1 );
	-ms-transform: scale( 1 );
	-o-transform: scale( 1 );
	transform: scale( 1 );
	-webkit-animation: 1.3s ease-in-out icnLetterX infinite;
	-moz-animation: 1.3s ease-in-out icnLetterX infinite;
	-o-animation: 1.3s ease-in-out icnLetterX infinite;
	animation: 1.3s ease-in-out icnLetterX infinite;
}
@-webkit-keyframes icnLetterX {
	0% {
		-webkit-transform: scale( 1 );
	}
	70% {
		-webkit-transform: scale( 1 );
	}
	85% {
		-webkit-transform: scale( 1.5 );
	}
	100% {
		-webkit-transform: scale( 1 );
	}
}
@-moz-keyframes icnLetterX {
	0% {
		-moz-transform: scale( 1 );
	}
	70% {
		-moz-transform: scale( 1 );
	}
	85% {
		-moz-transform: scale( 1.5 );
	}
	100% {
		-moz-transform: scale( 1 );
	}
}
@-o-keyframes icnLetterX {
	0% {
		-o-transform: scale( 1 );
	}
	70% {
		-o-transform: scale( 1 );
	}
	85% {
		-o-transform: scale( 1.5 );
	}
	100% {
		-o-transform: scale( 1 );
	}
}
@keyframes icnLetterX {
	0% {
		transform: scale( 1 );
	}
	70% {
		transform: scale( 1 );
	}
	85% {
		transform: scale( 1.5 );
	}
	100% {
		transform: scale( 1 );
	}
}

JavaScript(外部ファイルとかでjquery.icon_tip.js)

;

( function( $ ) {

    $.fn.iconTip = function( config ) {
        var defaults = {
            elem: 'span'
            , iconTipId: 'iconTip'
            , class: 'icnBgGreen'
            , letterClass: 'icnLetter'
        };

        var options = $.extend( defaults, config );

        return this.each( function() {
            var $one = $( this )
            , one_txt = $one.text()
            , $icon_tip = $( document.createElement( options.elem ) ).attr( 'id', options.iconTipId );

            $.each( one_txt.split(''), function( i, s ) {
                var delay = 0 + ( i / 10 ) + 's';
                var cssprop = {
                    'webkitAnimationDelay': delay
                    , 'mozAnimationDelay': delay
                    , 'oAnimationDelay': delay
                    , 'animationDelay': delay
                };
                $icon_tip.append( $( document.createElement( options.elem ) ).text( s ).addClass( options.class ).addClass( options.letterClass ).addClass( options.letterClass + ( i + 1 ) ).css( cssprop ) );
            } );

            $one.contents().remove();
            $one.append( $icon_tip );
        } );
    };

} )( jQuery );

HTMLと実行部分

New!
Conguratulations!
Update!
Topics!
<script> $( '#new' ).iconTip(); $( '#cong' ).iconTip( {class:'icnBgRed'} ); $( '#upd' ).iconTip(); $( '#topics' ).iconTip( {class:'icnBgRed'} ); </script>

classをキー、クラス名を値にした連想配列を引数で渡すと一文字ずつspanのclassにくっつきます。デフォルトは、上記cssの

.icnBgGreen {
	background-color: rgba( 0, 250, 0, 1 );
	color: rgba( 255, 255, 255, 1 );
	font-weight: bold;
	font-size: 110%;
	padding: 4px;
}
2種類、3種類バリエーションを増やしたい時は似たようなスタイルシートのクラスを作って引数で渡す。

あとは、適宜数字をいじれば…。

2013-07-05

[ jQuery ]Deferredオブジェクトで処理をチェーン化

非常に今さらだけど
jQueryのDeferredオブジェクトで処理をチェーン化すると
animateとかのcompleteのソースが見やすくなると知ったのでメモ。

jQuery Deferred Object

ajaxでも使えるのとか試してあるけどBloggerじゃサンプルのjsonファイルおけないので割愛…
そのうちどっかのAPIから拾えるjsonで作ってみようかなと…

index