可以在JQuery中更改名称/序列化​​输出吗?

时间:2014-09-26 19:27:47

标签: javascript jquery ajax forms

所以,我有一个我通过JQuery / Ajax提交的表单 HTML:

<form id="emailsignup" method="post">
<p><input name="contactfirst_name" placeholder="Your First Name" type="text"> 
<input name="contactemail” placeholder="youremail@address.com" type="text"> 
<button class="btn btn-success btn-large">Sign Me Up</button>
<input name="action" value="ext_addcontact" type="hidden">
<input name="selectedgroupname" value="Website Opt-Ins" type="hidden">
<input name="groupownerid" value="[p:pid]" type="hidden">
<input name="redirect" value="path/to/success.html" type="hidden"> 
<input name="redirect_error" value="path/to/failure.html" type="hidden">

然后通过Javascript传递它 JAVASCRIPT

<script>
$(document).ready(function(){
$("button").click(function(){
$.post("path/to/index.php", $(".emailsignup").serialize());
});
});
</script>

好的,所以这里变得有趣。我需要改变数据序列化的格式,因为服务器正在寻找这个输出:

<击>接触%5Bfirst_name%5D =数据&安培;联系%5Bemail%5D =数据&安培;等等=数据

编辑:服务器正在查找联系后的单词在方括号中 (IE:我需要找到一种方法,在序列化时,输入方括号或它们的字符代码等同于将contactfirst_name转换为联系人[first_name]并将contactemail转换为联系人[email]) - 但是,我不能只重命名名称联系人[ first_name]并联系[email]。这是一个托管在营销自动化平台上的表单,[first_name]和[email]是系统变量,这意味着它们会在页面加载时转换(为什么使用相同的语法,我不知道..超越我。)

所以,我猜我在序列化后尝试使用Javascript插入方括号,但实际上并没有拼写出全名。

更改表单上的NAMES不是一个选项,因为在托管表单的平台中使用未编码的字符(即:contact [first_name],contact [email])触发变量。出于同样的原因,更改我发布的php文件不是一个选项,因为它是一个封闭的平台。

有没有办法在提交之前执行此操作?如果是这样,我在哪里将其插入到我的脚本中以及我通过哪些参数?

在这里的舒适度方面,我从W3Schools和另一个网站上找到的一个例子拼凑了这个脚本 - 除了更换class / id之外,我在Jquery和Javascript中非常新手。有占位符的地方。

3 个答案:

答案 0 :(得分:0)

只需将序列化数据保存到本地var。然后用你需要的钥匙替换钥匙。

var serialized;

serialized = $(".emailsignup").serialize();
serialized = serialized.replace(/contact([^=]+)/, 'contact[$1]');
serialized = encodeURIComponent(serialized);

$.post("path/to/index.php", serialized);

答案 1 :(得分:0)

我假设您无法更改表单字段的名称属性(例如,name =&#34; contactfirst_name&#34; to name =&#34; contact [first_name]&#34;)。

因此,如果您必须在提交时执行此操作,则可以将序列化的帖子数据放入变量中,然后进行一些搜索/替换以将其转换为您想要的方式。

<script>
$(function () {
    $("button").on('click', function () {
        var formData = $('.emailsignup').serialize();

        formData = formData.replace(/contactfirst_name/, 'contact%5Bfirst_name%5D');
        // do more replacing for the other fields like the above...
        $.post("path/to/index.php", formData, function () {
            // do stuff
        });
    });
});
</script>

答案 2 :(得分:0)

所以我觉得自己像个白痴 - 问题是数据是以序列化方式发布的。通过将ID设置到每个字段,然后通过.setAttribute重命名名称,我能够实现我所需要的。我敢肯定这是超级笨重的,可以更简单/更优雅,但嘿,我正在学习:

function quoteRequest() {
var fName = document.getElementById("fname");
var lName = document.getElementById("lname");
var contactEmail = document.getElementById("email");
var productQty = document.getElementById("qty");
var additionalInfo = document.getElementById("additionalinfo");
var product = document.getElementById("product");
var productnum = document.getElementById("productnum");
fName.setAttribute('name', 'contact\[first_name\]');
lName.setAttribute('name', 'contact\[last_name\]');
contactEmail.setAttribute('name', 'contact\[email\]');
productQty.setAttribute('name', 'contact\[qty\]');
product.setAttribute('name', 'contact\[product\]');
productnum.setAttribute('name', 'contact\[productnum\]');
document.getElementById("quoteform").submit();
}