【问题标题】:How do I make this contact form interactive and reflect information?如何使此联系​​表具有交互性并反映信息?
【发布时间】:2018-11-05 19:37:21
【问题描述】:

如何使这个 HTML 联系表单具有交互性?

<!-- Contact Us Form -->
<div class="contact_form_container">
  <form id="reply_form" action="send.php" method="POST">
    <div>
      <input id="contact_form_name" class="input_field contact_form_name" type="text" name="name" placeholder="Name" required="required" data-error="Name is required.">
      <input id="contact_form_email" class="input_field contact_form_email" type="email" name="email" placeholder="E-mail" required="required" data-error="Valid email is required.">
      <input id="contact_form_subject" class="input_field contact_form_subject" type="text" name="subject" placeholder="Subject" required="required" data-error="Subject is required.">
      <textarea id="contact_form_message" class="text_field contact_form_message" name="message" placeholder="Message" rows="4" required data-error="Please, write us a message."></textarea>
    </div>
    <div>
      <button id="contact_form_submit" type="submit" class="contact_submit_btn trans_300" value="Submit">
                                        send<img src="images/arrow_right.svg" alt="">
                                    </button>
    </div>

  </form>

</div>

我希望通过 PHP 脚本将用户输入的信息发送给我,但我不确定该 PHP 脚本会是什么样子。

成功提交后,我希望在页面上显示用户名(即“感谢您提交 Joe,我们会尽快回复您!”) .

