Ajaxで今よみがえる(^^;;-->[クロスブラウザ技術 ]DHTMLサンプル集
古籏一浩さんとのはじめての共著 発売中-->『Ajax実践テクニック』 古籏一浩/高橋 登史朗 (著)秀和システム
配本予約開始-->『入門Ajax 増補改訂版 』 高橋 登史朗 (著)ソフトバンククリエイティブ ; ISBN: 4797336242
【カテゴリー】 ActionScript ( 4 ) AjaSQL ( 9 ) Ajax ( 541 ) Arax ( 1 ) canvas ( 9 ) CSS ( 8 ) DLNA ( 1 ) Dojo ( 16 ) DOM ( 44 ) ES4 ( 3 ) 反重力物質 ( 1 ) ffAdd-on ( 1 ) Flash ( 45 ) Flash Remoting ( 11 ) FTP ( 2 ) GAF ( 9 ) Google Maps ( 106 ) GPS ( 38 ) HTTPヘッダサンプル ( 9 ) IPv6 ( 1 ) 漫画 ( 1 ) Java ( 44 ) JavaScript ( 232 ) jKamo ( 8 ) jQuery ( 66 ) jquery-ref ( 1 ) jsGadget ( 19 ) jslb_ ( 3 ) jslb_ajax ( 9 ) JSON ( 44 ) JSR223 ( 7 ) kjscmd ( 1 ) KNOPPIX ( 1 ) Linux ( 14 ) Mac ( 8 ) Memo ( 3 ) Microformats ( 2 ) Mini AJAX ( 2 ) MochiKit ( 2 ) mootools ( 2 ) Movable Type ( 57 ) MySQL ( 9 ) NewGameWeb ( 2 ) Nucleus ( 8 ) OpenAJAX ( 3 ) OpenDocument ( 1 ) OS ( 5 ) P2P ( 2 ) Perl ( 7 ) PHP ( 37 ) PostGIS ( 1 ) PostgreSQL ( 3 ) prototype.js ( 21 ) ROBOT ( 1 ) RSSリーダー ( 14 ) Ruby on Rails ( 7 ) Spry ( 6 ) SQLite ( 10 ) SQLiteWorker ( 2 ) ssh ( 1 ) SSI ( 2 ) SVG ( 15 ) TRON ( 1 ) Video ( 1 ) VML ( 1 ) Webサービス ( 89 ) widget ( 6 ) Wiki ( 1 ) Win ( 6 ) WSH ( 1 ) X01HT ( 29 ) XML ( 28 ) XOOPS ( 1 ) XQuery ( 2 ) XUL ( 3 ) Yahoo! UI ( 58 ) 日付入力用カレンダー ( 1 ) 『Ajax実践テクニック』 ( 1 ) 『入門 Ajax』 ( 42 ) WinTips ( 2 ) こりゃすごい ( 1 ) チューニング ( 20 ) ダイナミックロード関数 ( 7 ) リファレンス ( 13 ) ライブラリ ( 83 ) レーダー雨量表示 ( 1 ) ハード ( 15 ) ペンギン ( 2 ) ブラウザ ( 56 ) ブログでBBS ( 1 ) アクセスグラフ ( 3 ) カレンダーによる日付入力スクリプト ( 4 ) クロスブラウザ ( 10 ) クロスブラウザ関数 ( 7 ) スマートフォン ( 8 ) セキュリティ ( 87 ) ソフトイーサ ( 1 ) マッシュアップ ( 22 ) 暗号 ( 4 ) 映画 ( 41 ) 河川の水位グラフ ( 3 ) 回線 ( 2 ) 開発ツール ( 16 ) 牛久大仏 ( 8 ) 携帯 ( 112 ) 言語 ( 17 ) 故障 ( 1 ) 洪水警報システム ( 2 ) 今日のひと言 ( 2 ) 仕様 ( 39 ) 雑談 ( 199 ) 書籍 ( 17 ) 親子ウインドウ有無の確認関数 ( 3 ) 新海誠 ( 3 )

【info】有料サポート(ベータ)限定 承り中 /【JSサポート(仮称)】 

【費用】 とりあえず、言い値で承ります。ただし、できる範囲での限定受付です。込み具合等によりお受けできない場合がありますのであらかじめご了承ください。サポートにご納得いただけなければ料金は不要です。 逆に感動したら多くても構いません(^^;;;。

【できること】 たとえば、かも日記で無料配布されているコードのカスタマイズや、あるいは、JavaScript/Ajax全般+Webサーバーとの連携などのアドバイス&サンプル作成等 。A:jQchartなどでWeb用グラフ設置(エクセル→CSVやデータベースからWebグラフ生成)などのアドバイスやカスタマイズサンプル作成。B:ツリーメニューなどのカスタマイズサンプル。C:Google Mapsのカスタマイズ。etc...

【できないこと】 腕立て伏せ200回

【ライセンス】 私が今まで「かも日記」等で提供してきたコードの大半は、商用利用、改造、自由、連絡不要で、今後もそれらは変わりません。そして、この有料サポートによりカスタマイズコードなどが提供される場合でも、同様に、それらを商用利用しても改造しても自由です。ただし、制限のきついライブラリなどを使う場合は、各ライブラリのライセンスに準拠せざるを得ない場合があります。

【info】いつもいろいろなテストなどをページ内のあちこちでやっているので、重かったり、壊れていたりするf^^;ことも多いですが、何卒、ご了承ください ( _ _ b

【リファレンス このページ内へのリンク】
【jQuery】ドラッグドロップDemo
【jQuery】分岐の書き方をいくつかテスト
【jQuery】イベントfixについて
【jQuery】UI/Tabs/tabsClick(position)
【jQuery】:odd
【jQuery】:even
【jQuery】jQueryでも普通にDOMを扱いたい
【jQuery】jQuery UI/Accordion
【jQuery】Selectors
【jQuery】$(callback)
【jQuery】$(elements)
【jQuery】$(html)
【jQuery】$(expression[,context])

[ リファレンス ]

2007年11月08日

【jQuery】ドラッグドロップDemo

jQuery 】 , ライブラリ 】 , リファレンス ブックマークに追加する ブックマーク-- Buzzurl  / Hatena  / Livedoor track feed


jQuery UIのドラッグドロップです。

jQuery UIのページにもデモはあるのですが、ちょっと凝りすぎていてUIとしてどうなの^^?という気もしないでもないので、jQuery のドラッグドロップを一瞬で理解できるページをメモしておきます。

【デモ】

Draggables Test Page
http://dev.jquery.com/view/trunk/plugins/ui/tests/draggable.html

3d Dragging Test Page
http://dev.jquery.com/view/trunk/plugins/ui/tests/draggable_3d.html

Droppables Test Page
http://dev.jquery.com/view/trunk/plugins/ui/tests/droppable.html

【リファレンス】

UI/Draggables
http://docs.jquery.com/UI/Draggables

UI/Droppables
http://docs.jquery.com/UI/Droppables

投稿者 tato : 19:12

2007年11月03日

【jQuery】分岐の書き方をいくつかテスト

jQuery 】 , ライブラリ 】 , リファレンス ブックマークに追加する ブックマーク-- Buzzurl  / Hatena  / Livedoor track feed


昨日のエントリslideshareが凄くなってきている で書いた、show/hide ボタンですが、いろいろな書き方ができそうなので、少し習作。

とりあえず、昨日書いたコード。if分岐です。

ちなみに、$("+ div",this)の引数は、クリックされた#btn_1789T00ボタン「this」の次「+」のDIV要素という意味です。)
test
<script>
$(function(){
  $("#btn_1789T00").click(function(){
     if($("+ div",this).css("display")!="none"){
             $("+ div",this).hide(); $(this).text("show");
     }else{
            $("+ div",this).show(); $(this).text("hide");
     }
  })
})
</script>

<style>
#slideshow1789T00 div{display:none}
</style>
<div id="slideshow1789T00">
  <button id="btn_1789T00">show</button>
  <div>test</div>
</div>

試しに、3項演算子で分岐。

test
<script>
$(function(){
  $("#btn_1789T01").click(function(){

     ($("+ div",this).css("display")!="none")?
            $("+ div",this).hide():
            $("+ div",this).show();

     $(this).text($(this).text()=="show"?"hide":"show");

  })
})
</script>

<style>
#slideshow1789T01 div{display:none}
</style>
<div id="slideshow1789T01">
  <button id="btn_1789T01">show</button>
  <div>test</div>
</div>

.hide("スピード",コールバック)のsyntaxを使ってみる。エフェクトが掛かります。

test
<script>
$(function(){
  $("#btn_1789T02").click(function(){

     ($("+ div",this).css("display")!="none")?
       $("+ div",this).hide("fast",function(){
         $("#btn_1789T02").text("show")
       }):
       $("+ div",this).show("fast",function(){
         $("#btn_1789T02").text("hide")
       });
  })
})
</script>

<style>
#slideshow1789T02 div{display:none}
</style>
<div id="slideshow1789T02">
  <button id="btn_1789T02">show</button>
  <div>test</div>
</div>

もひとつ試しに、3項演算子に複文を書く実験。

test
<script>
$(function(){
  $("#btn_1789T03").click(function(){
     ($("+ div",this).css("display")!="none")?
       ($("+ div",this).hide(),$(this).text("show")):
       ($("+ div",this).show(),$(this).text("hide"));
  })
})
</script>

<style>
#slideshow1789T03 div{display:none}
</style>
<div id="slideshow1789T03">
  <button id="btn_1789T03">show</button>
  <div>test</div>
</div>

3項演算子に複文のテスト

上のサンプルの3項演算子書き方、(条件)?(式1,式2):(式3,式4); をなんとなく試しに書いてみたら動いたのでf^^;;検証してみます。 一応、var 変数1=値2,変数2=値2,...変数n=値n;のイメージで書いてみたんですけどどうかなぁ。
<script>
$(function(){

  var a,b,c;
  a=0,b=0,c=0;

  $("#btn_1789T04").click(function(){
     (a==0)?
       (b=1,c=1):
       (b=2,c=2);

     //a=0,b=1,c=1になってる?
     alert("a="+a+"\n"+"b="+b+"\n"+"c="+c+"\n")//なりました。
  });

})
</script>

<button id="btn_1789T04">chk</button>

トグルイベント、jQuery.toggle(関数1,関数2)を使ってみる。

test
<script>
$(function(){

  $("#btn_1789T05").toggle(
    function () {
      $("+ div",this).show();
      $(this).text("hide");
    },
    function () {
      $("+ div",this).hide();
      $(this).text("show");
    }
  );

})
</script>

<style>
#slideshow1789T05 div{display:none}
</style>
<div id="slideshow1789T05">
  <button id="btn_1789T05">show</button>
  <div>test</div>
</div>

#個人的にはトグルが使いやすそう?

投稿者 tato : 06:11

2007年11月01日

【jQuery】イベントfixについて

jQuery 】 , リファレンス ブックマークに追加する ブックマーク-- Buzzurl  / Hatena  / Livedoor track feed


JavaScriptのイベントはいまだにブラウザ間の非互換を大量に抱えた暗黒大陸です。addEventlistenerとattachEventが並立したままであるのは言わずもがな、eventで取得するwhichやbuttonなどのプロパティ群もNetscape4.xとIE4.xのブラウザ戦争時代の遺物をFirefoxとIEは引きずっています。

そこで、jQueryはどうしているのかと、試しに、handleメソッドを覗くと下記のようなfixメソッドでeventを作成しているのが見えます。引数のevent または、それが無ければwindow.event 、それもなければ空のオブジェクトを渡してプライベートなeventを作成しています。

つまり、handleメソッド内では、クロスブラウザなeventが使われることになります。
  handle: function(event) {
  // returned undefined or false
  var val;

  // Empty object is for triggered events with no data
  event = jQuery.event.fix( event || window.event || {} ); 
では、このfixメソッドは何をしているのでしょう?ざっくりいうとクローンeventを作成してeventのブラウザ間の非互換を吸収するいくつかのプロパティを作り返しています。
  fix: function(event) {
    // store a copy of the original event object 
    // and clone to set read-only properties
    var originalEvent = event;
    event = jQuery.extend({}, originalEvent);
    
    // add preventDefault and stopPropagation since 
    // they will not work on the clone

    //高橋注:イベントキャンセルをevent.preventDefault()に統一
    event.preventDefault = function() {
      // if preventDefault exists run it on the original event
      if (originalEvent.preventDefault)
        originalEvent.preventDefault();
      // otherwise set the returnValue property of the original event to false (IE)
      originalEvent.returnValue= false;
    };

    //高橋注:イベントバブルキャンセルをevent.stopPropagation()に統一
    event.stopPropagation = function() {
      // if stopPropagation exists run it on the original event
      if (originalEvent.stopPropagation)
        originalEvent.stopPropagation();
      // otherwise set the cancelBubble property of the original event to true (IE)
      originalEvent.cancelBubble = true;
    };

    //高橋注:イベント対象要素取得をevent.target に統一
    // Fix target property, if necessary
    if ( !event.target && event.srcElement )
      event.target = event.srcElement;       

    //高橋注:イベント対象要素取得でTEXTノード時のsafariフィックス 
    // check if target is a textnode (safari)
    if (jQuery.browser.safari && event.target.nodeType == 3)
      event.target = originalEvent.target.parentNode;

    //高橋注:イベント移動要素取得をrelatedTargetに統一
    // Add relatedTarget, if necessary
    if ( !event.relatedTarget && event.fromElement )
      event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;

    //高橋注:IEのDocType宣言により異なるDocument別にclientXへscrollLeft、
    // clientYへscrollTop を加えてevent.pageXevent.pageYを他のブラウザと統一
    // Calculate pageX/Y if missing and clientX/Y available
    if ( event.pageX == null && event.clientX != null ) {
      var e = document.documentElement, b = document.body;
      event.pageX = event.clientX + (e && e.scrollLeft || b.scrollLeft || 0);
      event.pageY = event.clientY + (e && e.scrollTop || b.scrollTop || 0);    }

    //高橋注:キーコード取得をevent.whichで統一
    // Add which for key events
    if ( !event.which && (event.charCode || event.keyCode) )
      event.which = event.charCode || event.keyCode;
    
    //高橋注:Mac以外のブラウザでもMacのevent.metaKey をevent.ctrlKey で動作させる
    // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
    if ( !event.metaKey && event.ctrlKey )
      event.metaKey = event.ctrlKey;

    //高橋注:マウスボタン押下番号IEのevent.button をevent.which と統一
    // Add which for click: 1 == left; 2 == middle; 3 == right
    // Note: button is not normalized, so don't use it
    if ( !event.which && event.button )
      event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
      
    return event;
  }

p.s. 再調査中 --寝る前にテストだけ

内部でクロスブラウザ化されたevent.whichがどのような場合に露出されるか?

テストソース

<script src="./jquery.js" type="text/javascript"></script>

<div id="div17831">1 インラインなレガシーeventをargument.whichで取得</div>
<div id="div17832">2 インラインなレガシーeventをargument.which経由jQueryで利用
</div>
<div id="div17833">3 jQueryイベント内のargumentsで渡されるevent.which</div>
<div id="div17834">4 jQueryイベント内でグローバルなevent.whichを取得</div>

入力してください<input type="input" id="input1783" onkeyup="k(event)">
<script>
function k(event){ 
    //test1
    document.getElementById('div17831').innerHTML='1:キーコードは、'+event.which +'です。'
    //test2
    $("#div17832").html( "2:キーコードは、"+event.which +"です。");
 }

$("#input1783").keyup(function(e){
    //test3
    $("#div17833").html("3:キーコードは、"+e.which +"です。");
    //test4
    $("#div17834").html("4:キーコードは、"+event.which +"です。");
})
</script>

テスト

1 インラインなレガシーeventをarguments.whichで取得
2 インラインなレガシーeventをarguments.which経由jQueryで利用
3 jQueryイベント内でargumentsで渡されるevent.which
4 jQueryイベント内でグローバルなevent.whichを取得

入力してください

結果





1 インラインなレガシーeventをarguments.whichで取得
2 インラインなレガシーeventをarguments.which経由jQueryで利用
3 jQueryイベント内のargumentsで渡されるevent.which ←これだけが全ブラウザででOK!
4 jQueryイベント内でグローバルなevent.whichを取得

たぶん結論

jQueryイベント内部でクロスブラウザ化された、jQueryの独自イベントは、
3のjQueryイベント内のargumentsで渡されるeventのwhichなど、
jQueryのイベントコールバック関数の引数としてのみ取得できますが、
グローバルなeventには影響しませんので、
他のライブラリなどと組み合わせても衝突などはありません。たぶん。

#(_ _b朝書いたサンプルは間違いでした(_ _b。 event.keyCode が書き代わっているわけではありません。ごめんなさい。


    Milly ( 2007年11月01日 18:26 )

    which に keyCode が格納されている場合があるだけで keyCode が変更されてるわけではないので、例が keyCode なのはよくないのでは。

    高橋 ( 2007年11月01日 19:20 )

    あ、本当だ、内部の話をしながら、途中からなぜか完全に勘違いしてました。Milly さんご指摘ありがとうございました。落ち込むなぁ、、、whichの条件式も頭の中で変になってたし。今日は朝からダメダメです。もう寝ようかな、、、。

    Milly ( 2007年11月01日 19:32 )

    なんだか落ち込ませてしまったみたいですが、いつも参考にさせていただいてます。これからも有用な記事を期待してます。:)

    高橋 ( 2007年11月01日 19:44 )

    ありがとうございます。中身は、少し不安になったので、再調査します。でも、今日はもう寝ます。ばた。

    高橋 ( 2007年11月01日 23:24 )

    寝ずにアバウトなテスト完了。ほぼスコープを推測(笑)できたような緩いような。。。最近、良いことが全然無くて、いまひとつ勢いが出ない状態です。今度こそ寝ます。


    【コメント】(←clickで入力欄open)
投稿者 tato : 08:01

2007年10月31日

【jQuery】UI/Tabs/tabsClick(position)

jQuery 】 , リファレンス ブックマークに追加する ブックマーク-- Buzzurl  / Hatena  / Livedoor track feed


UI/Tabs/tabsClick

tabsClick(position)

タブクリックをシミュレートするメソッド。 参照→【jQuery】jQuery UI/Tab (CSSの衝突とFirebugの大活躍) 参照本家→tabsClick

引数

positionNumber

クリックされるタブの位置(0ベースのindexです)。

Examples

$('#jqtabexample1782 ul').tabsClick(3);//3番目のタブへ移動

Example1 :

--タブ送りボタン

Basics(基本):
あいうえおあいうえお(略)
Hierarchy(階層):
かきくけこかきくけこ(略)
Basic Filters(基本フィルタ):
さしすせそさしすせそ(略)
<script src="./jquery-1.2.1.min.js" type="text/javascript"></script>
<script src="./ui.tabs/ui.tabs.js" type="text/javascript"></script>
<link rel="stylesheet" href="./jquery.ui-1.0/ui.tabs/ui.tabs.css" type="text/css">
<script type="text/javascript">
$(function() {

	$('#jqtabexample1782 ul').tabs({ fxFade: true, fxSpeed: 'fast' });

	$('#tabclick1782').click(function(){
		var sel=$('#jqtabexample1782 ul').tabsSelected() ;
		$('#jqtabexample1782 ul').tabsClick(sel>=3?1:++sel);
	});

});
</script>

<p><button id="tabclick1782">Next</button>--タブ送りボタン</p>

<div id="jqtabexample1782">
	<ul>
		<li><a href="#tab1"><span>基本</span></a></li>
		<li><a href="#tab2"><span>階層</span></a></li>
		<li><a href="#tab3"><span>基本フィルタ</span></a></li>
	</ul>

	<div id="tab1" class="ui-tab-block">

		<a href='#' class="ui-tab-link">
			Basics(基本):
		</a>
		<div class="ui-tab-body">
		(略)
		</div>
	</div>
	<div id="tab2" class="ui-tab-block">

		<a href='#' class="ui-tab-link">
			Basics(基本):
		</a>
		<div class="ui-tab-body">
		(略)
		</div>
	</div>
	<div id="tab3" class="ui-tab-block">

		<a href='#' class="ui-tab-link">
			Basics(基本):
		</a>
		<div class="ui-tab-body">
		(略)
		</div>
	</div>
</div>

p.s. 「sel>=3?1:++sel」は、3項演算子で、変数selが3以上なら1、それ以外ならselに1を足した値を返します。selは、現在のタブのindex番号なので、現在選択中のタブが1、2、3番目のタブまでなら、Nextタブのindexとして 2、3、4 を返し 4なら 1 に戻します。これで、クリックしづづけて最後のタブへ着くと最初のタブへ自動的に戻るようになります。

投稿者 tato : 21:58

【jQuery】:odd

jQuery 】 , jquery-ref 】 , リファレンス ブックマークに追加する ブックマーク-- Buzzurl  / Hatena  / Livedoor track feed


Selectors/ odd

:odd

$(expression[,context]) の引数で使用し、検索生成された要素配列のうち、0からはじめてindexが奇数の要素(s)。 参照→Selectors 参照→:even 参照本家→:odd

String

Examples

$("tbody tr:odd","#test1").css("background", "#ddd");//第二引数の #test1 は下記のように書いても可
$("#test1 tbody tr:odd").css("background", "orange");

Example1 : テーブルの奇数行を灰色(#dddddd)、偶数行をブルー(#d0e6ff)、ヘッダ行を灰色(#ccc)にします。(index 0 からはじめます。0は偶数扱いです) 

名前点数
山田80
田中50
中川60
川西55
西山18

  <script type="text/javascript">
  $(function(){
    $("#test17811 thead").css("background", "#ccc");
    $("#test17811 tbody tr:even").css("background", "#d0e6ff");
    $("#test17811 tbody tr:odd").css("background", "#dddddd");
  });
  </script>

  <style>
  #test17811 {
    border-collapse:collapse ;
    border-spacing:0px;
  }
  #test17811 thead td{ 
    border-right: 1px solid #888;
    border-bottom: 1px solid #888;
  }
  #test17811 td{ 
    border-right: 1px solid #bbb;
    border-bottom: 1px solid #bbb;
  }
  </style>

  <div id="test17811">
  <table>
    <thead>
    <tr><td>名前</td><td>点数</td></tr>
    </thead>
    <tbody>
    <tr><td>山田</td><td>80</td></tr>
    <tr><td>田中</td><td>50</td></tr>
    <tr><td>中川</td><td>60</td></tr>
    <tr><td>川西</td><td>55</td></tr>
    <tr><td>西山</td><td>18</td></tr>
    </tbody>
  </table>
  </div>
</p>
</div>
ちなみに、↓ この方が早い。
  <style>
  #test17811 {
    border-collapse:collapse ;
    border-spacing:0px;
  }
  #test17811 thead td{ 
    border-right: 1px solid #888;
    border-bottom: 1px solid #888;
  }
  #test17811 td{ 
    border-right: 1px solid #bbb;
    border-bottom: 1px solid #bbb;
  }
  </style>

  <div id="test17811">
  <table>
    <thead>
    <tr><td>名前</td><td>点数</td></tr>
    </thead>
    <tbody>
    <tr><td>山田</td><td>80</td></tr>
    <tr><td>田中</td><td>50</td></tr>
    <tr><td>中川</td><td>60</td></tr>
    <tr><td>川西</td><td>55</td></tr>
    <tr><td>西山</td><td>18</td></tr>
    </tbody>
  </table>
  </div>
