回答編集履歴
1
改行位置の変更
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
|
-
イベントハンドラが
|
|
7
|
+
イベントハンドラがfalseを返した場合「preventDefault()とstopPropagation()」が
|
|
8
|
-
jQuery内で独自にイベントを呼び出すループがあり、その条件に
|
|
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)バリデーションでエラーとなる
|
|
49
|
+
2)バリデーションでエラーとなる処理で、event.stopImmediatePropagation()を呼び出す。
|
|
47
50
|
かつ、イベントハンドラの戻り値を、falseで終了する。
|
|
48
51
|
※サンプルコードがバリデーションの結果に関係なく、falseを返していたので移動しました。
|
|
49
52
|
```javascript
|