web-dev-qa-db-ja.com

無効なフィールドを送信する

Webフォームの定義された動作は無効なフィールドを送信しないことですが、それは私が望む定義ではありません。私はajaxを使用してフォームを投稿し、無効になっている場合でもすべてのフィールドを取得したいと考えています。フィールドを「無効に見える」ようにする回避策を構築したくない...またはフィールドを有効にする場所をハックする必要がある->投稿->無効にする。

ajaxSubmit()またはserialize()がDOMを移動して値を取得するときに無効なフィールドを取得することは可能ですか?またはこれを行うことができる別のシリアル化プラグインがありますか?または誰かが私がこれらのプラグインの1つにそれを機能させるためにできるmodを持っていますか?

それともハックする運命にあるのでしょうか?

32

あなたはあなたのフィールドを作ることができます readonly 、これはあなたのコントロールの値への変更を許可しません。

編集:簡単に「serializeDisabled」関数を記述して、無効化されたフォーム要素を繰り返し処理することができます名前属性で、最後に jQuery.param 関数を使用して、シリアル化された文字列を生成します。

(function ($) {
  $.fn.serializeDisabled = function () {
    var obj = {};

    $(':disabled[name]', this).each(function () { 
        obj[this.name] = $(this).val(); 
    });
    return $.param(obj);
  }
})(jQuery);
37
CMS

送信前に.removeAttr().submit()を使用して、無効になっているすべての入力フィールドを単純に有効にしないでください。

$('#my_form').submit(function(){
    $("#my_form :disabled").removeAttr('disabled');
});
19
Ketan

OK ...たぶん私は十分にはっきりと質問しなかったかもしれません...しかし私が探していた答えはここにあります:

http://docs.jquery.com/Plugins:Forms#.val.28.29_becomes_.fieldValue.28.29

私は質問でajaxSubmit()について言及しましたが、これはjQuery Formプラグインからのものです...そのプラグイン内には、「成功」というパラメーターを受け入れるfieldValue()というメソッドがあります。 「true」を渡した場合、プラグインはW3Cが「成功した」コントロールとして定義したもののみを返します(無効なコントロールは除外されます)。しかし、これをfalseに設定すると、W3Cの定義に関係なく、すべての値が取得されます。

提出全体がプラグインによって制御され、HTML標準/定義とは何の関係もないので、これが可能であると知っていました...このオプションがこのプラグインまたはその他ですでに利用可能かどうかを確認するように求めていましたプラグイン。このプラグインで使用できますが、デフォルトの動作は標準のHTML送信のように動作します

5

// jQuery( '#container:input')。serializeAll()

(function($j) {
  $j.fn.serializeDisabled=function(){
    var obj={};
    $j(this).filter(':input:disabled').each(function(index,domElem){
      var $this=$j(domElem);
      obj[domElem.name]=$this.val(); 
    });
    return $j.param(obj);
  };

  $j.fn.serializeAll=function(){
    $this=$j(this);
    return $this.filter(':input:enabled').serialize()+'&'+$this.serializeDisabled();
  };
})(jQuery);
3
user263204

まず、私はCMSの答えが本当に好きです。はるかに簡単です。しかし、それが最善の選択肢ではない場合には...

フォームのonsubmitイベントに関連付けられたJQuery関数を使用して、フォームを走査し、フォーム内のすべての<input>sの入力を取得して有効にし、フォームを送信しないのはなぜですか。入力が無効になっているかどうかを知る必要がありますか?入力を有効にすると、ユーザーに関係する方法で視覚的な外観が変わることを心配していますか?

どちらの場合も、有効にする要素に何かを追加できます。スタイリングのために、無効な入力に有効な入力と同じ外観を与えるクラスを追加します。無効になったものを知る必要がある場合は、名前または値自体に何かを追加して、ステータスを示します。

好奇心から、無効になった情報が必要になるのはいつですか?入力が常に無効になっている(つまり、ユーザーがそのように設定していないことを意味する)場合は、値がわかりませんか?そして、入力がユーザーによって無効に設定されている場合、そのデータを収集するのは少し欺瞞的ではありませんか?

他の無効化されていないフィールドに基づいてjsを介して更新される「合計」フィールドのような値のために値が無効化されている場合は、代わりにCMSを使用して読み取り専用にします。


CMSへの応答に基づいて:

選択ボックスが無効になるシナリオをいくつか想像できますが、それをスクリプトに戻したい場合があります。私の頭に浮かぶのは、他のオプションをオンにすると特定の選択ボックスが有効になるということですが、サーバースクリプトで空白の入力を処理するのではなく、フォームに選択ボックスのデフォルトを渡してもらいたいと思います。

その場合は、非表示の入力と選択ボックスの切り替えを設定してみませんか?値と名前は両方の入力で同じにしますが、一方を有効にすると、もう一方は無効になります。このように、スクリプトは2つの入力のうちの1つのみを認識し、それらは同じ名前を持っているので、データがどこから来たのかを把握できません。


$('form').submit(function() {
    $('[disabled]').each(function(i) {
        d_name = $(this).attr("name");
        d_val = $(this).val();
        $(this).after(
        '<input type="hidden" name="' + d_name + '" value="' + d_val + ' />'
        );
    });
return true;
});

私があまりにも概念的だと思う場合に備えて、ユーザーの送信時に実行される単純な関数を次に示します。無効化された各要素を通過し、同じ名前と値を持つ新しい非表示入力をDOMに追加する方法に注意してください。これにより、サーバー側スクリプトがすべての入力を包括的に処理できるようになります。

2
Anthony

以下を使用して、送信する前にフィールドを再度有効にすることもできます。

$('#form').submit(function() {
    $('[disabled]').each(function(i) {
        var d_name = $(this).attr("name");
        var d_val = $(this).val();
        $(this).attr("disabled", false);
    });
    return true;
});

$('#form').submit();
1
Doug Kulak