質問するログイン新規登録

回答編集履歴

1

改行位置の変更

2016/02/12 23:21

投稿

StupidDog
StupidDog

スコア263

answer CHANGED
@@ -1,18 +1,20 @@
1
1
  **はじめに**
2
- jQueryで同一階層に登録された複数のイベントを中断させる場合は、ハンドラ内で
2
+ jQueryで同一階層に登録された複数のイベントを中断させる場合は、
3
- event.stopImmediatePropagation()を呼び出します。
3
+ イベントハンドラ内で event.stopImmediatePropagation()を呼び出します。
4
4
  [jQuery,API Documents,event.stopImmediatePropagation](http://api.jquery.com/event.stopImmediatePropagation/)
5
5
 
6
6
  **説明**
7
- イベントハンドラが false を返した場合「preventDefault()とstopPropagation()」が呼ばれるのですが、
7
+ イベントハンドラがfalseを返した場合「preventDefault()とstopPropagation()」が
8
- jQuery内で独自にイベントを呼び出すループがあり、その条件にImmediatePropagationのフラグ判定が
8
+ 呼ばれるのですが、jQuery内で独自にイベントを呼び出すループがあり、その条件に
9
- あります。(一部抜粋)
9
+ ImmediatePropagationのフラグ判定があります。(一部抜粋)
10
+
10
11
  [github,jQuery/src/event.js](https://github.com/jquery/jquery/blob/1de834672959636da8c06263c3530226b17a84c3/src/event.js)
11
12
  ```javascript
12
13
  i = 0;
13
14
  while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
14
15
  event.currentTarget = matched.elem;
15
16
 
17
+ // このループ
16
18
  j = 0;
17
19
  while ( ( handleObj = matched.handlers[ j++ ] ) && !event.isImmediatePropagationStopped() ) {
18
20
 
@@ -37,13 +39,14 @@
37
39
  }
38
40
  ```
39
41
  内側のwhileで、!event.isImmediatePropagationStopped()を条件としているため、
40
- イベントハンドラが、falseを返しただけでは中断されず同階層の次のイベントを呼び出します。
42
+ イベントハンドラが、falseを返しただけでは中断されず同階層の次のイベントを
43
+ 呼び出します。
41
44
 
42
45
  **まとめ**
43
- サンプルコードに適用した場合として、以下のようにすると実現できるかと思います。
46
+ サンプルコードに適用した場合、以下のようにすると実現できるかと思います。
44
47
 
45
48
  1)イベントハンドラで、eventオブジェクトを受け取るようにする。
46
- 2)バリデーションでエラーとなる else の処理で、event.stopImmediatePropagation()を呼び出す。
49
+ 2)バリデーションでエラーとなる処理で、event.stopImmediatePropagation()を呼び出す。
47
50
  かつ、イベントハンドラの戻り値を、falseで終了する。
48
51
  ※サンプルコードがバリデーションの結果に関係なく、falseを返していたので移動しました。
49
52
  ```javascript