前回、テーブル内の任意のセルをクリックし、モーダルウィンドウ内で編集した内容を元のセルに反映させたいという質問をさせていただきました。
●Javascriptによるテーブル内の任意のセル内テキストの編集
https://teratail.com/questions/18536
いったんは自己解決とさせていただいたのですが、いくつか疑問が残ってしまいましたので質問させていただきます。
1.入れ子にした場合なぜループのような現象が発生するのか
2.unbindする場合どこに入れるのか
3.パラメータを引き回す場合、どのように実装するのがいいのか
1.入れ子にした場合なぜループのような現象が発生するのか
クリックイベント内にクリックイベントを作って動作させると、二回目、三回目と繰り返す度に、ループのような動作が発生してしまいます。
これはどのような理由なのでしょうか。
以下の例では、開く→閉じる→開く→閉じるを繰り返す度にアラートダイアログが開く回数が加算されてきます。
コンソールで見ると、e1はすべて同じ「開く」ボタンを指していますが、offsetなどの座標からすると、「開く」「閉じる」の位置を指しているようです。
HTML
1<!DOCTYPE html> 2<html> 3<head> 4<meta charset="UTF-8"> 5<title>クリックイベントの入れ子</title> 6<script src="https://code.jquery.com/jquery-1.11.3.min.js"></script> 7</head> 8<body> 9<div> 10<button id="btn_1">開く</button> 11</div> 12 13 14<div id="2" style="display:none;"> 15<button id="btn_2">保存</button> 16</div> 17</body> 18</html>
javascript
1$(function(){ 2 var i = 0; 3 //開く 4 $('#btn_1').on('click',function(e1){ 5 $('#2').css('display', 'block'); 6 console.log(e1); 7 //閉じる 8 $('#btn_2').on('click', function(e2){ 9 alert(i); 10 console.log(e1); //1回目:btn_1 / 2回目:btn_1 btn_1 offsetが異なる 11 $('#2').css('display', 'none'); 12 i++; 13 }); 14 }); 15});
2.unbindする場合どこに入れるのか
前回のコメントでunbindしてはどうかというご提案をいただきました。
しかし、unbindした場合、以降のイベントが発生しなくなってしまいますので、開く→閉じるを繰り返すことができません。
unbindする場合、どこで行うのがいいのでしょうか。
3.パラメータを引き回す場合、どのように実装するのがいいのか
もともと入れ子にしてしまった理由は、処理完了時に元の要素を処理するため、クリックイベントの発火元の要素を引き回したいためでした。
イベント間でパラメータを引き渡す方法がわからなかったため入れ子にしてみましたが、正常に動作せず、もとの要素を文字列としてモーダルウィンドウのHTMLに書き込み、保存処理で文字列を解析するという方法を取りました。
連続していないイベント間で何らかのパラメータを引き渡す場合、どのように実装するのがいいでしょうか。
今後の参考のため、ご教示いただければと思います。

回答5件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/10/28 00:19
2015/10/28 00:21