【问题标题】:Hiding form when submitted successfully提交成功时隐藏表单
【发布时间】:2013-07-13 11:03:58
【问题描述】:

我有一个表单,我想在它成功提交后隐藏它并显示一条消息(它已经在工作)。现在唯一的缺点是表单正在被滑动切换,即使它没有正确提交。提交表单时存在一些问题。它工作起来很奇怪。如果不是所有字段都填写,有时它会提交,有时它不会。我觉得php和jquery的配合在这里并不完美。

感谢您的帮助,我已经设法将这段代码放在一起:

PHP:

<?php
      $receip = "office@avehire.co.uk";
      $subj = "Testimonial";
      $bodymsg = "Name: ".$_POST['name']."\n"
                   ."Company: ".$_POST['company']."\n"
                   ."Email: ".$_POST['email']."\n"
                   ."Message: ".$_POST['msg']."\n";

          if(!$_POST['msg'] || $_POST['name'] || $_POST['email']){
                 echo "<h6>Error sending e-mail<h6>";
                 exit;
          }

      $email = $_POST['email'];
      if(mail($receip, $subj, $bodymsg, 'From: Contact <'.$email.'>')){
        echo "<h6>Message sent successfully. Thank you for your feedback.</h6>";
      }
?>

HTML + javascript 元素:

<div id="feedback-form">

    <script>                    
        function submitmyform(){
            data=$('#myform').serialize();
                $.ajax({
                url: "scripts/form-testimonial.php",
                type:'POST',
                data:data,
                async:false,
                dataType:'html',
                success: function(msg){

                    $('#response_goes_here').html(msg);
                    $("#feedback-form").slideToggle(200);
                }
            });

        }
    </script>

    <form action="" id="myform">

        <ul>
            <li>    <label for="name">Name</label>              <input id="namef3" name="name" type="text" placeholder="Name" class="required"/>            
          </li>
            <li>    <label for="email">E-mail</label>           <input id="emailf3" name="email" type="text" placeholder="E-mail" class="required"/>        
          </li>
            <li>    <label for="company">Company</label>        <input id="companyf3" name="company" type="text" placeholder="Company (if applicable)" />   
          </li>
            <li>    <label for="msg">Message</label>            <textarea id="msgf3" name="msg" cols="43" rows="8" placeholder="Your feedback" class="required"></textarea> 
          </li>
        </ul>
        <button type="button" class="submit" onClick="submitmyform();">Send your feedback</button>
    </form>
</div> <!-- id="feedback-form" -->
    <div id="response_goes_here"></div>

和一个验证脚本(抱歉,它很长,我知道):

