【问题标题】:Form's input type="submit" does not seem to trigger the onsubmit handler表单的输入 type="submit" 似乎没有触发 onsubmit 处理程序
【发布时间】:2013-03-20 09:45:30
【问题描述】:

我正在尝试通过 onsubmit 触发 javascript 函数来验证我的表单。

我知道该函数本身可以工作,因为我可以在表单标记之后立即在脚本标记中调用它,并且我收到了我的 console.log 消息,并且它创建的错误消息出现在表单上。

PHP 验证本身有效,但我只能通过放置在 div 上的 javascript .submit 实际提交表单。显然,因为这绕过了任何客户端验证,所以我不能这样,因此我用input type="submit" 替换了我的div id="submit"

我一直在查看其他示例,包括我过去自己编写的、我知道有效但似乎完全没有答案的表格。这可能非常容易,并且由于某种原因,在过去的 6 个小时里我无法也无法看到它。 o_O

这是我的表单标记:

<form name="emailus" id="emailus" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" onsubmit="return validateForm();">
    <a href="mailto:example@email.com">
        <h3><i class="icon-envelope-alt icon-large"></i>Send us an email<span>: example@email.com</span></h3>
    </a>

    <div class="half">
        <fieldset class="name">
            <label for="cf_name"><h4>Name <span>*</span></h4></label>
            <input type="text" name="cf_name" class="textualformfield" alt="Jane Doe" pattern="^[a-zA-Z'\s]+$">
        </fieldset>
        <fieldset class="emailaddress">
            <label for="cf_email"><h4>E-mail <span>*</span></h4></label>
            <input type="text" name="cf_email" class="textualformfield" alt="janedoe@email.com" pattern="{long string of regex}">
        </fieldset>
        <fieldset class="phonenumber">
            <label for="cf_phonenumber"><h4>Phone</h4></label>
            <input type="tel" name="cf_phonenumber" class="textualformfield" alt="555-555-5555">
        </fieldset>
        <fieldset class="eventdate">
            <label for="cf_eventdate"><h4>Event Date</h4></label>
            <input type="text" name="cf_eventdate" class="textualformfield" alt="May 25th, 2012">
        </fieldset>
        <fieldset class="location">
            <label for="cf_location"><h4>Location</h4></label>
            <input type="text" name="cf_location" class="textualformfield" alt="The Church">
        </fieldset>
    </div>

    <div class="half">
        <textarea name="cf_message" class="textualformfield" alt="Your Message"></textarea>
    </div>

    <input type="submit" for="emailus" name="submit" id="submit" value="Submit">
</form>

我尝试了几种不同的onsubmit="return validateForm();" 迭代——有或没有分号,写成onSubmitonsubmit...我不知道。我根本看不出这有什么问题。有人吗?

下面是要调用的函数onsubmitvalidateForm。它位于另一个文件中,但该文件始终包含在表单中,并且我已确保此函数不在 $(document).ready 内,并且可以全局使用,因为我在脚本标签中直接在表单之后调用它.

var validateForm = function() {
    var valid = true;

    jQuery('p.validationhelpers').remove();

    if (document.emailus.cf_email.value == "" || document.emailus.cf_email.value == "janedoe@email.com") {
        jQuery('.emailaddress').append("<p class='validationhelpers'>Please enter an email address.</p>");
        jQuery('.emailaddress>input').focus();
        valid = false;
    }

    if (document.emailus.cf_name.value == "" || document.emailus.cf_name.value == "Jane Doe") {
        jQuery('.name').append("<p class='validationhelpers'>Please enter your name.</p>");
        jQuery('.name>input').focus();
        valid = false;
    }
    console.log("I was triggered");

    return valid;
}

编辑 2:添加 PHP 验证/邮政编码:

