我有一个带有四个输入的简单表格。当我提交表单时,我想使用GET http方法。
例如:
aaa : foo
bbb : ____
ccc : bar
ddd : ____
我想要这个查询字符串:
/?aaa=foo&ccc=bar
问题是我有这个查询字符串:
/?aaa=foo&bbb=&ccc=bar&ddd=
如何从查询字符串中的表单中删除空字段?
感谢。
答案 0 :(得分:13)
您可以使用jQuery的提交功能来验证/更改您的表单:
<form method="get" id="form1">
<input type="text" name="aaa" id="aaa" />
<input type="text" name="bbb" id="bbb" />
<input type="submit" value="Go" />
</form>
<script type="text/javascript">
$(document).ready(function() {
$("#form1").submit(function() {
if($("#bbb").val()=="") {
$("#bbb").remove();
}
});
});
</script>
答案 1 :(得分:5)
我喜欢RaphDG
给出的想法但我稍微修改了一下代码。我只是使用disabled属性而不是删除字段。 这是更改后的代码:
<form method="get" id="form1">
<input type="text" name="aaa" id="aaa" />
<input type="text" name="bbb" id="bbb" />
<input type="submit" value="Go" />
</form>
<script type="text/javascript">
$(document).ready(function() {
$("#form1").submit(function() {
if($("#bbb").val()=="") {
$("#bbb").prop('disabled', true);
}
});
});
</script>
再次感谢RaphDG(y)
这个想法答案 2 :(得分:5)
当前的解决方案依赖于运行Javascript / jQuery的客户端 - 这是无法保证的。另一种选择是使用重写规则。在Apache服务器上,我使用了以下内容来从表单提交中删除空的$ _GET值;
RewriteCond %{REQUEST_URI} \/formpage\/?
RewriteCond %{QUERY_STRING} ^(.*)(&|\?)[a-z-_]+=(?=&|$)(.*)$ [NC]
RewriteRule .* \/formpage?%1%2 [R,L,NE]
......这会改变这个......;
http://www.yoursite.com/formpage?search=staff&year=&firstname=&surname=smith&area=
......进入这个;
快速解释:
RewriteCond %{REQUEST_URI} \/formpage\/?
是一种将正则表达式的范围限制在网站地址的特定子页面的方法(例如http://www.yoursite.com/formpage)。它并非严格要求,但您可能希望仅将表达式应用于表单所在的页面。这是实现这一目标的一种方式。
RewriteCond %{QUERY_STRING} ^(.*)(&|\?)[a-z-_]+=(?=&|$)(.*)$ [NC]
是第二个条件,然后与查询字符串匹配(即从问号中显示(或包括)问号的任何内容,例如?firstname=sam$surname=smith
)。让我们分解一下;
^(.*)
- ^
符号表示这是查询字符串的START,句点.
表示任意字符。星号*
是针对期间通配符的修饰符,表示其中任何数量都应包含在范围内。(&|\?)[a-z-_]+=(?=&|$)
- 这是最有趣的一点(如果你喜欢这种东西......)。这会找到您的空查询字符串。在第一个括号之间,我们说明字符串以&符号或文字问号开头(反斜杠使得后面的字符文字,在这种情况下 - 否则问号具有不同的含义)。在方括号之间,我们说匹配来自az,或连字符-
或下划线_
的任何字符,然后立即加号+
表明我们应该匹配任何前面的字符中的任何一个或多次。等号=
就是它的样子(查询字符串名称与其值之间的等于)。最后,在下一个括号之间,我们有一个超前条款?=
,它表明下一个字符必须是&符号或行的最后一行,如美元符号$
所示。这里的意图是,如果查询字符串后面跟着另一个查询字符串的开头或行没有包含值,那么它将被视为匹配。(.*)$ [NC]
只是匹配空查询字符串后面的所有内容,而[NC]
子句意味着这是cASe iNsENsiTIve。 RewriteRule .* \/formpage?%1%2 [R,L,NE]
是我们告诉mod_rewrite如何处理匹配内容的地方。基本上将URL重写为您的页面名称,遵循整个查询字符串,除了匹配的空字符串。因为这将循环遍历您的URL,直到它停止找到匹配项为止,如果您有一个空值或50,则无关紧要。它应该发现它们并且仅保留使用值提交的参数。重写规则中的[NE]
子句意味着字符将不进行URL编码 - 如果您期待特殊字符,这可能对您有用,也可能没有用(但您显然需要清理$ _GET数据,当你进行处理时,无论如何都应该这样做。)
再次 - 这显然是使用mod_rewrite的Apache解决方案。如果您在其他操作系统(例如Windows服务器)上运行,则需要相应地进行调整。
希望对某人有用。
答案 3 :(得分:2)
使用JQuery:
$('#form').submit(function (e) {
e.preventDefault();
var query = $(this).serializeArray().filter(function (i) {
return i.value;
});
window.location.href = $(this).attr('action') + (query ? '?' + $.param(query) : '');
});
说明:
.submit()
挂接到表单的submit
事件e.preventDefault()
阻止表单提交.serializeArray()
为我们提供了将要发送的查询字符串的数组表示形式。.filter()
删除该数组中的虚假(包括空)值。$.param(query)
创建更新后的数组的序列化且符合URL的表示形式window.location.href
发送请求另请参阅this solution。
答案 4 :(得分:1)
使用jQuery:
$('form[method="get"]').submit(function(){
$(this).find(':input').each(function() {
var inp = $(this);
if (!inp.val()) {
inp.remove();
}
});
});
我用它从我网站上的所有GET表单中删除所有空参数。 :input伪选择器涵盖所有输入,textareas,选择和按钮。
答案 5 :(得分:0)
如果要删除所有所有空输入,可以遍历如下形式的表单输入:
<script type="text/javascript">
$(document).ready(function() {
$("#form1").submit(function() {
$(this).find('input').each(function() {
if($(this).val() == '') {
$(this).remove();
}
});
});
});
</script>