この投稿は前回の続きになります。
【jQuery】labelの中の文字列だけを変更したい
【jQuery】引数にthisを渡せない
今回以下のようなコードを書いて、「緑のボックスをクリックすると、ピンクのボックスの文字が変わり、またラベルの中のテキストノードだけを変更する」処理を実装していました。
HTML
1<!DOCTYPE html> 2<html> 3 4<head> 5 <meta charset="UTF-8"> 6 <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script> 7 <style> 8 .aaa { 9 width: 150px; 10 height: 50px; 11 background-color: #EFE; 12 border: solid 1px #CCC; 13 position: absolute; 14 } 15 16 .ddd { 17 width: 150px; 18 height: 50px; 19 background-color: pink; 20 border: solid 1px pink; 21 position: absolute; 22 } 23 </style> 24</head> 25 26<body> 27 <label class="aaa"> 28 <span class="bbb"></span> 29 <input type="hidden" class="ccc">りんご 30 </label> 31 <br> 32 <br> 33 <br> 34 <label class="aaa"> 35 <span class="bbb"></span> 36 <input type="hidden" class="ccc">いちご 37 </label> 38 <br> 39 <br> 40 <br> 41 <label class="aaa"> 42 <span class="bbb"></span> 43 <input type="hidden" class="ccc">ぶどう 44 </label> 45 <br> 46 <br> 47 <br> 48 <label class="ddd"> 49 <span class="bbb"></span> 50 <input type="hidden" class="ccc">りんご 51 </label> 52 <script> 53 $(function() { 54 $(".aaa").on("click", function() { 55 //labelの中の文字列だけを変更する処理。 56 //直接書いたコード 57 // var txt = $(this).text(); 58 // $(".ddd").contents().filter(function(){ return this.nodeType === this.TEXT_NODE }).remove(); 59 // $(".ddd").append(txt); 60 test(this); 61 }); 62 }); 63 64 //関数に切り出すとおかしくなる 65 function test(_this){ 66 var txt = $(_this).text(); 67 $(".ddd").contents().filter(function(){ return _this.nodeType === _this.TEXT_NODE }).remove(); //文字がどんどん追加される。removeできていない。 68 // $(".ddd").contents().filter(function(i,e){ return e.nodeType === e.TEXT_NODE }).remove(); //できる。 69 // $(".ddd").contents().filter(function(e){ return e.nodeType === e.TEXT_NODE }).remove(); // 「i」をなくすと、spanタグやinputタグも消えてしまう 70 // $(".ddd").contents().filter(function(e){ return e.nodeType === Node.TEXT_NODE }).remove(); // 「i」をなくし、Node.TEXT_NODEにすると、文字がどんどん追加される。removeできていない。 71 72 $(".ddd").append(txt); 73 } 74 </script> 75</body> 76 77</html> 78
ただ「直接書いたコード」だと何ら問題ないのですが、「this」を引数に渡すといろいろと処理が変わっていしまいます。
そこでいくつか質問があります。
1つ目
そもそも関数の引数に「this」を渡したい時
直接書いたコードのまま関数に切り出せる場合と切り出せない場合の違いはどのようなときか?
「切り出せない場合」とは、「直接書いたコードを一部変更しなくてはいけない」場合のことです。
今回の場合は、thisをそのまま使うやり方はダメで、function(i,e)のようにしてeオブジェクトを使わなければいけない理由は何でしょうか?
2つ目
function(i,e)の「i」を消すと、spanタグやinputタグも消えてしまうのはなぜでしょうか?
「i」について調べて、i番目などを指すときに使うものだと思っています。
またこのコードで「i」を使っていないのに影響していることが不思議です。
3つ目
function(i,e)の「i」を消し、「=== e.TEXT_NODE })」のときと「=== Node.TEXT_NODE })」のときで処理の内容が変わるのはなぜでしょうか?
「=== e.TEXT_NODE })」のとき
・spanタグやinputタグも消えてしまう
「=== Node.TEXT_NODE })」のとき
・removeされず、文字がどんどんappendされてしまう
このどれかだけでもいいので質問に答えていただけると助かります。

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/03/25 07:02