残念ながら、form.reset()関数はフォームの非表示の入力をリセットしません。FF3とChromiumにチェックインしました。
隠しフィールドのリセットを行う方法を知っている人はいますか?
残念ながら、form.reset()関数はフォームの非表示の入力をリセットしません。FF3とChromiumにチェックインしました。
隠しフィールドのリセットを行う方法を知っている人はいますか?
それを行う最も簡単な方法は、表示することです。非表示フィールドの代わりにテキストフィールドはありません。この場合、デフォルトのリセットプロセスが定期的に行われます。
残念ながら、これは標準に従って正しいです。悪いスペックはIMOを疣贅します。defaultValue
それにもかかわらず、IEは隠しフィールドにリセット可能なものを提供します。この議論を参照してください:HTML5では(alas)変更されることはありません。
(幸いなことに、フォームをリセットする必要はほとんどありません。UI機能として、一般的に眉をひそめています。)
属性の元の値をまったく取得できないため、value
別の属性に複製してフェッチする必要があります。例えば。:
<form id="f">
<input type="hidden" name="foo" value="bar" class="value=bar"/>
function resetForm() {
var f= document.getElementById('f');
f.reset();
f.elements.foo.value= Element_getClassValue(f.elements.foo, 'value');
}
function Element_getClassValue(el, classname) {
var prefix= classname+'=';
var classes= el.className.split(/\s+/);
for (var i= classes.length; i-->0;)
if (classes[i].substring(0, prefix.length)===prefix)
return classes[i].substring(prefix.length);
return '';
}
その値を密輸する別の方法には、HTML5 data
、のような別の予備属性、値を読み取るtitle
直後の追加JS情報、またはデフォルト値を保持するための追加の非表示フィールドが含まれる場合があります。<!-- comment -->
どのアプローチでも、HTMLを乱雑にする必要があります。一部のブラウザは、コードが実行されるまでに(リロードまたは戻るボタンを押して)記憶された値でフィールドの値をすでにオーバーライドしているため、ドキュメントの準備時にスクリプトで作成することはできません。
別の答えは、誰かがここに来て探しに来た場合に備えて。ページが読み込まれた後にフォームをシリアル化し、それらの値を使用して後で非表示フィールドをリセットします。
var serializedForm = $('#myForm').serialize();
次に、フォームをリセットするには:
function fullReset(){
$('#myForm').reset(); // resets everything except hidden fields
var formFields = decodeURIComponent(serializedForm).split('&'); //split up the serialized form into variable pairs
//put it into an associative array
var splitFields = new Array();
for(i in formFields){
vals= formFields[i].split('=');
splitFields[vals[0]] = vals[1];
}
$('#myForm').find('input[type=hidden]').each(function(){
this.value = splitFields[this.name];
});
}
ドキュメントの読み込み時にデフォルト値を設定してから、リセットをトラップして、非表示の子犬を元の値にリセットする方が簡単であることがわかりました。例えば、
//fix form reset (hidden fields don't get reset - this will fix that pain in the arse issue)
$( document ).ready(function() {
$("#myForm").find("input:hidden").each(function() {
$(this).data("myDefaultValue", $(this).val());
});
$("#myForm").off("reset.myarse");
$("#myForm").on("reset.myarse", function() {
var myDefaultValue = $(this).data("myDefaultValue");
if (myDefaultValue != null) {
$(this).val(myDefaultValue);
}
});
}
これが誰かを助けることを願っています:)
jQueryを使用できます-これにより、非表示フィールドが空になります:
$('form').on('reset', function() {
$("input[type='hidden']", $(this)).val('');
});
ヒント:csrfトークンフィールドや、空にすべきではないその他のものをリセットしていないことを確認してください。必要に応じて、要素の仕様を絞り込むことができます。
フィールドをデフォルト値にリセットする場合は、次を使用できます(テストされていません)。
$('form').on('reset', function() {
$("input[type='hidden']", $(this)).each(function() {
var $t = $(this);
$t.val($t.data('defaultvalue'));
});
});
デフォルト値をプロパティに保存しますdata-defaultvalue="Something"
。
$('#form :reset').on('click',function(e)({
e.preventDefault();
e.stopImmediatePropagation();
$("#form input:hidden,#form :text,#form textarea").val('');
});
select、checkbox、radioの場合、デフォルト値を知って(保持して)、そのイベントハンドラーでデフォルト値に設定することをお勧めします。
ボタンを作成しonClick
、フィールドをクリアするイベントにJavaScriptを追加します。
そうは言っても、なぜこれらのフィールドをリセットしたいのか興味があります。通常、それらには内部データが含まれています。コードでそれらをクリアすると、フォームの投稿は失敗します(たとえば、ユーザーが新しいデータを入力してフォームを送信しようとした後)。
[編集]あなたの質問を誤解しました。誰かが非表示フィールドの値を改ざんする可能性があることを心配している場合は、それらをリセットする方法はありません。たとえば、フォームを呼び出すことはできますreset()
が、フォームのフィールドを呼び出すことはできません。
値をJavaScriptファイルに保存し、それを使用して値をリセットできると考えることができますが、ユーザーが非表示のフィールドを改ざんできる場合は、JavaScriptも改ざんできます。
したがって、セキュリティの観点から、非表示のフィールドをリセットする必要がある場合は、そもそもそれらを避けて、サーバー上のセッションに情報を保存してください。
これは行います:
$("#form input:hidden").val('').trigger('change');
以下の行を使用して非表示の入力フィールド値をリセットできます。必要なのは、の代わりにフォームIDを変更することだけですfrmForm
。
$("#frmForm input:hidden").val(' ');