与.serialize()和.serializeElements()混淆

时间:2009-08-16 19:52:22

标签: javascript prototypejs

我目前在ajax请求中使用form.serialize()来提交联系表单,但我的问题是form.serialize()抓取所有表单元素,包括“按钮”。

示例表单:

name (input type = text)
email (input type = text)
body (text area)
submit (input type = button)
clear (input type = reset)

我只想序列化不属于BUTTON,RESET或PASSWORD类型的表单元素。

有一个简单的解决方案吗?

2 个答案:

答案 0 :(得分:3)

我希望如果省略按钮输入上的name参数,按钮将不会被序列化。我的期望是基于这样一个事实,即序列化应该模仿表单在提交时序列化的方式,而没有名称的输入不会作为表单参数发送。我编写了一个简单的测试,似乎表明了这一点。单击“检查”按钮,您将获得“text = bob”。切换一个复选框,你会得到“cb2 = on& text = bob”。永远不会包含提交按钮值。

<script type="text/javascript">
    $(document).observe('dom:loaded', function() {
        $('btn').observe('click', function() {
            alert($('form').serialize());
            return false;
        });
    });
</script>
</head>
<body>
<form id='form'>
Checkbox 1 <input type="checkbox" id="cb1" name="cb1" />
Checkbox 2 <input type="checkbox" id="cb2" name="cb2" /><br />
<input type='text' name='text' value='bob' />
<input type="submit" id="btn" value="Examine" />
</form>

答案 1 :(得分:0)

这是一个疯狂的猜测,可能不是唯一的解决方案,但我正在考虑的一种方式是:

在代码中,类似这样的事情可能会:

Form.serializeElements(
    // We need the list of all elements
    // that are not rejected by the inner function
    $('YOUR_FORM_ID').getElements().reject(function (formElement) {
        // this function must return :
        //   - true for an element that you want to keep
        //   - false for an element you don't want to keep (you have to return false for your buttons, for instance)
        if (formElement.type == 'radio' || formElement.type == 'checkbox') {
            return false;
        } else {
            return true;
        }
    })
);

输出(你当然想把它捕获到一个变量中),是这样的:

"lol=15&dt=0"

和/或如果您想获取哈希/对象而不是查询字符串,则可以使用Form.serializeElements的第二个可选参数。


注意:对于这个例子,我没有过滤掉你指定的元素:我用来测试的表单并不完全符合你的要求,所以我过滤掉了其他一些东西..

因此,您必须调整函数中的条件。


希望这有帮助;玩得开心!