【问题讨论】:

    标签: javascript php html


    【解决方案1】:

    这实际上对初学者来说并不容易。一种方法是使用 AJAX(JavaScript 客户端向服务器发出的请求)。

    不久前,我编写了一个 AJAX 函数,它处理 AJAX 调用的执行,并将所需的参数发送到服务器。该请求由一个将返回数据的 PHP 文件接收。然后,JavaScript 可以在回调函数中使用此数据。

    以下函数使用 GET 运行 AJAX 调用,允许我们将参数 (object) 发送到文件 (string) 并在请求结束时启动回调 (function)。

    function ajax(file, params, callback) {
    
      var url = file + '?';
    
      // loop through object and assemble the url
      var notFirst = false;
      for (var key in params) {
        if (params.hasOwnProperty(key)) {
          url += (notFirst ? '&' : '') + key + "=" + params[key];
        }
        notFirst = true;
      }
    
      // create a AJAX call with url as parameter
      var xmlhttp = new XMLHttpRequest();
      xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
          callback(xmlhttp.responseText);
        }
      };
      xmlhttp.open('GET', url, true);
      xmlhttp.send();
    }
    

    以下是我们在您的情况下使用它的方式:

    function sendData() {
    
      parameters = {
        name: document.querySelector('#contact_form_name').value,
        email: document.querySelector('#contact_form_email').value,
        subject: document.querySelector('#contact_form_subject').value,
        message: document.querySelector('#contact_form_message').value
      };
    
      ajax('send.php', parameters, function(response) {
        // add here the code to be executed when data comes back to client side      
        // e.g. console.log(response) will show the AJAX response in the console
      });
    
    }
    

    然后在你的文件send.php中你可以放下面的代码来处理AJAX调用发送的url参数。

    if (isset($_REQUEST['name'], $_REQUEST['email'], $_REQUEST['subject'], $_REQUEST['message'])) {
        // they are set, you can use them by accessing $_REQUEST
        // return the desired output with `echo` not `return`!
        echo $_REQUEST['name'] . ', you have sent a message.';
    }
    

    使用上述过程,您无需在 HTML 中使用form。您可以简单地使用input 标签,当然还有button 来启动函数sendData()。使用button的标签中的onclick属性来指定点击按钮时要执行的动作。

    <!-- Contact Us Form -->
    <div class="contact_form_container">
      <input id="contact_form_name" class="input_field contact_form_name" type="text" name="name" placeholder="Name" required="required" data-error="Name is required.">
      <input id="contact_form_email" class="input_field contact_form_email" type="email" name="email" placeholder="E-mail" required="required" data-error="Valid email is required.">
      <input id="contact_form_subject" class="input_field contact_form_subject" type="text" name="subject" placeholder="Subject" required="required" data-error="Subject is required.">
      <textarea id="contact_form_message" class="text_field contact_form_message" name="message" placeholder="Message" rows="4" required data-error="Please, write us a message."></textarea>
    </div>
    <div>
      <button onclick="sendData()" id="contact_form_submit" type="submit" class="contact_submit_btn trans_300" value="Submit">
                                            send<img src="images/arrow_right.svg" alt="">
                                        </button>
    </div>

    返回一个对象而不是字符串:

    您甚至可以使用 PHP,以便它在回调中返回一个实际的 Javascript 对象,而不仅仅是一个字符串。如果您想将各种信息返回给客户端,这将非常有帮助。

    您必须使用内置的 json_encode() 函数来获取 PHP 数组的 JSON 表示。例如:

    $array = array({
    
      'name' => $_REQUEST['name'],
      'subject' => $_REQUEST['subject']
    
    });
    
    echo json_encode($array);
    

    然后在JavaScript里面回调函数使用:

    let obj = JSON.parse(response);
    

    您实际上已将响应转换为 Javascript 对象(不确定它是否是 JSON 对象...,但它是 JavaScript 对象,这很重要)。这意味着您可以访问obj 的属性:例如,obj.name 将具有用户的名称,obj.subject 将具有消息的主题等...

    注意:在这个例子中,我刚刚返回了最初发送到服务器的信息,但是你可以返回任何你想要的。您可以在 PHP 文件中有一个过程来将数据保存到数据库并返回一些其他类型的信息。使用 AJAX 的可能性无穷无尽!

    【讨论】:

    • 很好的答案。感谢分享。
    • @A.Meshu,很乐意提供帮助,我在答案中添加了另一个片段,解释了如何返回一个对象而不仅仅是一个字符串。
    • @Ivan 非常感谢您的详细回答。但是,提交后-PHP脚本返回错误500。
    • @frontendDeveloperlooking4Help,你能给出错误信息的截图吗?我已经更正了 PHP 代码,字符串末尾有一个.
    • @frontendDeveloperlooking4Help 好的,删除 PHP 代码中 ; 之前的行中的 .。我已经更新了答案中的 PHP 代码
    【解决方案2】:

    如果您是初学者并且不想编写任何类型的 PHP 代码,您可以使用像 https://formspree.io/ 或我自己创建的 here 这样的服务。这些非常易于使用,并且不需要您使用任何代码。

    使用我的表单处理程序,您可以使用 GOTO 名称来指定提交表单后页面应重定向到的位置。

    <input class="hidden" type="text" name="GOTO" value="URL">
    

    如果您阅读文档,您可以使用 Formspree 等服务自定义很多内容。因此,您可以创建一个自定义页面,上面写着“感谢您的提交”。

    如果您想真正包含他们提交的表单中的信息,您必须像上面所说的那样创建自己的表单处理程序。

    【讨论】:

      【解决方案3】:

      尝试这样的方式来显示用户名

      if(
      
          !isset( $_POST['name'] ) || empty( $_POST['name'] ) ||
          !isset( $_POST['email'] ) || empty( $_POST['email'] ) ||
          !isset( $_POST['subject'] ) || empty( $_POST['subject'] ) ||
          !isset( $_POST['message'] ) || empty( $_POST['message'] ) ||
      
      )
      
          exit( 'Please fill all fields' )
      
          // or redirect to previous page
      
          // header('Location: ' . $_SERVER['HTTP_REFERER'] . '#error=Please%20fill%all%fields' );
      
      
      
      else{
      
          // Your message saving logic here, save it to a database / file or send it to mail
      
          echo "Thank you for your submission {$_POST['name'}, we will get back to you as soon as possible!";
      
      }
      

      【讨论】:

        【解决方案4】:

        使用 jQuery ajax。

        您的表格:

             <form id="reply_form" action="#" method="POST">
                  <div>
                       <input id="contact_form_name" class="input_field contact_form_name" type="text" name="name" placeholder="Name" required="required" data-error="Name is required.">
                       <input id="contact_form_email" class="input_field contact_form_email" type="email" name="email" placeholder="E-mail" required="required" data-error="Valid email is required.">
                       <input id="contact_form_subject" class="input_field contact_form_subject" type="text" name="subject" placeholder="Subject" required="required" data-error="Subject is required.">
                       <textarea id="contact_form_message" class="text_field contact_form_message" name="message"  placeholder="Message" rows="4" required data-error="Please, write us a message."></textarea>
                  </div>
                  <div>
                       <button id="contact_form_submit" type="button" class="contact_submit_btn trans_300" value="Submit">
                              send<img src="images/arrow_right.svg" alt="">
                       </button>
                  </div>
              </form>
        

        你的 JS:

        $('#contact_form_submit').click(function(){
            $.post('send.php', $('#reply_form').serialize(), function(data, status){
                if(status == "success"){
                    var response_message = data.message;
                    alert(response_message);
                }
            }, "json");
        });
        

        您的 PHP 处理程序 (send.php)

        <?php
           // Response array, it will be returned to client. You cant extend it with additional data.
           $response = ['message' => 'Error'];
        
           $name = $_POST['name'] ?: ""; 
           $email = $_POST['email'] ?: "";
           $subject= $_POST['subject'] ?: ""; 
           $message= $_POST['message'] ?: ""; 
        
        
           if($name) {
                if(filter_var($email, FILTER_VALIDATE_EMAIL)){
                     if($subject){
                          if($message){
                              // do something with form data
        
                              // if success
                              $response['message'] = "Thank you for your submission". $name .", we will get back to you as soon as possible!";
                          }else{
                               $response['message'] = "Message is too short.";
                          }
                     }else{
                          $response['message'] = "Enter subject.";
                     }
                }else{
                     $response['message'] = "Enter valid email.";
                }
           }else{
                $response['message'] = "Enter your name.";
           }
        
           echo json_encode($response); 
           exit();
        
        ?>
        

        重要提示:表单操作 =“#”,按钮类型 =“按钮”。 不要忘记验证您的表单数据。

        【讨论】:

        • 你为什么一定要使用 jQuery?
        • 因为简单的事情很舒服。
        • @СергейВикторович 提交后,脚本返回白页。如何将消息添加到上一页?
        • @СергейВикторович 确实如此,但不建议尚不了解 JavaScript 基础的初学者使用。
        • @frontendDeveloperlooking4Help 您是否更改了“#”的表单操作和“按钮”的按钮类型?
        猜你喜欢
        • 1970-01-01
        • 2018-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多