Javascript 表单未拾取更新的字段值
我试图在发送表单之前使用PGP Javascript API对表单进行加密。 PGP部分可以工作,但表单不发送表单字段的js修改值 下面是Javascript:Javascript 表单未拾取更新的字段值,javascript,html,forms,Javascript,Html,Forms,我试图在发送表单之前使用PGP Javascript API对表单进行加密。 PGP部分可以工作,但表单不发送表单字段的js修改值 下面是Javascript: <script> function encryptForm() { var password = document.getElementById("form_password"); var email = document.getElementById("for
<script>
function encryptForm() {
var password = document.getElementById("form_password");
var email = document.getElementById("form_email");
email.setAttribute("type", "hidden");
password.setAttribute("maxlength", "2000");
password.setAttribute("type", "hidden");
var form = document.forms[index];
var password = form.elements["password"];
var email = form.elements["password"];
encrypt(email.value).then(function(encrypted_msg) {
email.value = encrypted_msg;
});
encrypt(password.value).then(function(encrypted_msg) {
password.value = encrypted_msg;
});
form.submit();
return true;
}
function encrypt(msg) {
if (msg.indexOf("-----BEGIN PGP MESSAGE-----") !== -1 && msg.indexOf("-----END PGP MESSAGE-----") !== -1) {
return msg;
} else {
var key = `<?php printf($eassec->getPubkey('server')); ?>`;
var publicKey = openpgp.key.readArmored(key).keys[0];
return openpgp.encryptMessage(publicKey, msg).then(function(pgpMessage) {
return pgpMessage;
});
}
}
</script>
函数encryptForm(){
var password=document.getElementById(“form_password”);
var email=document.getElementById(“form_email”);
setAttribute(“类型”、“隐藏”);
setAttribute(“maxlength”、“2000”);
setAttribute(“类型”、“隐藏”);
var form=document.forms[索引];
var password=form.elements[“password”];
var email=form.elements[“password”];
加密(email.value)。然后(函数(加密的消息){
email.value=加密消息;
});
加密(password.value)。然后(函数(encrypted_msg){
password.value=加密消息;
});
表单提交();
返回true;
}
函数加密(msg){
if(msg.indexOf(“----开始PGP消息------”)!=-1&&msg.indexOf(“----结束PGP消息------”)!=-1){
返回味精;
}否则{
var键=``;
var publicKey=openpgp.key.readArmocrated(key.key)[0];
返回openpgp.encryptMessage(公钥,消息)。然后返回(函数(pgpMessage){
返回pgpMessage;
});
}
}
以及表单元素:
<form onSubmit="return encryptForm()" class="EASboxForm" method="post">
<input id="form_email" name="email" type="email" placeholder="email adress" required autofocus>
<input id="form_password" name="password" type="password" placeholder="password" maxlength="72" required>
<input name="action" type="hidden" value="connect">
<input type="image" class="EASboxFormSend" src="resources/pics/icons/form_continue.svg" alt="Continue">
</form>
(您可以在[REDACTED]进行现场测试)-如果发送的数据不是有效的PGP消息,PHP部分将显示一条错误消息,如果一切正常,则会显示哈希密码和电子邮件)由于encrypt()
是一个异步函数,您必须等待它完成后再提交表单。您可以使用等待多个承诺完成
Promise.all([encrypt(email.value).then(function(encrypted_msg) {
email.value = encrypted_msg;
}),
encrypt(password.value).then(function(encrypted_msg) {
password.value = encrypted_msg;
})
]).then(function() {
form.submit();
});
您还需要从encryptForm()
函数中返回false
,以防止正常表单提交。由于encrypt()
是一个异步函数,您必须等待它完成后再提交表单。您可以使用等待多个承诺完成
Promise.all([encrypt(email.value).then(function(encrypted_msg) {
email.value = encrypted_msg;
}),
encrypt(password.value).then(function(encrypted_msg) {
password.value = encrypted_msg;
})
]).then(function() {
form.submit();
});
您还需要从
encryptForm()
函数中返回false
,以防止正常表单提交。我可以看到,函数encrypt
根据您的实现是一个异步函数。但是javascript的执行流程是自上而下的。当代码到达submit时,值可能未准备就绪。因此,您可能需要稍微更改程序的流程,如下所示
encrypt(email.value).then(function(encrypted_msg) {
email.value = encrypted_msg;
encrypt(password.value).then(function(encrypted_msg) {
password.value = encrypted_msg;
form.submit();
});
});
我所看到的是,
函数encrypt
根据您的实现是一个异步函数。但是javascript的执行流程是自上而下的。当代码到达submit时,值可能未准备就绪。因此,您可能需要稍微更改程序的流程,如下所示
encrypt(email.value).then(function(encrypted_msg) {
email.value = encrypted_msg;
encrypt(password.value).then(function(encrypted_msg) {
password.value = encrypted_msg;
form.submit();
});
});
您可以使用客户端JavaScript进行加密,但安全性不高。当然不安全,因为您不会等到加密完成后再发送。您可以使用客户端JavaScript进行加密,但安全性不高。当然不安全,因为您不会等到加密完成后才发送。我可以在字段中看到加密的数据并不意味着表单有足够的时间处理它们?(仍然不起作用)不,它不起作用
form.submit()
在任何更改之前立即发生。您看到的是,浏览器在等待服务器处理提交时更新了显示。它仍然以清晰的方式发送所有内容。我复制了你的密码。有什么不对劲吗/你能提供一个到加密API的链接,这样我就可以尝试创建一个提琴了吗?我刚刚注意到你在encryptForm()
函数的末尾有return true
。将其更改为returnfalse
以防止正常表单提交。我可以在字段中看到加密数据并不意味着表单有足够的时间处理它们?(仍然不起作用)不,它不起作用form.submit()
在任何更改之前立即发生。您看到的是,浏览器在等待服务器处理提交时更新了显示。它仍然以清晰的方式发送所有内容。我复制了你的密码。有什么不对劲吗/你能提供一个到加密API的链接,这样我就可以尝试创建一个提琴了吗?我刚刚注意到你在encryptForm()
函数的末尾有return true
。将其更改为returnfalse代码>以防止正常表单提交。在提交表单之前,能否在form.sumbit()处设置断点并检查电子邮件和密码的值?如何执行此操作?^ ^您使用什么浏览器进行测试?。如果是Chrome,那么转到开发者工具并从源代码中选择您的js。设置断点并执行代码。当执行到达form.submit的断点时,请检查电子邮件和密码的值。Firefox开发版,实际上它告诉我参数列表后面的“SyntaxError:missing”:function encrypt(msg){怎么回事?你能在form.sumbit()上设置断点吗在提交表单之前,检查电子邮件和密码的值如何做?^^'您使用什么浏览器进行测试?。如果是Chrome,则转到开发工具并从源代码中选择您的js。放置断点并执行代码。当执行到达form.submit的断点时,检查电子邮件和密码的值rd.Firefox开发版,实际上它在以下行告诉我“SyntaxError:missing)after参数列表”