2016-10-18 8 views
0

私は3つの入力と3つのボタンがあります。ボタンをクリックして値を設定したいと思います。最初のセットですべてうまく動作します。次の入力を設定すると、すべての入力の値が変更されます。関数内でonclickが失敗する

どうすれば修正できますか?

$(function() { 
 
    $("input").on("click", function() { 
 
    var here = $(this); 
 
    
 
    $("div").on("click", "button", function() { 
 
     here.val(this.value); 
 
    }); 
 
    }); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<input type="text"> 
 
<input type="text"> 
 
<input type="text"> 
 

 
<div> 
 
    <button value="a">a</button> 
 
    <button value="b">b</button> 
 
    <button value="c">c</button> 
 
</div>

答えて

1

最後にフォーカスを当てたINPUTにButtonの値を配置しますか?

これは...

$(function() { 
 
    var lastFocus; 
 
    $('body').on('focus','input', function() { 
 
    lastFocus = this; 
 
    }); 
 
    $("div").on("click", "button", function() { 
 
    $(lastFocus).val(this.value);  
 
    }); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<input type="text"> 
 
<input type="text"> 
 
<input type="text"> 
 

 
<div> 
 
    <button value="a">a</button> 
 
    <button value="b">b</button> 
 
    <button value="c">c</button> 
 
</div>

1

したい、このですか?あなたが外側の関数を使用していたのはなぜ

$(function() { 
 
    $("input").on("click", function() { 
 
    var here = $(this); 
 
    
 
    $("div").on("click", "button", function() { 
 
     here.val(this.value+here.val()); 
 
    }); 
 
    }); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<input type="text"> 
 
<input type="text"> 
 
<input type="text"> 
 

 
<div> 
 
    <button value="a">a</button> 
 
    <button value="b">b</button> 
 
    <button value="c">c</button> 
 
</div>

+0

あなたがあなたが委任されたイベントの新しいセットを作成し、入力をクリックするたびに役立つかもしれません。例えば。 3つの入力をすべてクリックすると、ボタンをクリックするとイベントが3回実行され、入力をもう一度クリックすると6回などのようになります。それは一種のメモリリークです:) – Keith

1

値を変更する入力に一時クラスを追加できます。あなたはクリック機能内部のない範囲のクリック機能、わずか2クリックし、グローバル変数を使用することができます

$("input").on("click", function() { 
     $("input").removeClass('addToThis'); 
     $(this).addClass('addToThis'); 
    }); 

    $("div").on("click", "button", function() { 
     $(".addToThis").val(this.text()); 
    }); 
+0

私はそれが '$ ".addToThis") '(ドットで始まる)と' this.value'の代わりに '$(this).text()'となります。例: '$("。addToThis ").Val($(this).text()); ' – Titus

+0

はい、あなたは正しいです。編集されました。ありがとう。 – Rishabh

2

...

$(function() { 
var here; 
    $("input").on("click", function() { 
    here = $(this);  
    }); 
    $("div").on("click", "button", function() { 
     here.val(this.value); 
    }); 
}); 
+1

ちょうど頭が上がっています、 'ここでは'グローバル変数ではありません。これは、無名関数にスコープされたローカル変数です。グローバル変数は悪いと知られていますが、ここで行ったことは良いことですが、ローカル変数 'ここ'をキャプチャするクロージャを作成しました。 – Keith

+0

ありがとうございました! –

1

最も簡単な解決策:ちょうど最初のクリックのリスナーから、ここで変数を置く:

$(function() { 
    var here; 
    $("input").on("click", function() { 
    here = $(this); 
    $("div").on("click", "button", function() { 
     here.val(this.value); 
    }); 
    }); 
}); 
+0

https://plnkr.co/edit/ySomgAogMQQyc4DUgB2S?p=preview –

+0

入力をクリックするたびに小さな警告が表示され、委任されたイベントの新しいセットが作成されます。例として、ボタンの中にconsole.log()を配置しますクリックして、いくつかの入力をクリックして、あなたの出来事を築き上げてください。また、plnkr/codepenの代わりにスニペットを見てください。 – Keith

関連する問題