root/platform/silverlight/Silverlight.JQuery/trunk/src/Silverlight.JQuery/JQuery/JQuery.cs @ 8106

Revision 8106, 20.0 kB (checked in by coma2n, 7 years ago)

platform/silverlight/Silverlight.JQuery/trunk: 拡張メソッドを追加した

Line 
1#region license
2/*
3Copyright (c) 2008, Kouji Yamaguchi
4All rights reserved.
5
6Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
7
8* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
9
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
11
12* Neither the name of coma2n nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
13
14THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
15INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
16IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
17OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
18OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
19OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
20*/
21#endregion
22
23#region namespaces
24
25using System;
26using System.Windows.Browser;
27using System.Diagnostics;
28
29using Silverlight.Commons;
30
31#endregion
32
33namespace Silverlight.JQuery {
34
35        #region JQuery class
36
37        /// <summary>
38        /// JavaScriptライブラリ「jQuery」をラップするクラス
39        /// </summary>
40        public sealed class JQuery {
41
42                #region const
43
44                /// <summary>
45                /// ブラウザウィンドウ
46                /// </summary>
47                private static readonly HtmlWindow window = HtmlPage.Window;
48
49                #endregion
50
51                #region fields
52
53                /// <summary>
54                /// エクスプレッションに該当した要素
55                /// </summary>
56                private ScriptObject element;
57
58                #endregion
59
60                #region constructors
61
62                /// <summary>
63                /// 指定したエクスプレッションからjQueryオブジェクトを生成します。
64                /// </summary>
65                /// <param name="expression">エクスプレッション</param>
66                /// <exception cref="ArgumentException">引数が不正な時</exception>
67                /// <exception cref="ArgumentNullException">引数がnullの時</exception>
68                public JQuery(string expression) {
69                        #region ArgumentValidation
70                        ArgumentValidation.CheckForNullOrEmpty(expression, "expression");
71                        #endregion
72
73                        element = (ScriptObject)window.Invoke("$", expression);
74                }
75
76                /// <summary>
77                /// 指定したHTML要素からjQueryオブジェクトを生成します。
78                /// </summary>
79                /// <param name="elements">HTML要素</param>
80                /// <exception cref="ArgumentNullException">引数がnullの時</exception>
81                public JQuery(params HtmlElement[] elements) {
82                        #region ArgumentValidation
83                        ArgumentValidation.CheckForNullReference(elements, "elements");
84                        #endregion
85
86                        element = (ScriptObject)window.Invoke("$", elements);
87                }
88
89                #endregion
90
91                #region methods
92
93                #region Core
94
95                /// <summary>
96                /// 現在の要素の数を取得します。
97                /// </summary>
98                /// <returns>要素の数</returns>
99                public int Size() {
100                        return (int)((double)element.Invoke("size"));
101                }
102
103                /// <summary>
104                /// 現在の要素の数を取得します。
105                /// </summary>
106                public int Length {
107                        get {
108                                // 何故かdouble型で返ってくるの改めてint型でキャスト
109                                return (int)((double)element.GetProperty("length"));
110                        }
111                }
112
113                /// <summary>
114                /// 現在の要素から全てのHTML要素を取得します。
115                /// </summary>
116                /// <returns>HTML要素の配列</returns>
117                public HtmlElement[] Get() {
118                        return Get<HtmlElement[]>("get");
119                }
120
121                /// <summary>
122                /// 現在の要素から指定したインデックスのHTML要素を取得します。
123                /// </summary>
124                /// <param name="index">インデックス</param>
125                /// <returns>HTML要素</returns>
126                /// <exception cref="ArgumentException">引数が不正な時</exception>
127                public HtmlElement Get(int index) {
128                        #region ArgumentValidation
129                        ArgumentValidation.CheckForGreaterEqualZero(index, "index");
130                        #endregion
131
132                        return Get<HtmlElement>("get", index);
133                }
134
135                #endregion
136
137                #region Attributes
138
139                /// <summary>
140                /// 要素のHTMLを取得します。
141                /// </summary>
142                /// <returns>HTML</returns>
143                public string Html() { return Get<string>("html"); }
144                /// <summary>
145                /// 指定したHTML文字列を要素のHTMLに設定します。
146                /// </summary>
147                /// <param name="html">HTML文字列</param>
148                /// <returns>自分自身</returns>
149                public JQuery Html(string html) { return Set("html", html); }
150
151                /// <summary>
152                /// 要素のテキストを取得します。
153                /// </summary>
154                /// <returns>テキスト</returns>
155                public string Text() { return Get<string>("text"); }
156                /// <summary>
157                /// 指定した文字列を要素のテキストに設定します。
158                /// </summary>
159                /// <param name="text">文字列</param>
160                /// <returns>自分自身</returns>
161                public JQuery Text(string text) { return Set("text", text); }
162
163                #endregion
164
165                #region Manipulation
166
167                /// <summary>
168                /// 指定したコンテンツを現在の要素の子要素として後ろから追加します。
169                /// </summary>
170                /// <param name="contents">要素(JQueryオブジェクト or 文字列)</param>
171                /// <returns>自分自身</returns>
172                /// <exception cref="ArgumentNullException">引数がnullの時</exception>
173                public JQuery Append(params object[] contents) {
174                        #region ArgumentValidation
175                        ArgumentValidation.CheckForNullReference(contents, "contents");
176                        #endregion
177
178                        return AppendInternal("append", contents);
179                }
180
181                /// <summary>
182                /// 指定したコンテンツを現在の要素の後ろに追加します。
183                /// </summary>
184                /// <param name="contents">要素(JQueryオブジェクト or 文字列)</param>
185                /// <returns>自分自身</returns>
186                /// <exception cref="ArgumentNullException">引数がnullの時</exception>
187                public JQuery AppendTo(params object[] contents) {
188                        #region ArgumentValidation
189                        ArgumentValidation.CheckForNullReference(contents, "contents");
190                        #endregion
191
192                        return AppendInternal("appendTo", contents);
193                }
194
195                /// <summary>
196                /// 指定したコンテンツを現在の要素の子要素として前から追加します。
197                /// </summary>
198                /// <param name="contents">要素(JQueryオブジェクト or 文字列)</param>
199                /// <returns>自分自身</returns>
200                /// <exception cref="ArgumentNullException">引数がnullの時</exception>
201                public JQuery Prepend(params object[] contents) {
202                        #region ArgumentValidation
203                        ArgumentValidation.CheckForNullReference(contents, "contents");
204                        #endregion
205
206                        return AppendInternal("prepend", contents);
207                }
208
209                /// <summary>
210                /// 指定したコンテンツを現在の要素の前に追加します。
211                /// </summary>
212                /// <param name="contents">要素(JQueryオブジェクト or 文字列)</param>
213                /// <returns>自分自身</returns>
214                /// <exception cref="ArgumentNullException">引数がnullの時</exception>
215                public JQuery PrependTo(params object[] contents) {
216                        #region ArgumentValidation
217                        ArgumentValidation.CheckForNullReference(contents, "contents");
218                        #endregion
219
220                        return AppendInternal("prependTo", contents);
221                }
222
223                #endregion
224
225                #region Events
226
227                /// <summary>
228                /// 指定したハンドラをページが読み込まれた時に呼び出されるイベントに追加します。
229                /// </summary>
230                /// <param name="handler">ハンドラ</param>
231                /// <returns>自分自身</returns>
232                /// <exception cref="ArgumentNullException">引数がnullの時</exception>
233                public JQuery Ready(EventHandler handler) {
234                        OnReady += handler;
235
236                        return this;
237                }
238                /// <summary>
239                /// ページが読み込まれた時に呼び出されます。
240                /// </summary>
241                public event EventHandler OnReady {
242                        add {
243                                HtmlPage.Document.DocumentReady += value;
244                        }
245                        remove {
246                                HtmlPage.Document.DocumentReady -= value;
247                        }
248                }
249
250                /// <summary>
251                /// 指定したハンドラを要素がブラーされた時に呼び出されるイベントに追加します。
252                /// </summary>
253                /// <param name="handler">ハンドラ</param>
254                /// <returns>自分自身</returns>
255                /// <exception cref="ArgumentNullException">引数がnullの時</exception>
256                public JQuery Blur(EventHandler<HtmlEventArgs> handler) {
257                        OnBlur += handler;
258
259                        return this;
260                }
261                /// <summary>
262                /// 要素がブラーされた時に呼び出されます。
263                /// </summary>
264                public event EventHandler<HtmlEventArgs> OnBlur {
265                        add {
266                                this.Each(ele => ele.AttachEvent("onblur", value));
267                        }
268                        remove {
269                                this.Each(ele => ele.DetachEvent("onblur", value));
270                        }
271                }
272
273                /// <summary>
274                /// 指定したハンドラを要素の値が変更された時に呼び出されるイベントに追加します。
275                /// </summary>
276                /// <param name="handler">ハンドラ</param>
277                /// <returns>自分自身</returns>
278                /// <exception cref="ArgumentNullException">引数がnullの時</exception>
279                public JQuery Change(EventHandler<HtmlEventArgs> handler) {
280                        OnChange += handler;
281
282                        return this;
283                }
284                /// <summary>
285                /// 要素の値が変更された時に呼び出されます。
286                /// </summary>
287                public event EventHandler<HtmlEventArgs> OnChange {
288                        add {
289                                this.Each(ele => ele.AttachEvent("onchange", value));
290                        }
291                        remove {
292                                this.Each(ele => ele.DetachEvent("onchange", value));
293                        }
294                }
295
296                /// <summary>
297                /// 指定したハンドラを要素がクリックされた時に呼び出されるイベントに追加します。
298                /// </summary>
299                /// <param name="handler">ハンドラ</param>
300                /// <returns>自分自身</returns>
301                /// <exception cref="ArgumentNullException">引数がnullの時</exception>
302                public JQuery Click(EventHandler<HtmlEventArgs> handler) {
303                        OnClick += handler;
304
305                        return this;
306                }
307                /// <summary>
308                /// 要素がクリックされた時に呼び出されます。
309                /// </summary>
310                public event EventHandler<HtmlEventArgs> OnClick {
311                        add {
312                                this.Each(ele => ele.AttachEvent("onclick", value));
313                        }
314                        remove {
315                                this.Each(ele => ele.DetachEvent("onclick", value));
316                        }
317                }
318
319                /// <summary>
320                /// 指定したハンドラを要素がダブルクリックされた時に呼び出されるイベントに追加します。
321                /// </summary>
322                /// <param name="handler">ハンドラ</param>
323                /// <returns>自分自身</returns>
324                /// <exception cref="ArgumentNullException">引数がnullの時</exception>
325                public JQuery DblClick(EventHandler<HtmlEventArgs> handler) {
326                        OnDblClick += handler;
327
328                        return this;
329                }
330                /// <summary>
331                /// 要素がダブルクリックされた時に呼び出されます。
332                /// </summary>
333                public event EventHandler<HtmlEventArgs> OnDblClick {
334                        add {
335                                this.Each(ele => ele.AttachEvent("ondblclick", value));
336                        }
337                        remove {
338                                this.Each(ele => ele.DetachEvent("ondblclick", value));
339                        }
340                }
341
342                /// <summary>
343                /// 指定したハンドラを要素にフォーカスが設定された時に呼び出されるイベントに追加します。
344                /// </summary>
345                /// <param name="handler">ハンドラ</param>
346                /// <returns>自分自身</returns>
347                /// <exception cref="ArgumentNullException">引数がnullの時</exception>
348                public JQuery Focus(EventHandler<HtmlEventArgs> handler) {
349                        OnFocus += handler;
350
351                        return this;
352                }
353                /// <summary>
354                /// 要素にフォーカスが設定された時に呼び出されます。
355                /// </summary>
356                public event EventHandler<HtmlEventArgs> OnFocus {
357                        add {
358                                this.Each(ele => ele.AttachEvent("onfocus", value));
359                        }
360                        remove {
361                                this.Each(ele => ele.DetachEvent("onfocus", value));
362                        }
363                }
364
365                /// <summary>
366                /// 指定したハンドラを要素でキーが押下された時に呼び出されるイベントに追加します。
367                /// </summary>
368                /// <param name="handler">ハンドラ</param>
369                /// <returns>自分自身</returns>
370                /// <exception cref="ArgumentNullException">引数がnullの時</exception>
371                public JQuery KeyDown(EventHandler<HtmlEventArgs> handler) {
372                        OnKeyDown += handler;
373
374                        return this;
375                }
376                /// <summary>
377                /// 要素でキーが押下された時に呼び出されます。
378                /// </summary>
379                public event EventHandler<HtmlEventArgs> OnKeyDown {
380                        add {
381                                this.Each(ele => ele.AttachEvent("onkeydown", value));
382                        }
383                        remove {
384                                this.Each(ele => ele.DetachEvent("onkeydown", value));
385                        }
386                }
387
388                /// <summary>
389                /// 指定したハンドラを要素でキーが押された時に呼び出されるイベントに追加します。
390                /// </summary>
391                /// <param name="handler">ハンドラ</param>
392                /// <returns>自分自身</returns>
393                /// <exception cref="ArgumentNullException">引数がnullの時</exception>
394                public JQuery KeyPress(EventHandler<HtmlEventArgs> handler) {
395                        OnKeyPress += handler;
396
397                        return this;
398                }
399                /// <summary>
400                /// 要素でキーが押された時に呼び出されます。
401                /// </summary>
402                public event EventHandler<HtmlEventArgs> OnKeyPress {
403                        add {
404                                this.Each(ele => ele.AttachEvent("onkeypress", value));
405                        }
406                        remove {
407                                this.Each(ele => ele.DetachEvent("onkeypress", value));
408                        }
409                }
410
411                /// <summary>
412                /// 指定したハンドラを要素でキーが離された時に呼び出されるイベントに追加します。
413                /// </summary>
414                /// <param name="handler">ハンドラ</param>
415                /// <returns>自分自身</returns>
416                /// <exception cref="ArgumentNullException">引数がnullの時</exception>
417                public JQuery KeyUp(EventHandler<HtmlEventArgs> handler) {
418                        OnKeyUp += handler;
419
420                        return this;
421                }
422                /// <summary>
423                /// 要素でキーが離された時に呼び出されます。
424                /// </summary>
425                public event EventHandler<HtmlEventArgs> OnKeyUp {
426                        add {
427                                this.Each(ele => ele.AttachEvent("onkeyup", value));
428                        }
429                        remove {
430                                this.Each(ele => ele.DetachEvent("onkeyup", value));
431                        }
432                }
433
434                /// <summary>
435                /// 指定したハンドラを要素がロードされた時に呼び出されるイベントに追加します。
436                /// </summary>
437                /// <param name="handler">ハンドラ</param>
438                /// <returns>自分自身</returns>
439                /// <exception cref="ArgumentNullException">引数がnullの時</exception>
440                public JQuery Load(EventHandler<HtmlEventArgs> handler) {
441                        OnLoad += handler;
442
443                        return this;
444                }
445                /// <summary>
446                /// 要素がロードされた時に呼び出されます。
447                /// </summary>
448                public event EventHandler<HtmlEventArgs> OnLoad {
449                        add {
450                                this.Each(ele => ele.AttachEvent("onload", value));
451                        }
452                        remove {
453                                this.Each(ele => ele.DetachEvent("onload", value));
454                        }
455                }
456
457                /// <summary>
458                /// 指定したハンドラを要素でマウスのボタンが押された時に呼び出されるイベントに追加します。
459                /// </summary>
460                /// <param name="handler">ハンドラ</param>
461                /// <returns>自分自身</returns>
462                /// <exception cref="ArgumentNullException">引数がnullの時</exception>
463                public JQuery MouseDown(EventHandler<HtmlEventArgs> handler) {
464                        OnMouseDown += handler;
465
466                        return this;
467                }
468                /// <summary>
469                /// 要素でマウスのボタンが押された時に呼び出されます。
470                /// </summary>
471                public event EventHandler<HtmlEventArgs> OnMouseDown {
472                        add {
473                                this.Each(ele => ele.AttachEvent("onmousedown", value));
474                        }
475                        remove {
476                                this.Each(ele => ele.DetachEvent("onmousedown", value));
477                        }
478                }
479
480                /// <summary>
481                /// 指定したハンドラを要素でマウスが移動された時に呼び出されるイベントに追加します。
482                /// </summary>
483                /// <param name="handler">ハンドラ</param>
484                /// <returns>自分自身</returns>
485                /// <exception cref="ArgumentNullException">引数がnullの時</exception>
486                public JQuery MouseMove(EventHandler<HtmlEventArgs> handler) {
487                        OnMouseMove += handler;
488
489                        return this;
490                }
491                /// <summary>
492                /// 要素でマウスが移動された時に呼び出されます。
493                /// </summary>
494                public event EventHandler<HtmlEventArgs> OnMouseMove {
495                        add {
496                                this.Each(ele => ele.AttachEvent("onmousemove", value));
497                        }
498                        remove {
499                                this.Each(ele => ele.DetachEvent("onmousemove", value));
500                        }
501                }
502
503                /// <summary>
504                /// 指定したハンドラを要素の上からマウスが外れた時に呼び出されるイベントに追加します。
505                /// </summary>
506                /// <param name="handler">ハンドラ</param>
507                /// <returns>自分自身</returns>
508                /// <exception cref="ArgumentNullException">引数がnullの時</exception>
509                public JQuery MouseOut(EventHandler<HtmlEventArgs> handler) {
510                        OnMouseOut += handler;
511
512                        return this;
513                }
514                /// <summary>
515                /// 要素の上からマウスが外れた時に呼び出されます。
516                /// </summary>
517                public event EventHandler<HtmlEventArgs> OnMouseOut {
518                        add {
519                                this.Each(ele => ele.AttachEvent("onmouseout", value));
520                        }
521                        remove {
522                                this.Each(ele => ele.DetachEvent("onmouseout", value));
523                        }
524                }
525
526                /// <summary>
527                /// 指定したハンドラを要素の上をマウスが通った時に呼び出されるイベントに追加します。
528                /// </summary>
529                /// <param name="handler">ハンドラ</param>
530                /// <returns>自分自身</returns>
531                /// <exception cref="ArgumentNullException">引数がnullの時</exception>
532                public JQuery MouseOver(EventHandler<HtmlEventArgs> handler) {
533                        OnMouseOver += handler;
534
535                        return this;
536                }
537                /// <summary>
538                /// 要素の上をマウスが通った時に呼び出されます。
539                /// </summary>
540                public event EventHandler<HtmlEventArgs> OnMouseOver {
541                        add {
542                                this.Each(ele => ele.AttachEvent("onmouseover", value));
543                        }
544                        remove {
545                                this.Each(ele => ele.DetachEvent("onmouseover", value));
546                        }
547                }
548
549                /// <summary>
550                /// 指定したハンドラを要素でマウスのボタンが離された時に呼び出されるイベントに追加します。
551                /// </summary>
552                /// <param name="handler">ハンドラ</param>
553                /// <returns>自分自身</returns>
554                /// <exception cref="ArgumentNullException">引数がnullの時</exception>
555                public JQuery MouseUp(EventHandler<HtmlEventArgs> handler) {
556                        OnMouseUp += handler;
557
558                        return this;
559                }
560                /// <summary>
561                /// 要素でマウスのボタンが離された時に呼び出されます。
562                /// </summary>
563                public event EventHandler<HtmlEventArgs> OnMouseUp {
564                        add {
565                                this.Each(ele => ele.AttachEvent("onmouseup", value));
566                        }
567                        remove {
568                                this.Each(ele => ele.DetachEvent("onmouseup", value));
569                        }
570                }
571
572                #endregion
573
574                /// <summary>
575                ///
576                /// </summary>
577                /// <typeparam name="T"></typeparam>
578                /// <param name="methodName"></param>
579                /// <returns></returns>
580                [DebuggerStepThrough]
581                private T Get<T>(string methodName) {
582                        return (T)element.Invoke(methodName);
583                }
584
585                /// <summary>
586                ///
587                /// </summary>
588                /// <typeparam name="T"></typeparam>
589                /// <param name="methodName"></param>
590                /// <param name="args"></param>
591                /// <returns></returns>
592                [DebuggerStepThrough]
593                private T Get<T>(string methodName, params object[] args) {
594                        return (T)element.Invoke(methodName, args);
595                }
596
597                /// <summary>
598                ///
599                /// </summary>
600                /// <param name="methodName"></param>
601                /// <param name="value"></param>
602                /// <returns></returns>
603                private JQuery Set(string methodName, object value) {
604                        element.Invoke(methodName, value);
605
606                        return this;
607                }
608
609                /// <summary>
610                ///
611                /// </summary>
612                /// <param name="methodName"></param>
613                /// <param name="contents"></param>
614                /// <returns></returns>
615                private JQuery AppendInternal(string methodName, object[] contents) {
616                        foreach(var c in contents) {
617                                element.Invoke(methodName,
618                                        (c is JQuery) ? ((JQuery)c).element : c
619                                );
620                        }
621                        return this;
622                }
623
624                #endregion
625
626        }
627
628        #endregion
629
630}
Note: See TracBrowser for help on using the browser.