我知道Web表单定义的行为是不提交禁用的字段......但这不是我想要的定义。我想使用ajax发布表单,我想让它获取所有字段,即使它们被禁用。我不想构建一个解决方法,我将该字段设置为“看起来已禁用”...或者必须在我启用字段的地方进行破解 - >发布 - >禁用。
是否有可能让ajaxSubmit()或serialize()抓住禁用的字段,因为它正在移动DOM并获取值?或者是否有另一个序列化插件可以做到这一点?或者有人有一个我可以使用其中一个插件来使其工作的模式吗?
还是我注定要破解它?
答案 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)
您可以禁用输入和输入在提交表单之前,您可以重新启用它们,以便在发布到服务器端时表单将包含它们