<?php if (!empty($_POST) ) { 
    $field_name = $_POST['cf_name'];
    $field_email = $_POST['cf_email'];
    $field_phone = $_POST['cf_phonenumber'];
    $field_eventdate = $_POST['cf_eventdate'];
    $field_location = $_POST['cf_location'];
    $field_message = $_POST['cf_message'];

    $mail_to = 'example@email.com';

    //final attempt at validation or email submission preventation
    if ($field_name == "Jane Doe" || empty($field_name) || $field_email == "janedoe@email.com" || empty($field_email)) {
        return false;
    }


    if (!($field_eventdate == "May 25th, 2012") && !empty($field_eventdate) && !($field_name == "Jane Doe") && !empty($field_name)) {
        $subject = 'Request for '.$field_date. ' from '.$field_name . 'via thiswebsite.com';
    } else {
        $subject = $field_name . ' has contacted you via thiswebsite.com';
    }

    if (!($field_name == "Jane Doe") && !empty($field_name)) {
        $body_message = 'Client\'s Name: '.$field_name."\n\n";
    }
    if (!($field_email == "janedoe@email.com") && !empty($field_email)) {
        $body_message .= 'E-mail: '.$field_email."\n\n";
    }
    if (!($field_phone == "555-555-5555") && !empty($field_phone)) {
        $body_message .= 'Phone: '.$field_phone."\n\n";
    }
    if (!($field_eventdate == "May 25th, 2012") && !empty($field_eventdate)) {
        $body_message .= 'Event Date: '.$field_eventdate."\n\n";
    }
    if (!($field_location == "The Church") && !empty($field_location)) {
        $body_message .= 'Location: '.$field_location."\n\n";
    }
    if (!($field_message == "Your Message") && !empty($field_message)) {
        $body_message .= 'Message: '. "\n".$field_message;
    }

    $headers = 'From: '.$field_email."\r\n";
    $headers .= 'Reply-To: '.$field_email."\r\n";

    $mail_status = mail($mail_to, $subject, $body_message, $headers);

    $body_message = stripslashes($body_message);

    if ($mail_status) { ?>
        <script language="javascript" type="text/javascript">
            jQuery(document).ready(function () {
                jQuery('#contactus').before("<hr class='confirmationhelpers'><p class='confirmationhelpers'>Your e-mail has been sent!<br/>Thank you! We'll contact you shortly.</p><hr class='confirmationhelpers'>");
            });
        </script>
    <?php
    }
    else { ?>
        <script language="javascript" type="text/javascript">
            jQuery(document).ready(function () {
                alert('It seems there\'s been an error. Please, send an email to example@email.com to request your appointment.');
            });
        </script>
    <?php
    }
}

?>

明确一点——当我点击提交按钮时,绝对没有任何反应。

【问题讨论】:

  • 你能在 submit() 上发表你的文章吗
  • 尝试在onsubmit 值上删除return 的使用,只需输入validateForm(),或者更好的是:validateForm(); return false;,以防前者不返回真值或假值价值。顺便问一下,提交输入上for有什么用?
  • 确保您的 validateForm() 在成功验证时返回 true
  • 首先删除输入[type=submit]中的for属性,下一步应该检查javascript代码,但请确保没有任何javascript命令阻止提交,因为您期望提交。
  • @javapirate 是 validateForm 函数,你想让我发布什么?还是您指的是 PHP 的部分?

标签: javascript html forms validation onsubmit


【解决方案1】:

您的 jQuery 阻止了此处的表单提交:

//this hides the contact form if the overlay is clicked. children is there to prevent the children from also having this effect.
    $('.overlay_vertical_align').click(function() {
        $('.grey_overlay').fadeOut('slow');
    }).children().click(function(e) {
        return false;
    });

我的意思是,当我调试您的网站并按下提交按钮时,我到达了上面的return false;,之后事件处理就结束了。

【讨论】:

  • 另外,如果您希望您的 validateForm 函数能够防止提交无效表单,它必须onsubmit="return validateForm()"
  • 你先生,中奖了。请问您是如何将其调试到该级别的?您使用的是什么浏览器或工具?感谢您让我走上正轨。
  • @aminimalanimal 我使用了 Chrome 的开发者工具 (Ctrl+Shift+I),脚本调试器位于“源”视图中。我稍微喜欢 Internet Explorer 的开发人员工具 (F12) 来逐步调试 JavaScript 代码,但在这种情况下,页面甚至不会加载 (IE8/XP) - 除了能够在每个浏览器中调试脚本很方便。所以我暂停了所有脚本的执行,然后点击了提交按钮,然后单步执行了代码(jQuery 内部不容易理解,所以我只是按了单步执行,直到最终到达您的代码)。
  • 非常酷。我还没有弄清楚如何使用该窗格。是的......弄清楚IE发生了什么是我在这个之后要解决的任务。 O_o(虽然我猜这与我使用的样板有关。)谢谢。
【解决方案2】:

没有发生任何事情的原因是您使用了新的 html5 'pattern' 属性,该属性试图在输入到达您的验证功能之前对其进行正则表达式验证。删除模式属性,然后重试。

【讨论】:

  • 嗯...不错的猜测,但我刚刚删除了它,但似乎并非如此。我之前也成功地使用了 pattern 属性和 javascript 验证,它似乎并没有妨碍它,尽管我记得它在某些时候是先例。
猜你喜欢
  • 2013-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-10
  • 2017-08-24
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多