</p>
</div>

  <script type="text/javascript">
  //$(function(){
    $("#test17811 thead").css("background", "#ccc");
    $("#test17811 tbody tr:even").css("background", "#d0e6ff");
    $("#test17811 tbody tr:odd").css("background", "#dddddd");
  //});
  </script>
投稿者 tato : 20:18

【jQuery】:even

jQuery 】 , リファレンス ブックマークに追加する ブックマーク-- Buzzurl  / Hatena  / Livedoor track feed


Selectors/ even

:even

$(expression[,context]) の引数で使用し、検索生成された要素配列のうち、0からはじめてindexが偶数の要素(s)。 参照→Selectors 参照→:odd 参照本家→:even

String

Examples

$("tbody tr:even","#test1").css("background", "#ddd");//第二引数の #test1 は下記のように書いても可
$("#test1 tbody tr:even").css("background", "orange");

Example1 : テーブルの偶数行へ背景色を指定します。ID名が"#test17801"要素内のtbody要素配下でtr要素へCSS指定します。(index 0 からはじめます。0は偶数扱いです。) 

名前点数
山田80
田中50
中川60
川西55
西山18

<script src='./jquery-min.js'></script>
  <script type="text/javascript">
  $(function(){
    $("tbody tr:even","#test17801").css("background", "#ddd");
  });
  </script>

  <style>
  #test17801 {
    border-collapse:collapse ;
    border-spacing:0px;
  }
  #test17801 td{ 
    border-right: 1px solid #CCC;
    border-bottom: 1px solid #CCC;
    background-color: #EFF2F3;
  }
  </style>

  <div id="test17801">
  <table border="0">
    <thead>
    <tr><td>名前</td><td>点数</td></tr>
    </thead>
    <tbody>
    <tr><td>山田</td><td>80</td></tr>
    <tr><td>田中</td><td>50</td></tr>
    <tr><td>中川</td><td>60</td></tr>
    <tr><td>川西</td><td>55</td></tr>
    <tr><td>西山</td><td>18</td></tr>
    </tbody>
  </table>
  </div>

