代码之家  ›  专栏  ›  技术社区  ›  Nicholas Franceschina rob2universe

提交禁用的字段

  •  31
  • Nicholas Franceschina rob2universe  · 技术社区  · 15 年前

    我知道Web表单的定义行为是不提交禁用的字段…但这不是我想要的定义。我希望使用Ajax发布表单,并希望它获取所有字段,即使它们被禁用。我不想建立一个工作区,在那里我让这个领域“看起来被禁用”…或者必须在启用字段的位置对其进行黑客攻击->post->disable。

    是否可以使AjaxSubmit()或Serialize()在移动通过DOM和获取值时获取禁用的字段?还是有其他的序列化插件可以做到这一点?或者有人有一个我可以对这些插件中的一个进行修改以使其工作吗?

    还是我注定要砍它?

    7 回复  |  直到 8 年前
        1
  •  34
  •   Christian C. Salvadó    15 年前

    你可以做你的田地 readonly ,这将不允许更改控件的值。

    编辑: 你可以很容易地写一个 已禁用序列化 “函数,循环访问具有name属性的禁用表单元素,并使用 jQuery.param 函数的结尾,以生成序列化字符串:

    (function ($) {
      $.fn.serializeDisabled = function () {
        var obj = {};
    
        $(':disabled[name]', this).each(function () { 
            obj[this.name] = $(this).val(); 
        });
        return $.param(obj);
      }
    })(jQuery);
    
        2
  •  18
  •   Ketan    8 年前

    为什么不在提交之前使用 .removeAttr() .submit() .

    $('#my_form').submit(function(){
        $("#my_form :disabled").removeAttr('disabled');
    });
    
        3
  •  5
  •   Nicholas Franceschina rob2universe    15 年前

    好啊。。。也许我问得不够清楚…但我要找的答案是:

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

    我在我的问题中提到了ajaxsubmit(),它来自jquery表单插件…插件内部有一个名为fieldValue()的方法,它接受一个名为“successful”的参数。如果传入“true”,则插件只返回W3C定义的“successful”控件(不包括禁用的控件)。但是,如果您将其设置为false,那么它将获取所有值,而不考虑W3C定义。

    我知道这是可能的,因为整个提交都由插件控制,与HTML标准/定义无关…我只是想看看这个插件或其他插件中是否已经有了这个选项。虽然默认行为类似于标准的HTML提交,但它在该插件中可用。

        4
  •  3
  •   user263204    14 年前

    //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);
    
        5
  •  2
  •   Anthony    15 年前

    第一:我很喜欢CMS的回答。简单得多。但如果不是最好的选择…

    为什么不将jquery函数绑定到表单的 onsubmit 遍历窗体并获取所有输入的事件 <input> 在表单中并启用它们,然后提交表单?您需要知道输入是否被禁用吗?您是否担心启用输入会以用户关心的方式更改视觉外观?

    在这两种情况下,您都可以向要启用的元素添加一些内容。对于样式,添加一个类,使禁用的输入与启用的输入具有相同的外观。如果您需要知道哪些被禁用,请在名称或值本身添加一些内容以指示状态。

    出于好奇,你什么时候会想要残疾人信息?如果输入总是被禁用(意味着用户没有这样设置),你不知道这个值吗?如果用户将输入设置为禁用,那么您收集这些数据是否有点欺骗性?

    如果这个值被禁用是因为它类似于一个“total”字段,它通过基于其他非禁用字段的JS进行更新,那么我将使用cms使其成为只读的。


    根据您对CMS的回应:

    我只能想象一些场景,其中一个选择框将被禁用,但您希望它返回到脚本。我想到的一个主要问题是,当其他选项被选中时,某些选择框会被启用,但是您宁愿让表单返回选择框的默认值,而不是让服务器脚本处理填充空白的问题。

    如果是这样,为什么不在隐藏输入和选择框之间设置切换?两个输入的值和名称相同,但如果一个被启用,另一个被禁用。这样,脚本只看到这两个输入中的一个,并且由于它们具有相同的名称,所以不会被捕获到数据的来源。


    $('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中,从而确保服务器端脚本可以对所有输入进行常规处理。

        6
  •  1
  •   Doug Kulak    13 年前

    您也可以在提交之前使用以下命令重新启用这些字段:

    $('#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();
    
        7
  •  -1
  •   Rady    11 年前

    您可以在提交表单之前禁用输入,您可以重新启用它们,以便表单在发布到服务器端时包含它们。