Javascript(jQueryが最適)イベントを何らかの形でフォーム入力値を「変更」するようにバインドすることは可能ですか?
.change()
メソッドについては知っていますが、ユーザー(カーソル)が入力フィールドを離れるまでトリガーされません。 .keyup()
メソッドの使用も検討しましたが、矢印キーなどにも反応します。
私はただアクションをトリガーする必要があります毎回入力のテキストは、それがたった1文字の変更であっても変わります。
HTML5 input
イベントという簡単な解決策があります。 <input type="text">
要素のすべての主要ブラウザの現在のバージョンでサポートされており、IE <9の簡単な回避策があります。詳細については、以下の回答を参照してください。
例(IE <9:回避策については上記のリンクを参照)を除く):
$("#your_id").on("input", function() {
alert("Change to " + this.value);
});
はい、変更前の値と比較します。
var previousValue = $("#Elm").val();
$("#Elm").keyup(function(e) {
var currentValue = $(this).val();
if(currentValue != previousValue) {
previousValue = currentValue;
alert("Value changed!");
}
});
別のオプションは、特定のキーでのみ変更された機能をトリガーすることです。つかいます e.KeyCode
どのキーが押されたかを把握します。
function checkChange($this){
var value = $this.val();
var sv=$this.data("stored");
if(value!=sv)
$this.trigger("simpleChange");
}
$(document).ready(function(){
$(this).data("stored",$(this).val());
$("input").bind("keyup",function(e){
checkChange($(this));
});
$("input").bind("simpleChange",function(e){
alert("the value is chaneged");
});
});
ここにフィドルがあります http://jsfiddle.net/Q9PqT/1/
データ属性に初期値を保存し、現在の値でテストすることもできます。
<input type="text" name="somename" id="id_someid" value="" data-initial="your initial value" />
$("#id_someid").keyup(function() {
return $(this).val() == $(this).data().initial;
});
初期値が変更されていない場合、trueを返します。
JQueryでデータの使用を使用し、すべてのイベントをキャッチして、最後の値(テストされていない)に対してテストできます。
_$(document).ready(function() {
$("#fieldId").bind("keyup keydown keypress change blur", function() {
if ($(this).val() != jQuery.data(this, "lastvalue") {
alert("changed");
}
jQuery.data(this, "lastvalue", $(this).val());
});
});
_
これは、アイテムの長いリストに対してもかなりうまく機能します。 _jQuery.data
_を使用すると、値を追跡するためにJavaScript変数を作成する必要がなくなります。 $("#fieldId1, #fieldId2, #fieldId3, #fieldId14, etc")
を実行して、多くのフィールドを追跡できます。
更新:blur
リストにbind
を追加しました。
キーとマウスのイベントの組み合わせでイベントを設定し、確認するためにonblurも設定できます。その場合、入力の値を保存します。次の呼び出しで、現在の値と最後に保存された値を比較します。それが実際に変更された場合にのみ、あなたの魔法を行います。
多かれ少なかれクリーンな方法でこれを行うには:
データをDOM要素に関連付けることができます(api.jquery.com/jQuery.dataを参照)。したがって、フォーム内のすべての要素に割り当てられるイベントハンドラーの汎用セットを作成できます。各イベントは、トリガーされた要素を1つの汎用関数に渡すことができます。その1つの関数は、要素のデータに古い値を追加できます。そうすれば、フォーム全体および今後作成するすべてのフォームで機能する汎用コードとしてこれを実装できるはずです。 :)そして、おそらく20行程度のコードしかかからないでしょう。
例はこのフィドルにあります: http://jsfiddle.net/zeEwX/
現場に物を貼り付けるスキャナーにこの種のコードを使わなければなりませんでした
$(document).ready(function() {
var tId,oldVal;
$("#fieldId").focus(function() {
oldVal = $("#fieldId").val();
tId=setInterval(function() {
var newVal = $("#fieldId").val();
if (oldVal!=newVal) oldVal=newVal;
someaction() },100);
});
$("#fieldId").blur(function(){ clearInterval(tId)});
});
未検証...
「単純な」解決策があるとは思わない。マウスで変更が行われたときにもキャッチできるように、おそらくイベントonKeyUpとonChangeの両方を使用する必要があります。コードが呼び出されるたびに、フィールドに直接アタッチされたthis.seenValueに「見た」値を保存できます。これにより、少し簡単になります。
ユーザーはOSメニューに移動し、マウスを使用して貼り付けを選択できるため、これをトリガーする安全なイベントはありません。常に機能することがわかった唯一の方法は、入力値が変更されたかどうかを確認するsetIntervalを設定することです。
var inp = $('#input'),
val = saved = inp.val(),
tid = setInterval(function() {
val = inp.val();
if ( saved != val ) {
console.log('#input has changed');
saved = val;
},50);
JQueryの特別なイベントを使用してこれを設定することもできます。