【问题标题】:Submit button not being sent with request when submitting via JavaScript通过 JavaScript 提交时,提交按钮未随请求一起发送
【发布时间】:2016-12-09 17:24:08
【问题描述】:

HTML

<form method='POST' id='signup_form'>
    <label for='email'>E-mail:</label><br />
    <input type='email' name='email' /><br /><br />
    <label for='username'>Username:</label><br />
    <input type='text' name='username' /><br /><br />
    <label for='password'>Password:</label><br />
    <input type='password' name='password' /><br /><br />
    <label for='confirmpassword'>Confirm Password:</label><br />
    <input type='password' name='confirmpassword' /><br /><br />
    <input type='submit' name='signup' />
</form>

JavaScript

const signup_form = document.getElementById('signup_form');

signup_form.addEventListener('submit', function() {
    event.preventDefault();

    let missing_input = false;

    for (let i = 0; i < this.children.length; i++) {
        if (this.children[i].type !== undefined && this.children[i].type !== 'submit')
            if (this.children[i].value === '') {
                missing_input = true;
                break;
            }
    }

    if (!missing_input)
        this.submit();
});

因此,在将表单提交给 PHP 之前,我尝试在我的 JavaScript 中进行一些验证。如果用户尝试提交表单,我会检查输入以查看它们是否为空白,如果其中任何一个为空白,则我不提交表单。该功能运行良好,但是当表单提交时,&lt;input type='submit' name='signup' /&gt; 不会出现在_POST 中。所有其他输入都可以。在我实现事件监听器之前它工作正常。

这是$_POST提交成功后的样子:

Array ( [email] => eric@live.ca [username] => ericsartor [password] => asdasdasd [confirmpassword] => asdasdasd)

我做错了什么吗?如果我删除事件侦听器肯定可以正常工作,但我不明白为什么如果阻止提交按钮包含在请求中...

编辑:感谢 Andre 发布的链接,我找到了解决方案。我发布了自己的答案,但我还不能接受。

【问题讨论】:

  • 没有valuesubmit 这可能就是原因!试试&lt;input type='submit' name='signup' value='Submit' /&gt;
  • 我确实尝试添加一个值,但没有任何区别。事实上,当我删除事件侦听器并像往常一样提交表单时,PHP 会分配一个默认值“提交”来提交看起来的元素。我一直在使用 if (isset($_POST['signup'])) 来检查表单提交,并且在没有明确值的情况下运行良好!

标签: javascript php forms post


【解决方案1】:

我认为它的使用方式更简单:onsubmit='return validaForm(this)'

所以...

<form method='POST' id='signup_form' onsubmit='return validaForm(this)'>
    <label for='email'>E-mail:</label><br />
    <input type='email' name='email' /><br /><br />
    <label for='username'>Username:</label><br />
    <input type='text' name='username' /><br /><br />
    <label for='password'>Password:</label><br />
    <input type='password' name='password' /><br /><br />
    <label for='confirmpassword'>Confirm Password:</label><br />
    <input type='password' name='confirmpassword' /><br /><br />
    <input type='submit' name='signup' />
</form>

    <script>

    var validaForm = function(signup_form) {

        event.preventDefault();

        let missing_input = false;

        for (let i = 0; i < signup_form.children.length; i++) {
            if (signup_form.children[i].type !== undefined && signup_form.children[i].type !== 'submit')
                if (signup_form.children[i].value === '') {
                    missing_input = true;
                    break;
                }
        }

        if (!missing_input) {
            signup_form.submit();
        } else {
            alert('field empty');
        }

    }

    </script>

参考资料:

javascript: validate form before submit?

HTML/Javascript: Simple form validation on submit

get all the elements of a particular form

【讨论】:

  • 那里的第二个链接提供了一个解决方案。我立即致电event.preventDefault(),然后在验证后尝试重新提交表单。这样做的正确方法是仅在我确实检测到问题时才调用event.preventDefault()。这样就解决了!感谢您的参考。我想我在谷歌搜索时没有找到解决方案,因为我确信事件监听器是问题所在,而不是代码本身......
【解决方案2】:

问题是我在错误的时间打电话给event.preventDefault()。我已将我的 JavaScript 更改为:

const signup_form = document.getElementById('signup_form');

signup_form.addEventListener('submit', function() {
    let missing_input = false;

    for (let i = 0; i < this.children.length; i++) {
        if (this.children[i].type !== undefined && this.children[i].type !== 'submit')
            if (this.children[i].value === '') {
                missing_input = true;
                break;
            }
    }

    if (missing_input)
        event.preventDefault();
});

如果我真的发现问题,我只会阻止默认提交。以前,我每次都阻止初始提交,然后在验证所有内容后尝试重新提交。这导致signup 变量没有被传递到请求中。支持 Andre Rodrigues 发布指向另一个提到这一点的问题的链接!

【讨论】:

    【解决方案3】:

    不确定它是否有帮助,但您至少需要像这样将 event 参数传递给回调,否则您将无法访问它:

    signup_form.addEventListener('submit', function(event) {//content})
    

    【讨论】:

    • 根据我的经验,这不是真的。如果在没有传入事件的情况下触发事件,然后执行console.log(event),它仍然可用。我不知道幕后的原因,但似乎event 是事件中始终可用的值之一,类似于this 始终可用的方式。
    • 我刚刚发现 firefox 会阻止全局事件(您正在使用全局事件),这就是为什么我总是不确定的原因。 (请参阅:stackoverflow.com/questions/37367752/…)无论如何,很高兴您找到了解决方案。
    • 问题来了,我只用过 Chrome...吸取教训,总是把事件传进去!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多