Example1 : ボタンクリックでテーブルの偶数行&偶数列へ背景色を指定します。ID名が"#test17802"要素内のtbody要素配下でtr:evenな要素内の td:evenな要素(^^;へCSS指定します。(index 0 からはじめます。0は偶数扱いです。)

P.S.縞々テーブルも1行で処理できるのは便利。 

 

名前点数
山田80
田中50
中川60
川西55
西山18

<script src='./jquery-min.js'></script>
  <script type="text/javascript">
  $(function(){
    $("#my1780btn").click(function(){
      $("#test17802 tbody tr:even td:even").css("background", "gold");
    });
  });
  </script>

  <style>
  #test17802 {
    border-collapse:collapse ;
    border-spacing:0px;
  }
  #test17802 td{ 
    border-right: 1px solid #CCC;
    border-bottom: 1px solid #CCC;
    background-color: #EFF2F3;
  }
  </style>

  <div id="test17802">
  <table border="0">
    <thead>
    <tr><td>名前</td><td>点数</td></tr>
    </thead>
    <tbody>
    <tr><td>山田</td><td>80</td></tr>
    <tr><td>田中</td><td>50</td></tr>
    <tr><td>中川</td><td>60</td></tr>
    <tr><td>川西</td><td>55</td></tr>
    <tr><td>西山</td><td>18</td></tr>
    </tbody>
  </table>
  </div>

  <button id="my1780btn">click</button>
