1

何時間も費やしても、これを理解することはできません。動的に作成された単純なページ (コントローラーを使用して読み込まれる vbhtml) があり、2 つのテキスト ボックスがあります。

ページに保存ボタンがあります。このボタンは、ページ内 Javascript 関数を呼び出します。関数には、次の行があります。

function saveData()
{
var lDescr = $('#FundNote').val();  // FundNote is the id of a textbox
var DocUrl = $('#DocUrl').val();  // DocUrl is the id of another textbox
alert(lDescr);
alert(DocUrl);
  //ajax call to a controller
}

問題は、このページが表示されるたびに、これらの変数が最初に入力した値と同じ値を返し続けることです。ブラウザーのキャッシュを消去すると、新しく入力した値が返されますが、ブラウザーのキャッシュが再度消去されるまで同じ値が返され続けます。このページが表示されるたびに、テキスト ボックスは空でユーザーが値を入力するため、ページ自体が値を保持していません。

ポインタはありますか?

アップデート

数日かけて、こうやって直しました(仮)。

コントローラーが更新された html を送信していて、ブラウザーに問題なく表示されているように見えます (html には、さまざまな値が動的に入力されるドロップダウン ボックスが含まれています。値は常に異なりますが、javascript では古い値が返されます (たとえば、選択オプションの古い値、その値は現在の html のレンダリングにさえ含まれていませんでした。なぜこれが起こっているのかまだわかりません。ソリューションには他の同様のページがあり、それらは正常に動作します。)

とにかく、私がしたことは(今のところ動作させるために)、このhtmlを(コントローラーとvbhtmlファイルを介して)動的に作成するクラスにRandonNo()プロパティを追加しました。次に、vbhtml で、この乱数をすべての html コンポーネント ID に追加しました。また、このように同じ番号を javascriptSave()関数に渡しましたOnClick="Save('@Model.RandonNo')。Save メソッドで、次に を変更しまし$('#idOption') to $('#idOption-'+ randomno)た。IDが毎回違うのでうまくいっているようです。

4

5 に答える 5

2

これは古い質問であることは知っていますが、jQuery はまだこれを行っているため、解決策が必要だと感じました。私は非常によく似た問題を抱えていましたが、最終的に回避策を見つけることができました。問題は .val( ) にあるようです。何らかの理由で、jQuery は、入力の取得/設定に使用されるときに、キャッシュから入力を自動的に埋めたいと考えています。私の状況では、次のようなことをしていました。

HTML ファイル:

<form ...>
    <input type="hidden" name="my_value" value="X" />
</form>

JS ファイル:

$( document ).ajaxSuccess( function ( event, jqxhr, settings, data ) {
    if ( settings.dataType == 'json' && data && data.my_value ) {
        $( 'input[name="my_value"]' ).val( data.my_value );
    }
} );

キャッシュをクリアせずにページを更新すると、サーバー応答の値が既に入力されている場合でも、最初のページ要求で AJAX 要求からキャッシュされた値で入力が自動的に上書きされます。この問題を解決するために、.val( ... ) を .attr( 'value', ... ) に変更したので、次の行:

$( 'input[name="my_value"]' ).val( data.my_value );

なりました

$( 'input[name="my_value"]' ).attr( 'value', data.my_value );

したがって、問題を解決するためにここで行う必要があるのは、単に変更することだと思います。

var lDescr = $('#FundNote').val();  // FundNote is the id of a textbox
var DocUrl = $('#DocUrl').val();  // DocUrl is the id of another textbox

var lDescr = $('#FundNote').attr( 'value' );  // FundNote is the id of a textbox
var DocUrl = $('#DocUrl').attr( 'value' );  // DocUrl is the id of another textbox

これが jQuery 自体なのか、それともプラグインなのかはわかりませんが、本当に奇妙です。任意の時点で .val( ) を使用して入力との間で値を取得/設定すると、後でページを更新または再度アクセスすると、入力の値がキャッシュされた値で破損するようです。 . この破損は .val( ) が呼び出されたときではなく、ドキュメントが読み込まれたときに発生するようです。

要約すると、入力での get/set に対する .val( ) の呼び出しにより、最初のページ要求時に返された値/設定された値がキャッシュされます。将来のリクエストでは、ブラウザのキャッシュをクリアするまで、最初のリクエスト中に返された値または設定された値で、ドキュメントの読み込み後に入力の値が破損します。

于 2014-08-10T05:03:54.677 に答える
1

ブラウザがフォームの入力値をキャッシュする場合があるため、ページに戻ったときに再入力する必要はありません。無効にするには、 を設定し<form ... autocomplete="off">ます。これにより、ユーザーがページの読み込み時に最後に入力したフォームの再読み込みがブロックされます。

これはあなたの懸念ではないように思えますが、むしろあなたの懸念は、入力内のテキストが から返されるものではないこと.val()です。その場合は、いくつかのコードを示して、掘り下げてみましょう。

于 2012-05-29T19:34:18.940 に答える
0

値(.val())をキャッシュせず、jQueryオブジェクトをキャッシュします。

function saveData() {
var lDescr = $('#FundNote');  // FundNote is the id of a textbox
var DocUrl = $('#DocUrl');  // DocUrl is the id of another textbox
    alert( lDescr.val() );
    alert( DocUrl.val() );
  //ajax call to a controller
}

于 2012-05-30T22:33:23.097 に答える
0

私は同じ問題を抱えていました.いくつかの試みの後、私のために働く代替案を発見しました...

$("#id").valueOf().valueOf().valueOf().val();

「奇妙な」解決策に見えるかもしれませんが、うまくいきます!

于 2015-12-30T19:34:59.970 に答える