$(function () {
var addErrorMessage = function (field) {
    var err = $(document.createElement('p')).addClass('validation-error').text('Required field');
    field.addClass('err').after(err);
},
clearError = function () {
    var t = $(this);
    if (t.hasClass('err')) {
        t.removeClass('err');
        t.next('p').empty().remove();
    }
},
isEmpty = function (str) {
    return str.trim().length < 1;
},
isValidEmail = function (str) {
    var regexp = /^([a-zA-Z0-9_\.\-\+])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
    return regexp.test(str);
},
fieldsValidate = false;

function validateForm(e) {
    console.log('validate start');
    var requiredFields = jQuery(e).find('.required');
    var email = jQuery(e).find('input[name="email"]');
    var emailValue = email.val();
    console.log(emailValue+' mail val');
    fieldsValidate = true;
    // check that required fields are not empty
    requiredFields.each(function () {
        var t = $(this);
        if (isEmpty(t.val())) {
            fieldsValidate = false;
            if (!t.hasClass('err')) {
                addErrorMessage(t);
            }
        }
    });

    // check that email is valid
    console.log(isValidEmail(emailValue) + ' valid?');

    if (!isValidEmail(emailValue)) {
        fieldsValidate = false;
        if (!email.hasClass('err')) {
            addErrorMessage(email);
            console.log('mail NOT ok');
        }
    }
    console.log(fieldsValidate + ' before return');
    return fieldsValidate;
};

$('input, textarea').blur(clearError);

$(".submit").click(function() { return validateForm(this.form) });

我做了一个jsFiddle,但它不包含实际的 php(我不知道我在 jsFiddle 中使用 php。

所以问题出在哪里:使用此页面上的表格:demo page(请向下滚动并单击添加新证明 - 出现以下问题:

  1. 在未填写所有字段并单击提交后 - 它会向上滑动表单(我希望它仅在正确填写表单时向上滑动)

  2. 当我删除 slideToggle 脚本时 - 即使它没有正确填写并且您再次单击添加新的 TSTIMONIAL... 以发送此表单并且不会填写它,然后它将发送实际消息(空),因此它忽略了验证表单。要测试此实例,请在 msg 字段中添加任何内容,并将其他内容留空。在点击提交按钮几次后,它将忽略它们并发送表单。

可能是什么原因?问题出在哪里?奇怪的情况,难以用更简单的方式解释。感谢您对此的支持。

【问题讨论】:

  • 它在这里正确地进行了验证!有什么问题?
  • 它确实验证正确,直到我在 html 上添加 php + jquery。验证脚本本身可以正确验证。演示网站提出了这个问题。脚本本身对我来说看起来不错。不知道出了什么问题。

标签: php jquery forms validation slidetoggle


【解决方案1】:

代替

 echo "<h6>Message sent successfully. Thank you for your feedback.</h6>";

试试

echo "sent";

然后在你的 jquery 脚本中:

success: function(msg){
               if(msg == 'sent'){
                        $('#response_goes_here').html('Message sent successfully. Thank you for your feedback.');
                        $("#feedback-form").slideToggle(200);
                    } else {
                     $('#response_goes_here').html('Error. Mail not sent!');
                   }

}

还有这个

 if(!$_POST['msg'] || $_POST['name'] || $_POST['email']){
                 echo "<h6>Error sending e-mail<h6>";
                 exit;
          }

每次完成姓名或电子邮件时都会返回错误:D。试试

if(empty($_POST['msg']) || empty($_POST['name']) || empty($_POST['email'])){
   echo "<h6>Error sending e-mail<h6>";
                     exit;
}

【讨论】:

  • 谢谢。我已经尝试过了,但它实际上并没有滑动表单,由于某种原因也没有发送它。也不显示发送成功的消息消息....
  • 调整代码。 msg 是 php 脚本返回的消息。你必须检查一下。在你的位置,我会创建一个函数,而不是 php 中的 echo,我会返回 true 或 false,我会检查 msg === true, (div id).html(my long message);其他等,或者,只需将 echo 中的内容替换为“工作”之类的内容,更容易验证。不明白的话我写个代码示例试试
  • 如果你能写个代码我就明白了,不知道你的意思。谢谢你的帮助。
  • 感谢这似乎工作 - 几乎。这里的问题是它会保留错误消息,即使一切正常。发送电子邮件时也不会滑动切换。但几乎就在那里。谢谢
  • 随时欢迎您。如有其他问题,您可以随时与我联系 :)
【解决方案2】:

有很多错误:

$(function () { 替换为(function ($) {

不要在点击按钮时拨打submitmyform

替换

<button type="button" class="submit" onClick="submitmyform();">Send your feedback</button>

<button type="button" class="submit">Send your feedback</button>

不要在按钮点击时进行验证,而是调用表单提交并在提交处理程序中进行验证。如果表格有效,请致电submitmyform。由于表单将使用 ajax 提交,提交处理程序将始终返回 false。为此,请替换以下代码:

$(".submit").click(function() { return validateForm(this.form) });

使用以下代码并尝试:

$(".submit").click(function() { 
    $("#myform").submit();
});

$("#myform").submit(function() {
    if (validateForm(this)) {
        console.log('valid');
        submitmyform();
    } else {
        console.log('invalid');
    }
    return false;
});

更新的 PHP 代码:

if (empty($_POST['msg']) || empty($_POST['name']) || empty($_POST['email'])) {
    echo "<h6>Error sending e-mail<h6>";
    exit();
}
$receip = "office@avehire.co.uk";
$subj = "Testimonial";
$bodymsg = "Name: " . $_POST['name'] . "\n"
        . "Company: " . $_POST['company'] . "\n"
        . "Email: " . $_POST['email'] . "\n"
        . "Message: " . $_POST['msg'] . "\n";

$email = $_POST['email'];
if (mail($receip, $subj, $bodymsg, 'From: Contact <' . $email . '>')) {
    echo "<h6>Message sent successfully. Thank you for your feedback.</h6>";
} else {
    echo "<h6>Error occurred while sending email.</h6>";
}

【讨论】:

  • 不幸的是不起作用。不显示任何消息。当我再次单击发送时,即使所有字段都已填写,它也会显示“发送电子邮件错误”。 :( 我已经按照您的建议进行了所有替换 @manoj.admlab 但不幸的是没有工作。
  • 由于PHP 代码中的错误,您总是收到“发送电子邮件错误”,请回答PHP 代码的更新
猜你喜欢
  • 2021-05-22
  • 1970-01-01
  • 1970-01-01
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多