バックグラウンド
グリッド付きのasp.netWebフォームがあり、ユーザーがそのグリッド内のテキストボックスを更新すると、onchangeイベントがWebMethod呼び出しを開始し、変更された行の残りを更新します。その時点では何も保存されていません。UIを更新しているだけです。
変更をコミットするには、[保存]ボタンをクリックします。
これは、ほとんどすべてのシナリオで実際に確実に機能します。しかし、私が解決できるはずだと感じている非常に永続的なものが1つありますが、それは専門家を呼ぶ時です。
問題のシナリオ
jQueryを使用してEnterキーをキャプチャしていますが、残念ながらそのイベントが最初に発生し、コールバックが完了する前にページが送信されます。行が正しく更新されていません。古くて当惑するようなデータが保存されます。
アップデート
行を変更せずに保存できるため、入力動作をコールバックに依存させることはできないと思います。その場合、行を変更しなければ、保存されることはありません。
さて、JavaScriptの内部リストを調べたり、自分で作成してなんらかの方法で管理したりする方法があれば、それはうまくいくでしょう。しかし、それは簡単なはずの何かのためのいくつかの重労働です。ですから、専門家が私に他のことを言わない限り、私はそれが間違っていると思い込まなければなりません。
試み
現在、組み込みのjQueryイベントを使用しており、この手の込んだsetTimeoutを使用して、保存が試行されたという事実を維持し、WebMethodが少なくとも呼び出されるのに十分な時間一時停止し、コールバックに依存して送信を行います。 。しかし、javascriptの非同期は私が期待したようには機能せず、onchangeイベントはそのコードのチャンクが完了するまで発生しません。それは驚くべきことでした。
自分の小さなオブジェクトを使用して、これらのイベントを正しい順序でキューに入れ、それをトリガーする賢い方法を見つけることができると考えていました。
これはすべて間違った方向のようです。確かにこれは非常識なやり過ぎです。これは一般的な問題であり、JavaScriptで24時間年中無休で作業していないため、簡単な解決策を見落としています。
右?
コード
これが私が今すぐ得たものです。これは明らかに機能しません-私はjqueryの非同期性を利用しようとしていましたが、行のonchangeイベントイベントが発生する前に、これらすべてを終了する必要があるようです。
$(document).bind("keypress", function (e) {
if (e.keyCode == 13) {
handleEnter();
return false; //apparently I should be using e.preventDefault() here.
}
});
function handleEnter() {
setTimeout(function () {
if (recalculatingRow) { //recalculatingRow is a bit managed by the onchange code.
alert('recalculating...');
return true; //recur
}
//$('input[id$="ButtonSave"]').click();
alert('no longer recalculating. click!');
return false;
}, 1000);
}
そして、典型的な行は次のようになります。これをバインドするためにjqueryを使用していないことに注意してください:
<input name="ctl00$MainContent$GridOrderItems$ctl02$TextOrderItemDose" type="text" value="200.00" maxlength="7" id="ctl00_MainContent_GridOrderItems_ctl02_TextOrderItemDose" onchange="recalculateOrderItemRow(this);" style="width:50px;" />
recalculateOrderItemRowのコードを投稿することもできますが、これは非常に長く、現在の問題は、キーが押された後のイベントが終了するまで起動しないことです。
更新の必要性ニック・フィッツジェラルド によると(そして人はクールな記事です)、setTimeoutを使用するとこれが非同期になるはずです。setTimeoutとjQueryの間の相互作用、および通常のjavascriptイベントとjQueryイベントの間の相互作用をさらに掘り下げます。