2017-02-13 7 views
0

私は動的に追加された入力フィールドで、小数点(Numpadドット)をキーボードポイント/フルストップ(キーボードドット)に置き換えるjQueryコードを持っています。入力フィールドと値を1つずつ追加するとうまくいきます。たとえば、入力フィールドが1つ追加され、値が入力された後、カーソル位置が変更され(矢印、クリック)、小数点が入力されます。私は複数の入力フィールドを作成するたび複数のトリガーを防止するために、私の代表団をどのように変更する必要がありますか?

問題

しかし、コードは値文字列の最後に複数のドットを入力環境を開始し、試してみて、ドットを追加した値で(手動で)それらを移入し、 /小数点がそれぞれに入ります。

私が委任している方法のせいでこの問題が起こっていると思いますが、それが本当に原因であるかどうかは不明ですし、そうであれば、変更する方法は常にユーザーと同じくらい多くなりますタイプ(通常、カーソルの1つ)。

委任が問題でない場合は、どのようにこれにアプローチし、変更する必要がありますか? string replace()はオプションではありません。私はfocuschangeの交換

  • を試してみた、そしてそれはまだ少し良い(最終的には以下の点)であった$(this).keydown(function(e)$('input').keydown(function(e)を、交換
  • 同じ ように振る舞っ

    物事しかし、それでも最後に追加のドットが作成されました

以下のスニペットはエラーをスローしますr(結果の一部を隠しています)が、エラーの内容は不明です。より良い表示のために、オリジナルjsFiddleをご覧ください。

$('div').on('click', '#remove', removeMe()); 
 
$('body').on('change', 'input', function(e) { 
 
    $('input').keydown(function(e) { 
 
     var keyChar = e.keyCode; 
 
     if(keyChar==110) { // if it's a decimal point 
 
      e.preventDefault(); 
 
      var place = $(this)[0].selectionStart; // cursor position 
 
      var newVal = $(this).val().toString().split(""); // converting input to string, then to array 
 
      newVal.splice(place,0,"."); // inserting ".", instead of decimal point 
 
      newVal = newVal.join(""); // converting it back to a string 
 
      $(this).val(newVal); // setting it as the value - stays a string 
 
     } 
 
     /* keyCode info */ 
 
     $('p').append(keyChar+" "); 
 
     /* */ 
 
    }); 
 
}); 
 

 
$('#add').click(function() { 
 
    var parent = $(this).parent(); 
 
    var newInput = $('<input type="text" class="test">'); 
 
    parent.append(newInput); 
 
}); 
 

 
function removeMe() { 
 
    $('#remove').on('click', function() { 
 
    var parentDiv = $(this).parent(); 
 
    parentDiv.children().remove('input:last-child'); 
 
    $('p').empty(); 
 
    }); 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 
 
<div> 
 
    <button id="add">add</button> 
 
    <button id="remove">remove</button> 
 
    <p></p> 
 
</div>

答えて

1

var newVal = $(this).val().toString().split(""); 

あなたはこのようにそれを行うことができます:Fiddle

$('body').on('keydown', 'input', function(e) { 
    var keyChar = e.keyCode; 
    if(keyChar==110) { 
    e.preventDefault(); 

    var start = this.selectionStart; 
    var end = this.selectionEnd; 
    var val = $(this).val(); 
    var newVal = val.slice(0, start) + "." + val.slice(end); 

    $(this).val(newVal); 
    } 
}); 
+0

私は単にそれを追加することはできません、カーソルの位置は重要です。ユーザーが35を入力し、その後、クリックしたり、矢印を使用して3〜5の間に位置したり、ドットを入力したりするとどうなりますか?そのため、値を文字列に変換してから配列に変換し、次にドットでarray.splice()を実行してから、すべてを文字列に結合する必要があります。おそらくもっと良い方法がありますが、私はそれを見ていません。 : – FiddlingAway

+0

ああ、そうです、私はコードを編集しました – Janar

+0

これはうまくいくようですが、私はこれについて 'array.slice()'を使うことについても考えていませんでした。私のコードで。時間を割いてくれてありがとう。 – FiddlingAway

0

置き換え

var newVal = $(this).val().toString().split("."); 
+0

ええと、それは私が必要とする分割を実行しません。ドットは最初の実行には存在しないからです。私はそれを試して、入力値の最後にドットを追加しますが、元のコードと同じように、入力時にカーソルを置くべきです。 – FiddlingAway

関連する問題