提交禁用字段

时间:2009-08-16 14:46:27

标签: jquery html webforms

我知道Web表单定义的行为是不提交禁用的字段......但这不是我想要的定义。我想使用ajax发布表单,我想让它获取所有字段,即使它们被禁用。我不想构建一个解决方法,我将该字段设置为“看起来已禁用”...或者必须在我启用字段的地方进行破解 - >发布 - >禁用。

是否有可能让ajaxSubmit()或serialize()抓住禁用的字段,因为它正在移动DOM并获取值?或者是否有另一个序列化插件可以做到这一点?或者有人有一个我可以使用其中一个插件来使其工作的模式吗?

还是我注定要破解它?

8 个答案:

答案 0 :(得分:37)

您可以设置字段readonly,这将禁止更改控件的值。

编辑:您可以轻松编写“ serializeDisabled ”函数,迭代已禁用的具有name属性并使用jQuery.param函数的表单元素最后,生成序列化字符串:

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

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

答案 1 :(得分:19)

为什么不使用.removeAttr().submit()在提交之前简单地启用所有已停用的输入字段。

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

答案 2 :(得分:5)

好吧......也许我没有明确地问我的问题......但我想要的答案就在这里:

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

我在我的问题中提到了ajaxSubmit(),它来自jQuery Form插件......在该插件中有一个名为fieldValue()的方法,它接受一个名为“success”的参数。如果传入“true”,则插件仅返回W3C定义为“成功”控件(不包括禁用控件)的内容。但如果将其设置为false,则无论W3C定义如何,它都将获得所有值。

我知道这是可能的,因为整个提交都是由插件控制的,与HTML标准/定义无关......我只是想看看这个选项是否已经在这个插件中可用 - in或其他插件。它在此插件中可用,但默认行为是像标准HTML提交一样

答案 3 :(得分:3)

// 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);

答案 4 :(得分:2)

第一:我真的很喜欢CMS的答案。更简单。但万一这不是最好的选择...

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

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

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

如果该值被禁用,因为它类似于“总计”字段,该字段通过基于其他非禁用字段的js进行更新,我将使用CMS将其设置为只读。


根据您对CMS的回复:

我只能想象一些情况,其中选择框将被禁用,但您希望将其传递回脚本。我想到的主要选项是在检查其他选项时启用某些选择框,但您希望表单传回选择框的默认值,而不是让服务器脚本处理填充空白。< / p>

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


$('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添加一个新的隐藏输入,它具有相同的名称和值,具有您的隐藏输入,从而确保您的服务器端脚本可以一般地处理所有输入。

答案 5 :(得分:1)

您还可以使用以下内容在提交前重新启用字段:

$('#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();

答案 6 :(得分:0)

在使用Jquery提交之前立即启用所有禁用的输入字段

   $('form').submit(function(e) {
    $(':disabled').each(function(e) {
        $(this).removeAttr('disabled');
    })
});

答案 7 :(得分:-1)

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