2014-09-26 30 views
0

所以,我有我通过JQuery/AJAX HTML提交表单:可能在JQuery中更改名称/序列化​​输出?

<form id="emailsignup" method="post"> 
<p><input name="contactfirst_name" placeholder="Your First Name" type="text"> 
<input name="contactemail” placeholder="[email protected]" 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> 

OK,所以这里的地方变得乐趣。我需要改变其中的数据序列化格式的方式,因为服务器正在寻找 这样的输出:

联系人%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文件不是一个选项,因为它是一个封闭的平台。

有任何方式,比如说,beforesubmit做到这一点?如果是这样,我在哪里插入到我的脚本,我通过什么参数?

在这里的舒适度方面,我从W3School和另一个网站上找到的例子拼凑了这个脚本 - 我在Jquery和Javascript中都是新手,除了替换带有占位符的classes/id之外。

回答

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(); 
} 
0

只是将serealized数据保存到本地var。然后用您需要的钥匙替换钥匙。

var serialized; 

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

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

我想你不能改变表单字段的名称属性(例如名称=“contactfirst_name”来命名=“接触[FIRST_NAME]”)。

所以,如果你有这样做的提交,你可以把序列化后的数据到一个变量,然后做一些搜索/替换它转换成你想要的方式。

<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> 
+0

你是对的,不正确。我可以编辑名称属性 - 但是,我实际上不能使用文字名称(联系[first_name],联系[email]) - 任何封装在方括号中的东西,系统,看起来像一个变量,所以在加载时会替换文本与系统中编码的变量。显然它不喜欢我的URI编码字符。我正在研究formData.replace函数,以查看是否有其他方式可以重新插入方括号vs/contactfirst_name /,'contact [first_name]',因为这会在页面加载时转换为'contactValued Customer ”。 – user3366357 2014-09-26 20:51:10

+0

行 - 所以我采用了这种格式,你给了我,并能够成功地使用formData.replace函数添加回我的方括号中,并且它正确显示(hooray)在页面加载。然而,它仍然是失败的,我没有办法从服务器获取特定错误,以查看我出错的地方。执行formData.replaces之后是否可以序列化?我不明白为什么它会有所作为...] – user3366357 2014-09-26 21:28:48