投稿者 tato : 01:23

2007年10月29日

【jQuery】jQueryでも普通にDOMを扱いたい

DOM 】 , JavaScript 】 , jQuery 】 , ライブラリ 】 , リファレンス ブックマークに追加する ブックマーク-- Buzzurl  / Hatena  / Livedoor track feed


jQueryの作法の基本は、セレクタなどで検索して、メソッドチェーンの連結による再帰的処理を行います。そのメソッドの戻り値は、 jQueryインスタンス を返してくれますが、DOM Element は返してくれません。

したがって、たとえ#ID名で検索したとしても、そのまま、いつものDOM操作のような次のようなことはできません。
 $("#testId").innerHTML="hogehoge" //使えません
その代わり、豊富なメソッドを持つjQueryオブジェクトを返すのでそれで処理してね。というわけです。 たとえば、次のように書けば、検索したDOM要素へHTMLを書き込むことができます。
 $("#testId").html("hoge<b>hoge</b>") 
でも、今までのコード資産や他のライブラリと組み合わせる時には、このままでは使いにくいので、普通のDOMElementをどうすれば手に入れられるのかみてみます。

実は、$("#testID")とした時に生成し返される配列があります。それは、たとえば、次のようなものです。
[div#testID]
(このdiv#testIDは、DOMElementオブジェクトです) さらに、複数の要素が返るタイプのセレクタ(たとえば$(".ccc")とか)を使うとこうです。
[div#aaa.ccc, div#bbb.ccc,....(略)....]
つまり、検索された要素がすべて収まった配列です。この配列はクリーンな配列で、検索した要素だけが収まっています。jQueryインスタンス内の各メソッドは露出しません。

もうわかりましたね(^^。検索された、たとえば最初の要素は、次のようにして取り出せます。
$(".ccc")[0]
[0]のインデックス番号を変えれば次々と取り出せますし、$(".ccc").lengthで検索した要素の数も返ってきますので、次のような書き方もできます。
ary=$(".ccc");
for(var i=0;i<ary.length;i++)alert(ary[i].innerHTML)
また、jQueryのメソッドeachを利用して書くこともできます。
$(".ccc").each(function(index,nodeOj){
   this.innerHTML="dddd"
})
(ちなみに、この第二引数nodeOjとthisは同じです)
で、jQueryにはこれを取り出すgetというメソッドもあり、次のように使えます。
$(".firstHeading").each(function(index,nodeOj){
   $(".ccc").get()//配列が返ります
   $(".ccc").get(0)//0番目の要素が返ります
})
したがって、たとえば、0番目の要素の中身は、innerHTMLで次のように書き換えることもできるわけです。
$(".ccc").get(0).innerHTML="ok 書き換わりました"
まぁ、jQueryの作法に従わないと、美しくは書けないかもしれませんが ( jQueryの作者自身はjQueryをダーティと謙遜してますけど )、知っておくと多少は役に立つかなぁ。

ちなみに、私はjQueryの中にはクロスブラウザなどのための物凄いダーティTips?がたくさん詰めこまれていますが、それらを統合した成果であるjQueryは美しいと思います。

そこをjQueryが引き受けたお陰で、使う人は、こんなに簡単で安全に書けるわけです。
投稿者 tato : 15:41

2007年10月25日

【jQuery】jQuery UI/Accordion

jQuery 】 , ライブラリ 】 , リファレンス ブックマークに追加する ブックマーク-- Buzzurl  / Hatena  / Livedoor track feed


【jQuery】Selectors を書くのに項目数が多くて場所を取りそうなので、jQuery UI Accordion を使ってみました。

jquery.jsの他にui.accordion.jsを読み込んであとはHTML+CSS指定を書くだけなので楽ちんですが、コメントでも話が出ているように、かさばるコンテンツをアコーデオンに収めると開閉動作がスクロールを伴うので、かなり読みにくいインターフェイスになってしまいます。

そこで、とりあえず、accordionへshowAllとhideAllメソッドを拡張して(しなくても良いんですけど、一応、、、^^;)チェックボックスで全開/閉できるようにしてみました。

これで、読みたいときだけ読みたい部分をクリックで引き出しのように開くか、showAllで全部開いてゆっくり見る。という使い方ができるようになりました。 その拡張ソースは下記のとおり。#jqexample .ui-accordion-bodyって埋め込んじゃってますけど(^^;まぁ、いいや。少しだけ修正。

で、更に、hideAllに不具合があったので、あっさり、showAllのみに変更。<拡張は慎重にf^^;。
    $("#jqexample").accordion({alwaysOpen: false});

    $.fn.extend( $("#jqexample").accordion , {
        showAll:function(){$("#jqexample .ui-accordion-body").fadeIn();},
        hideAll:function(){$("#jqexample .ui-accordion-body").fadeOut();}
    });

    $("#jqexample").accordion.hideAll() ;

    $("#jqshowall:checkbox").click(function(e){ 
       if($("#jqshowall:checkbox").get(0).checked){
         $("#jqexample").accordion.showAll() ;
       } else {
         $("#jqexample").accordion.hideAll() ;
       }
    });

//で、さらに修正f^^;;;

    //インスタンス作ります
    $("#jqexample").accordion({alwaysOpen: false});

    //インスタンスにメソッドを2つ追加コピーします
    $.fn.extend( $("#jqexample").accordion , {
        showAll:function(targets){$(targets).fadeIn();},
        hideAll:function(targets){$(targets).fadeOut();}
    });

    //全部フェイドアウト ここは、フェイドは無駄なのでhide()で良いかも
    $("#jqexample").accordion.hideAll("#jqexample .ui-accordion-body") ;

    //チェックボックスクリック来たら判定して2つのメソッドをトグル動作させる
    $("#jqshowall:checkbox").click(function(e){ 
       if($("#jqshowall:checkbox").get(0).checked){
         $("#jqexample").accordion.showAll("#jqexample .ui-accordion-body") ;
       } else {
         $("#jqexample").accordion.hideAll("#jqexample .ui-accordion-body") ;
       }
    });


    //インスタンス作ります
    $("#jqexample").accordion({alwaysOpen: false});

    //インスタンスのaccordionにshowAllメソッドを追加コピーします
    $.fn.extend( $("#jqexample").accordion , {
        showAll:function(target){$(target).fadeIn();}
    });

    //ボタンクリック来たらshowAllメソッドを動作させる
    $("#jqshowall:button").click(function(e){ 
         $("#jqexample").accordion.showAll("#jqexample .ui-accordion-body") ;
    });

でも、拡張使ってみたかったというだけのことなので普通は下記で良いかも(笑)。

    //インスタンス作ります
    $("#jqexample").accordion({alwaysOpen: false});

    //ボタンクリック来たら#jqexample 内の.ui-accordion-bodyをすべてfadeInする
    $("#jqshowall:button").click(function(e){ 
         $("#jqexample .ui-accordion-body").fadeIn();
    });

それにしても、jQueryだと、なんて簡単に書けるんだろう!
投稿者 tato : 22:16

【jQuery】Selectors

jQuery 】 , リファレンス ブックマークに追加する ブックマーク-- Buzzurl  / Hatena  / Livedoor track feed


Selector

Basics(基本):

#id String

与えられたID名にマッチするエレメント

$("#myId").show();

element String

与えられた要素名(タグ名)にマッチするエレメント(s)

$("div").css("font-size","12px");

.class String

与えられたクラス名にマッチするエレメント(s)

$(".myClass").html("myClassです");

*String

すべてのエレメント(s)

$("*").css("border","3px dotted #888");

selector1, selector2, ...selectorN String

指定したすべてのエレメント(s)。「,」で区切っていくつでもセレクタを増やせます。

$("#id1 , #id2 , li").css("font-size","1.2em");
Hierarchy(階層):

ancestor descendant String

左辺の「先祖 ancestor」要素内にある 右辺の「子孫 descendant」要素に該当するすべてのエレメント(s)

$("form input").attr("disabled","");

parent > child String

左辺の「親 parent」要素内にある 右辺の「子 child」要素に該当するすべてのエレメント(s)

$("#myId div").css("color","red");

prev + next String

左辺の「前 prev」要素の「次 next」の要素に該当するエレメント

$(".myClass + p").css("font-size","10px");

prev ~ siblingsString

左辺の「前 prev」要素以降にある右辺の「兄弟 siblings」要素に該当するすべてのエレメント(s)

$("form ~ input").css("color","#ddd");
Basic Filters(基本フィルタ):

:first String

最初のエレメント(s)

$("td:first").css("color","#ddd");

:last String

最後のエレメント(s)

$("tr:last").css("color","#ddd");

:not(selector) String

与えられたセレクタを無視します

$("input:not(:checked)").css("color","#ddd");

:even String

0からはじめてindexが偶数の要素(s)  →:even

$("tr:even").css("color","#ddd");

:odd String

0からはじめてindexが奇数の要素(s)  →:odd

$("tr:odd").css("color","#ddd");

:eq(index) String

与えたインデックス番号に合致する要素

$("td:eq(5)").css("color","#ddd");

:gt(index) String

与えたインデックス番号を超えるインデックスの要素

$("td:gt(5)").css("color","#ddd");

:lt(index) String

与えたインデックス番号未満のインデックスの要素

$("td:lt(1)").css("color","#ddd");

:header String

すべての<H>見出し要素

$(":header").css("color","#ddd");

:animated String

現在アニメーション動作中の要素(s)

$("div:animated").css("color","#ddd");
Content Filters(コンテンツフィルタ):

:contains(text) String

与えられたtextにマッチするすべての要素(s)

("div:contains('ウルトラマン')").css("font-size","xx-large");

:empty String

内容が空のすべての要素

$("td:empty").html("-")

:has(selector) String

与えられたセレクタにマッチするすべての要素(s)

$("div:has(li)").css("color","#ddd");

:parent String

文字列を含む親要素

$("td:parent").css("background","#ddd");
Visibility Filters(可視フィルタ):

:hidden String

hiddenな状態のすべての要素 inputのhiddn

$("div:hidden").show();

:visible String

文字列を含む親要素

$("td:parent").css("background","#ddd");
Attribute Filters(属性フィルタ):

[attribute] String

指定された属性attributeを持つ要素(s)

("a[href]").css("background","#ddd");

[attribute=value] String

指定された属性attributeが、指定された値valueの要素(s)

$("a[href='http://jsgt.org/mt/01/']").css("background","#ddd");

[attribute^=value] String

指定された属性attributeが、指定された値valueで始まる要素(s)

$("a[href^='http://jsgt.org/mt/01/']").css("background","#ddd");

[attribute$=value] String

指定された属性attributeが、指定された値valueで終わる要素(s)

$("a[href$='index.html']").css("background","#ddd");

[attribute*=value] String

指定された属性attributeが、指定された値valueをどこかに持つ要素(s)

$("div[id*='test']").css("background","#ddd");
Child Filters(Childフィルタ):

:nth-child(index/even/odd/equation) String

:nth-childで指定された要素のうちindex番目/偶数/奇数/式の要素(s)

$("div:nth-child(5)").css("background","#ddd");//5番目のdiv
$("div:nth-child(even)").css("background","#ddd");//偶数番目のdiv
$("div:nth-child(odd)").css("background","#ddd");//奇数番目のdiv
$("div:nth-child(2n+1)").css("background","#ddd");//奇数番目のdiv
$("div:nth-child(2n)").css("background","#ddd");//偶数番目のdiv
//3色を順番に繰り返す
$("tr:nth-child(3n+1)").css("color", "red");
$("tr:nth-child(3n+2)").css("color", "orange");
$("tr:nth-child(3n+3)").css("color", "pink");

:first-child String

最初の子要素

$("div:first-child").css("background","#ddd");

:last-child String

最後の子要素

$("div:last-child").css("background","#ddd");

:only-child String

その親要素内で唯一の(兄弟を持たない)子要素

$("div:only-child").css("background","#ddd");
Forms(フォーム):

:input String

input, textarea, select と button 要素

$(":input").css("background","#ddd");

:text String

type="text"のinput要素

$(":text").css("background","#ddd");

:password String

type="password"のinput要素

$(":password").css("background","#ddd");

:radio String

type="radio"のinput要素

$(":radio").css("background","#ddd");

:checkbox String

type="checkbox"のinput要素

$(":checkbox").css("background","#ddd");

:submit String

type="submit"のinput要素

$(":submit").css("background","#ddd");

:image String

type="image"のinput要素

$(":image").css("background","#ddd");

:reset String

type="reset"のinput要素

$(":reset").css("background","#ddd");

:button String

type="submit"のinput要素

$(":button").css("background","#ddd");

:file String

type="file"のinput要素

$(":file").css("background","#ddd");

:hidden String

type="hidden"のinput要素、または、display:noneなどhiddenな要素

$(":hidden").css("background","#ddd");
$("div:hidden").show(3000);
Form Filters(フォームフィルタ):

:enabled String

enabledな要素

$(":enabled").css("background","#ddd");

:disabled String

disabledな要素

$(":disabled").css("background","#ddd");

:checked String

checkedな要素

$(":checked").css("background","#ddd");

:selected String

selectedな要素

$(":selected").css("background","#ddd");
#jQuery UI のtab を使ってみました。


    com2 ( 2007年10月26日 16:32 )

    縦に長いコンテンツでアコーディオンを使うと、上下に行ったり来たりが増えてとても見づらいです……

    高橋 ( 2007年10月27日 01:11 )

    私も設置してみてそれ感じました(^^;;ということで、showAll/hideAllチェックをつけてみました。

    見る人以外は、全部開くとかなり場所をとるので、デフォルトでhideAll。

    読みたいときだけ読みたい部分をクリックで引き出しのように開くか、showAllで全部開いてゆっくり見る、という形になりますが、どうでしょう。

    高橋 ( 2007年10月27日 02:26 )

    hideAllに不具合があったのでshowAllのみのボタンに変更しましたf^^;;;

    高橋 ( 2007年10月28日 22:00 )

    アコーディオンをやめて、Tabに変更しました。コピーミスで、</div>を2個多く書いたせいで一瞬ページがぐちゃぐちゃに(^^;


    【コメント】(←clickで入力欄open)
投稿者 tato : 21:14

2007年10月24日

【jQuery】$(callback)

jQuery 】 , リファレンス ブックマークに追加する ブックマーク-- Buzzurl  / Hatena  / Livedoor track feed


$(callback)

DOM の読み込みが完了すると、引数で与えたcallback関数を実行します。$(document).ready()を簡略化した表現です。複数登録も可能です。 ( * 「$」はjQueryオブジェクトへのショートカットなのでjQuery(callback) と書いても同じです。)

引数

callback Function

DOM document が準備完了するとこのcallback関数が実行されます。

戻り値

jQuery インスタンス (DOM Elementそのものではありませんので 戻り値.innerHTMLなどは できません)

Examples

$(function(){alert('読み込み完了')});
$(function(){$("#myForm").attr("disabled","")});

Example1 : ページの読み込みが完了すると、 下のボタンが「チョトマテクダサイ...」から「クリックしてもOK!」に変わりクリックできるようになります。 クリックすると、"#myId1770" の要素がフェイドインで現れます